Подтвердить что ты не робот

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

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

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

public static string MethodName(parameters) { }

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

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

http://bytes.com/topic/c-sharp/answers/231701-static-vs-non-static-function-performance#post947244:

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

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

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

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

4b9b3361

Ответ 1

В вашей первой ссылке указано:

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

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


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

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

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


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

Ответ 2

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

Ответ 3

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

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

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

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

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

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

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

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

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

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

Ответ 4

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