Статичный по сравнению с производительностью метода экземпляра C#

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

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

public static string MethodName(parameters) { }

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

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

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

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

В то время как состояния http://dotnetperls.com/static-method:

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

Я мало смущен который использовать?

19
задан casperOne 30 December 2012 в 04:52
поделиться

4 ответа

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

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

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


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

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

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


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

.
43
ответ дан 30 November 2019 в 02:39
поделиться

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

5
ответ дан 30 November 2019 в 02:39
поделиться

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

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

несколько примеров:

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

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

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

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

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

     String.IsNullOrEmpty (thisstringisnull) // возвращает true
    thisstringisnull.IsNullOrEmpty () // Если бы Microsoft реализовала
     // метод таким образом вы получите
     // NullReferenceException
    

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

2
ответ дан 30 November 2019 в 02:39
поделиться

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

0
ответ дан 30 November 2019 в 02:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: