Можно ли уменьшить выделение памяти, передав параметр DateTime по ссылке в c #? - PullRequest
11 голосов
/ 17 февраля 2012

Есть ли в C # какое-либо существенное сокращение выделения памяти при передаче ссылки DateTime в качестве параметра функции по сравнению с передачей ее по значению?

int GetDayNumber(ref DateTime date)

против

int GetDayNumber(DateTime date)

Код внутри функции ни в коем случае не изменяет дату.

Ответы [ 5 ]

15 голосов
/ 17 февраля 2012

A DateTime - это 8-байтовая структура.ref имеет 4 или 8 байтов в зависимости от вашей целевой архитектуры.Таким образом, в лучшем случае вы бы сэкономили 4 байта стековой памяти, что совершенно не имеет значения.

Даже вероятно, что ref предотвращает некоторые оптимизации, такие как помещение DateTime в регистр, таким образом фактически увеличивая объем памятиuse.

Это явный случай преждевременной оптимизации.Не делай этого.

2 голосов
/ 17 февраля 2012

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

Оставьте микрооптимизацию и сосредоточитесь в первую очередь на реальном решении проблем.

1 голос
/ 17 февраля 2012

Я не думаю, что есть какое-то существенное сокращение использования памяти, но я верю, что оно есть.

При передаче datetime с ref не будет создан новый объект datetime, как когдаиспользуйте ключевое слово ref

0 голосов
/ 17 февраля 2012

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

var date = DateTime.Today; // One date time object is allocated and assigned to the stack.
DoSomething(date); // this will result in a second date time object being allocated and assigned to the stack.

private void DoSomething(DateTime date)
{
    // do something with the date time object.
} // As soon as we leave this method, the date time object is removed from the stack as it is now out of scope.
0 голосов
/ 17 февраля 2012

Внутренне значения DateTime представляются в виде числа тактов, которое длинно 64-битного.

64-битному процессору потребуется такое же количество бит для отправки адреса переменной.

Но если вы работаете в 32-битном процессоре, ваш диапазон адресов меньше размера даты и времени.Таким образом, производительность может быть улучшена.

Однако на практике разницу почти никогда не заметят.

...