Статический Vs Метод экземпляра Производительность C # - PullRequest
19 голосов
/ 10 июня 2010

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

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

public static string MethodName(parameters) { }

IХотите знать, как это повлияет на производительность?

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

http://bytes.com/topic/c-sharp/answers/231701-static-vs-non-static-function-performance#post947244 состояния:

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

Пока http://dotnetperls.com/static-method заявляет:

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

Я не очень понимаю, какой из них использовать

Ответы [ 4 ]

43 голосов
/ 10 июня 2010

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

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

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

Если вы добавите [MethodImpl(MethodImplOptions.Synchronized)] к методу, этот оператор станет частично истинным.

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

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


Ваша вторая ссылка верна.
Статические методы немного быстрее, чем методы экземпляра потому что они не имеют параметра this (таким образом, пропуская проверку NullReferenceException из инструкции callvirt)

5 голосов
/ 10 июня 2010

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

2 голосов
/ 10 июня 2010

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

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

некоторые примеры:

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

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

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

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

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

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

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

0 голосов
/ 10 июня 2010

Это в основном выбор дизайна.Если у вас есть логика, включающая создание экземпляра класса и обновление некоторых свойств, выберите метод экземпляра, так как статический метод будет использоваться всеми экземплярами.Если у вас есть некоторые служебные функции, такие как выполнение каких-либо операций со строками, создание строки подключения и т. Д., Которые не связаны с манипуляциями с объектами, используйте статический метод.

...