C # DateTime стека памяти - PullRequest
2 голосов
/ 16 марта 2011

1) DateTime.Now возвращает новый экземпляр DateTime.

2) DateTime.Subtract возвращает новый экземпляр TimeSpan.

3) DateTime - это структура, которая занимает память в стеке.

4) Когда метод завершается (возвращается), его стековая память восстанавливается.

Следовательно, сохраняет ли следующий код память (при условии, что метод StartTiming находится в том же классе, который содержит Main)?

Код 1:

static Main(){

bool started = true;
static TimeSpan totalTime = TimeSpan.Zero;
static DateTime startTime = DateTime.Now;

while(started){
        // my assumption: every time the method is called, the same memory 
        // in the stack will be reused
        StartTiming();
    }
}

void StartTiming(){
     totalTime = DateTime.Now.Subtract(startTime);   
}

по сравнению со следующим кодом

Код 2:

</p> <pre><code>static Main(){ bool started = true; TimeSpan totalTime = TimeSpan.Zero; DateTime startTime = DateTime.Now; while(started){ // my assumption: every time this stmt is executed DateTime.Now // creates a new DateTime instance and Subtract creates a timespan instance totalTime = DateTime.Now.Subtract(startTime); }

}

Ответы [ 3 ]

3 голосов
/ 16 марта 2011

Возможно, вы обнаружите, что метод StartTiming() в коде 1 был встроен компилятором JIT, поэтому обе версии выдают один и тот же машинный код.

Более того, поскольку метод не принимает никаких параметровстек не используется.

А то, что вы, вероятно, делаете, это преждевременная оптимизация ...; -)

1 голос
/ 16 марта 2011

Вы беспокоитесь о сохранении 0,0015% памяти, используемой стеком.Это даже не абсолютная экономия, память, используемая кадром активации, повторно используется при выходе из метода.Замена локальной переменной статической приводит к получению точного , память для статических переменных не используется повторно.Это займет память на время жизни программы.Статические переменные также являются очень плодотворным источником ошибок, особенно когда вы используете многопоточность.

Плохая идея, повсюду.

1 голос
/ 16 марта 2011

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

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

Затем следует учесть эффекты оптимизации компилятора - то есть, если переменная используется только одним способом после инициализации, компилятор часто оптимизирует эту переменную в IL.

Обратите внимание только на то, что есть оптимизация JIT, которую следует учитывать - как также указал другой ответчик - например, 8 байтов, требуемых для DateTime, могут также быть сопоставлены с регистром ЦП; в этом случае нет «выделения» или «очистки» в первую очередь.

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