У меня есть немного глобальных методов, объявленных в общедоступном классе в моем веб-приложении ASP.NET.
У меня есть привычка к объявлению всех глобальных методов в общедоступном классе в следующем формате
public static string MethodName(parameters) { }
Я хочу знать, как это повлияло бы на точку зрения производительности?
Состояния http://bytes.com/topic/c-sharp/answers/231701-static-vs-non-static-function-performance#post947244:
потому что, статические методы используют блокировки, чтобы быть Ориентированными на многопотоковое исполнение. Всегда делают внутренне Монитор. Войдите () и Monitor.exit () для обеспечения Потокобезопасности.
В то время как состояния http://dotnetperls.com/static-method:
статические методы обычно быстрее для вызова на стек вызовов, чем методы экземпляра. Существует несколько причин этого на языке программирования C#. Методы экземпляра на самом деле используют 'этот' указатель экземпляра в качестве первого параметра, таким образом, метод экземпляра будет всегда иметь те издержки. Методы экземпляра также реализованы с callvirt инструкцией на промежуточном языке, который налагает небольшие издержки. Обратите внимание на то, что изменение Ваших методов к статическим методам вряд ли поможет многому на амбициозных целях производительности, но оно может помочь крошечному биту и возможно привести к дальнейшим сокращениям.
Я мало смущен который использовать?
В вашей первой ссылке говорится:
Это потому, что статические методы используют блокировки, чтобы быть потокобезопасными. Они всегда выполняют внутренне Monitor.Enter() и Monitor.exit() для обеспечения потокобезопасности
Если добавить к методу [MethodImpl(MethodImplOptions.Synchronized)]
, это утверждение станет частично верным.
Добавление этого атрибута заставит CLR обернуть статические
методы внутри lock(typeof(YourClass))
и методы экземпляра внутри lock(this)
.
Этого следует избегать по возможности
Ваша вторая ссылка верна.
Статические методы немного быстрее, чем методы экземпляра, потому что у них нет параметра this
(таким образом пропускается проверка NullReferenceException
от инструкции callvirt)
Я очень мало беспокоюсь о производительности в этом отношении. В чем действительно полезны статические методы, так это в применении функциональных практик. Например, если вы создаете частный статический вспомогательный метод в своем классе экземпляра, у вас есть разум, зная, что этот метод не может изменять состояние экземпляра.
Я лично всегда выбрал бы подход, который лучше подходит для решения вашей текущей задачи, и написал бы стабильный, читаемый и простой в обслуживании код.
Есть и другие способы улучшить производительность вашего приложения.
несколько примеров:
Если вы хотите использовать простой метод несколько раз без создания экземпляра объекта каждый раз (вспомогательная функция), тогда используйте статический метод в статическом классе.
Если ваш метод обращается к другим переменным в классе и не является потокобезопасным, используйте функцию-член s.
В asp.net, если вы хотите совместно использовать объект в сеансах, или вы можете повысить производительность с помощью метода, который внутренне кэширует результат, статический метод тоже подойдет.
Вы можете смешивать оба способа и использовать фабричный шаблон проектирования, чтобы иметь класс с некоторыми функциями-членами, но вы гарантируете, что всегда существует только один экземпляр за раз.
Иногда статическая функция может избежать глупых ошибок или уменьшить потребность в дополнительных проверках во время выполнения:
String.IsNullOrEmpty (thisstringisnull) // возвращает true
thisstringisnull.IsNullOrEmpty () // Если бы Microsoft реализовала
// метод таким образом вы получите
// NullReferenceException
Но в целом это полностью зависит от текущей задачи. На ваш вопрос нет простого ответа «всегда используйте этот подход ...».
Это в основном выбор дизайна. Если у вас есть логика, которая включает создание экземпляра класса и обновление некоторых свойств, перейдите к методу экземпляра, так как статический метод будет использоваться в экземплярах. Хотя, если у вас есть служебные функции, такие как выполнение некоторых манипуляций со строками, создание строки подключения и т. Д., Которые не связаны с манипуляциями с объектами, используйте статический метод.