Работают ли статические функции C # лучше, чем нестатические функции, помимо сокращения использования памяти? - PullRequest
42 голосов
/ 16 февраля 2010

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

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

Есть ли методы static public или private, обеспечивающие какое-либо повышение производительности помимо сокращения использования памяти?

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

Ответы [ 5 ]

51 голосов
/ 16 февраля 2010

С Статические классы и члены статических классов (Руководство по программированию в C #)

При вызове статического метода генерируется инструкция по вызову в Microsoft промежуточный язык (MSIL), тогда как вызов метода экземпляра генерирует инструкция callvirt, которая также проверяет наличие нулевого объекта ссылки. Тем не менее, большую часть времени разница в производительности между двумя не имеет значения.

24 голосов
/ 16 февраля 2010

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

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

18 голосов
/ 16 февраля 2010

Это немного не по теме, но тем не менее важно.

Выбор методов изготовления статический или экземпляр не должно основываться на времени выполнения (что в любом случае, кажется, не имеет значения).Это должно быть основано на том, работает ли метод на объекте.Например, все методы Math. * Являются статическими, в то время как, например, (большинство) методы String. * Являются экземплярами, поскольку они работают с экземпляром String.Моя личная философия: хороший дизайн должен компенсировать несколько циклов, которые могут быть сохранены в другом месте .

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

Фу, было приятно получить это из моего очага.

1 голос
/ 16 февраля 2010

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

0 голосов
/ 16 февраля 2010

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

...