Действительно ли статические методы более эффективны?

С точки зрения памяти и время, лучше сделать метод статичным?

46
задан Jim G. 28 December 2018 в 15:52
поделиться

7 ответов

Обычно да, нет необходимости проходить ссылку «это». Эта ссылка передается в регистр ECX, так что нет дополнительного пространства стека. Регистр уже установлен, если вы сделаете вызов из метода экземпляра того же класса, вообще не будет экономии. Но это может помочь облегчить давление на CRO CPU X86, когда метод находится в другом классе, X86 не имеет много регистров. Видя измеримое совершенное улучшение.

Я делаю религиозно отметьте методы класса, которые не используют элементы экземпляра как статические. Я ценю присущий контракт, предоставленный статическим ключевым словом: «Этот метод не мутирует состояние объекта».

86
ответ дан 26 November 2019 в 20:03
поделиться

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

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

0
ответ дан 26 November 2019 в 20:03
поделиться

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

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

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

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

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

54
ответ дан 26 November 2019 в 20:03
поделиться

Есть много вопросов такого рода. Быстрее/медленнее ли статические методы? Быстрее/медленнее ли виртуальные функции? Является ли i++ быстрее/медленнее чем ++i? Является ли for(;;) быстрее/медленнее чем while(true)?

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

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

Если я могу обобщить, то вещи, которые делают программы медленными, по моему опыту, - это применение строк кода, которые выглядят невинными, но чье потребление времени может быть на порядки больше, чем можно было бы представить. Поскольку они выглядят невинными, их нельзя надежно найти, глядя на код. Примеры: Неоднократно выделяя, инициализируя и перераспределяя большие структуры данных только для того, чтобы убедиться, что они существуют. Интернационализация строк, которые не должны существовать. Программирование в стиле нотификации, которое может превратить простую настройку свойства в массивный каскад вызовов методов по всей большой структуре данных. Простые операции O(n^2), которые никогда не были бы проблемой, за исключением того, что n получило большой размер. Мысль о том, что (a < b) занимает примерно одинаковое время, независимо от того, являются ли a и b интами или большими классами. Это "умножение времени на невинный вид" имеет составной эффект над несколькими слоями абстракции, поэтому, по моему опыту, большое программное обеспечение имеет тенденцию быть загадочным с этим.

3
ответ дан 26 November 2019 в 20:03
поделиться

Разница небрежная в большинстве случаев, но статичность более эффективна.

В статическом способе следует избегать следующих шагов:

  1. Проверка, что ссылка на объект (это) не является нулевым.
  2. Найти правильный метод на таблице Virtual Dispatch.
  3. Размещение ссылки на объект на стек.
1
ответ дан 26 November 2019 в 20:03
поделиться

Если вы все равно пройду в экземпляре ( SomeStaticMethod (OBJ, «ABC», 123); ), то не совсем. Вы можете использовать только статический метод в сценарии без полиморфизма, и в таких случаях весьма вероятно, что любой простой такие вещи, как свойства, были бы включены в любом случае.

Используйте объекты «естественно» ( OBJ.somemethod («ABC», 123); ) - Держите код простой, а Профиль Чтобы найти проблемы с производительностью - это Очень вряд ли будет в разнице между экземпляром и статикой, если только вы не работаете очень плотных петель. Там некоторые сценарии, где это возможно, но они довольно специализированы.

9
ответ дан 26 November 2019 в 20:03
поделиться

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

Метод должен быть статичным, если он не зависит от / изменить объект.

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

Тем не менее, виртуальные методы являются самым быстрым видом динамической динамической отправкой, доступной в C # / ON CLR. Намного быстрее, чем делегаты и отражение.

5
ответ дан 26 November 2019 в 20:03
поделиться
Другие вопросы по тегам:

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