Могу ли я сократить выделение памяти, передав параметр DateTime по ссылке в С#?

В С# есть ли значительное сокращение распределения памяти при передаче ссылки DateTime как параметра функции, а не передачи ее по значению?

int GetDayNumber(ref DateTime date)

против

int GetDayNumber(DateTime date)

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

Ответ 1

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

Вероятно, что ref предотвращает некоторые оптимизации, такие как размещение DateTime в регистре, что фактически увеличивает использование памяти.

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

Ответ 2

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

Оставьте микро-оптимизацию и сконцентрируйтесь на решении реальных проблем.

Ответ 3

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

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

Ответ 4

Вы могли бы, однако, поскольку 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.

Ответ 5

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

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

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

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