Использование памяти при преобразовании методов в статические методы

Я начал использовать Resharper, и он указал, когда метод можно сделать статическим. Будет ли преобразование нескольких сотен методов в статические увеличивать объем памяти в течение длительного периода времени?


person Ian R. O'Brien    schedule 25.06.2010    source источник


Ответы (2)


Нет — переход на статические методы не влияет на память.

При первой ссылке на тип (будь то статический или нестатический) инициализируются все статические члены и запускаются статические конструкторы.

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

Вам нужно беспокоиться об изменении объема памяти только в том случае, если вы сделаете члены класса статическими. В этом случае статические поля останутся корневыми после доступа к типу и не будут собираться сборщиком мусора. Обычно это делается только при необходимости и по замыслу — вы делаете член статическим, потому что хотите, чтобы он сохранялся.

person Reed Copsey    schedule 25.06.2010
comment
Где-нибудь в памяти хранится копия статического метода? Мое предположение заключалось в том, что когда вы ссылаетесь на статический метод, он будет где-то храниться, а затем каждая последующая ссылка будет использовать этот экземпляр метода, но я понимаю, что это предположение может быть неверным. - person Ian R. O'Brien; 25.06.2010
comment
Методы, как статические, так и методы экземпляра, загружаются в память один раз, когда они переносятся в пространство процесса и компилируются JIT. На самом деле нет никакой разницы в использовании методов между статическими и нестатическими. Сосредоточьтесь на том, подходят ли статические методы в вашем конкретном случае, и используйте это, чтобы определить, должен ли метод быть статическим или методом экземпляра. - person Reed Copsey; 25.06.2010
comment
На память это оказывает очень незначительное влияние, так как генерируется дополнительный код для передачи указателя this методам, которые его не используют. - person Qwertie; 25.06.2010
comment
@Qwertie: этот эффект просто меняет требования к памяти стека во время вызова метода, но не меняет долгосрочный эффект на хранилище памяти. При этом стек предварительно выделяется для каждого потока, поэтому реальные требования к памяти не меняются. ;) - person Reed Copsey; 25.06.2010

С точки зрения компилятора JIT нет никакой разницы между статическим методом и методом экземпляра. Машинный код для них очень похож, он хранится в такой же куче. Единственное отличие состоит в том, что метод экземпляра имеет дополнительный аргумент.

Этот дополнительный аргумент необходимо передать при вызове метода. Это может стоить дополнительной инструкции машинного кода, но не так часто. Регистр ЦП (ECX) часто уже имеет правильное значение. Есть разница, если метод экземпляра имеет более одного аргумента на x86 или более трех на x64, дополнительный аргумент должен быть передан в стек, а не через регистр ЦП. Одна дополнительная инструкция.

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

person Hans Passant    schedule 25.06.2010
comment
Это может выходить за рамки исходного вопроса, но что сохраняется в куче при вызове метода, статического или нет? Это просто сам метод или экземпляр класса, содержащего метод, или что-то еще? Эта память когда-либо собиралась сборщиком мусора? - person Ian R. O'Brien; 25.06.2010
comment
Во время вызова метода в куче ничего не сохраняется. Аргументы передаются через регистры процессора и стек. Ничего не нужно собирать. Книга Петцольда «Кодекс» может вас заинтересовать. - person Hans Passant; 25.06.2010
comment
Хорошо, это имеет большой смысл. Так действительно, единственная причина преобразовать мои методы из нестатических в статические — это получить к ним доступ без создания экземпляра класса? Спасибо за вашу рекомендацию. - person Ian R. O'Brien; 25.06.2010
comment
Причина написания статического метода заключается в том, что ему не нужно ссылаться ни на какие члены экземпляра. Не спешите преобразовывать методы, которые на самом деле должны быть методами экземпляра, это почти не стоит отдачи. Если у вас проблемы с производительностью, сначала измерьте. - person Hans Passant; 25.06.2010