Статический Метод Vs Instance Производительность C#

У меня есть несколько глобальных методов, объявленных в public class в моем ASP.NET веб-приложение.

У меня есть привычка объявлять все глобальные методы в общедоступном классе в следующем формате

public static string MethodName(parameters) { }

Я хочу знать, как это повлияет на точки зрения производительности?

  1. какой из них лучше? Статический метод или нестатический метод?
  2. почему это лучше?

http://bytes.com/topic/c-sharp/answers/231701-static-vs-non-static-function-performance#post947244 государства:

потому что статические методы используют блокировки для потокобезопасности. Все время сделайте внутренне монитор.Ввод() и монитор.exit() для обеспечения Безопасность потока.

While http://dotnetperls.com/static-method государства:

статические методы обычно быстрее для вызова в стеке вызовов, чем метод экземпляра. Есть несколько причин для этого в C# алгоритмический язык. Методы экземпляра фактически используют "это" указатель экземпляра в качестве первого параметра, поэтому метод экземпляра будет всегда есть накладные расходы. Методы экземпляра также реализованы инструкция callvirt на промежуточном языке, которая накладывает небольшие накладные расходы. Обратите внимание, что изменение методов на static методов вряд ли поможет амбициозные цели деятельности, но это может немного помочь и, возможно, привести к дальнейшим сокращениям.

Я немного запутался, какой из них использовать?

4 ответов


ваша первая ссылка гласит:

это потому, что статические методы, используя замки должны быть потокобезопасными. Всегда делать внутренне монитор.Войти и Монитор.exit () для обеспечения потокобезопасности

это совершенно, ужасно,отвратительно неправильно.


Если добавить [MethodImpl(MethodImplOptions.Synchronized)] методу, что заявление будет отчасти верно.

добавление этого атрибута приведет к тому, что среда CLR обернется static методы внутри lock(typeof(YourClass)) и методы экземпляра внутри lock(this).

это следует избегать, где это возможно


ваша вторая ссылка правильная.
статические методы немного быстрее, чем методы экземпляра, потому что у них нет


Я склонен очень мало заботиться о производительности в этом отношении. Для чего действительно полезны статические методы, так это для обеспечения функциональных практик. Например, если вы создаете частный статический вспомогательный метод в своем классе экземпляра, вы должны знать, что этот метод не может изменить состояние экземпляра.


Я лично всегда выбираю подход, который лучше подходит для решения вашей текущей задачи, и пишу стабильный, читаемый и простой в обслуживании код.

есть и другие способы повысить производительность вашего приложения.

примеры:

  • Если вы хотите использовать простой метод несколько раз без создания экземпляра объекта каждый раз (вспомогательная функция), используйте статический метод в статическом классе.

  • Если метод обращается к другим переменным в классе и не является потокобезопасной функцией-членом.

  • In asp.net если вы хотите поделиться сеансами с объектом или улучшить производительность с помощью метода, который внутренне кэширует результат, статический метод также будет прекрасным.

  • вы можете смешивать оба способа и использовать шаблон проектирования фабрики, чтобы иметь класс с некоторыми функциями-членами, но вы гарантируете, что всегда есть только один экземпляр в время.

  • иногда статическая функция может избежать глупых ошибок и снижает необходимость дополнительных проверок во время выполнения:

    String.IsNullOrEmpty(thisstringisnull)  // returns true
    thisstringisnull.IsNullOrEmpty() // If Microsoft would have implemented
                                     // the method this way you would get a
                                     // NullReferenceException
    

но в целом это полностью зависит от текущей задачи. Нет простого " всегда используйте этот подход...- отвечай на вопрос.


Это в основном выбор дизайна. Если у вас есть логика, которая включает создание экземпляра класса и обновление некоторых свойств, go for instance method as static method будет совместно использоваться экземплярами. Хотя, если у вас есть некоторые функции утилиты, такие как выполнение некоторых манипуляций со строками, создание строки подключения и т. д.. который не включает в себя манипуляцию объектами, перейдите к статическому методу.