Рассмотрим очень простой пример (где SomeObject
класс, а не структура):
class C
{
void MethodCalledMillionsOfTimes()
{
var so = new SomeObject();
// some use of so
}
}
Каждый раз, когда вызывается метод, один новый объект создается на куче. Он должен быть собран мусором некоторое время после того, как его использование закончилось. Это один объект для сбора за вызов метода.
Тогда предположим, что он превращается в:
class C
{
SomeObject soField;
void MethodCalledMillionsOfTimes()
{
soField = new SomeObject();
// some use of soField
}
}
Это ничего не меняет! Вы по-прежнему создаете один новый экземпляр для каждого вызова метода. Сборщик мусора должен выполнять ту же работу.
Но что, если вы сделали:
class C
{
SomeObject soField = new SomeObject();
void MethodCalledMillionsOfTimes()
{
// some use of soField
}
}
На этот раз тот же объект повторно используется каждый раз, когда метод вызывается снова на том же экземпляре. Таким образом, меньше объектов нужно собирать мусор (предполагая, что метод фактически вызывается много раз на том же объекте C
). Обратите внимание, что это может работать только в том случае, если экземпляр SomeObject
может использоваться много раз и не имеет своего состояния «разрушен» при каждом использовании.
Если многие потоки вызывают метод сразу, убедитесь, что объект soField
может справиться с этим.
Если вы идете дальше и сказать:
class C
{
static SomeObject soStaticField = new SomeObject();
void MethodCalledMillionsOfTimes()
{
// some use of soStaticField
}
}
то есть только один объект разделяется между всеми экземплярами C
.No SomeObject
должен быть собран GC.
Однако эта деятельность GC очень часто не важна для вашей работы. Поэтому, пожалуйста, меры, если это важно или нет в вашем случае.
Можете ли вы предоставить образец того, как выглядит метод? – jrbeverly
Вы что-то измеряли? Я бы сказал, что превращение локальных варсов в поля будет медленнее и кошмаром для нарезки. Но это зависит. –
Никаких мер не сделано, и это действительно пронизанный ночным кошмаром, также он может потреблять больше памяти на объект, и это может замедлить распределение первоначального объекта в памяти, но уменьшает ли он генерацию мусора или повышает производительность? используя уже выделенную память для критических по времени методов. – Fadi