Насколько важно использовать переменную для DateTime. Сегодня, когда речь идет о производительности? - программирование
Подтвердить что ты не робот

Насколько важно использовать переменную для DateTime. Сегодня, когда речь идет о производительности?

Я только что просмотрел этот отмеченный комментарий

IIRC DateTime.Today - довольно дорогостоящий вызов, поэтому сначала лучше сохранить значение в переменной.

Это было в ответ на сообщение, содержащее код:

var first = 
    new DateTime(DateTime.Today.Year, DateTime.Today.Month, 1).AddMonths(-1);
var last = 
    new DateTime(DateTime.Today.Year, DateTime.Today.Month, 1).AddDays(-1);

Если я хочу повысить производительность, важно ли хранить DateTime.Today в переменной вместо того, чтобы называть ее несколько раз? И примерно, сколько использования DateTime.Today оправдывало бы создание переменной для нее?

Изменить: Я понимаю, что должен проверить свою программу, чтобы увидеть, есть ли проблемы с производительностью, прежде чем беспокоиться о чем-то столь же тривиальном, как это. Ради этого вопроса предположим, что я уже сделал это и решил, что необходима дополнительная оптимизация.

4b9b3361

Ответ 1

Benchmark (на моей машине, используя класс секундомера):

10,000 DateTime.Today calls and assignment to local variable: 0.0125781 seconds.

10,000 Assignment only operations: 0.0001062 seconds.

код:

var s = new Stopwatch();
DateTime date = DateTime.Today;
DateTime date2 = DateTime.Today;
s.Start();
for (int i=0; i<10000; i++)
    date = DateTime.Today;
s.Stop();
Debug.Print(s.Elapsed.ToString());

s.Reset();
s.Start();
for (int i=0; i<10000; i++)
    date2 = date;
s.Stop();
Debug.Print(s.Elapsed.ToString());

Ответ 2

насколько важно хранить DateTime.Today в переменной

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

Лучшей причиной для его хранения в переменной является то, что вы можете переходить с одного дня на другой между двумя вызовами.

UPDATE

Чтобы обеспечить порядок величины, @RichardBrown разделил в своем ответе ссылку, указывающую, что стоимость DateTime.Today была проверена на порядок в несколько сотен наносекунд (на конкретном оборудовании, используемом для этого теста).

Ответ 3

Я отвергаю предположение, что DateTime.Today - дорогой звонок. Вы должны хранить его в переменной, если важно, чтобы она не менялась со временем. Если этот код работает около полуночи конца месяца, у вас могут быть проблемы. С точки зрения производительности я очень сомневаюсь, что это будет проблемой.

В любом случае это была бы микро-оптимизация. Как и при любых проблемах с производительностью, если ваша рабочая программа слишком медленная, вы должны ее профилировать и искать разделы, занимающие довольно много времени, и сосредоточьтесь на оптимизации их, ища код, тратящий больше времени на выполнение, чем вы ожидали. Если случается, что эта одна строка кода потребляет много времени, тогда подумайте об изменении ее. До тех пор, только рефакторинг его для правильности или удобочитаемости, а не производительности.

Ответ 4

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

Ответ 5

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

var sw = new Stopwatch();
sw.Start();
today = DateTime.Today();
sw.Stop();
var ts = stopWatch.Elapsed;

Ссылка на секундомер MSDN

Ответ 6

Настоящая причина извлечь DateTime.Today как переменную - предотвратить возможные ошибки, которые будет появляться из-за закона Мерфи, но никогда не будет изолирован и исправлен.

Идея заключается в том, что между первым и вторым использованием Today фактической даты может быть изменено, поэтому вы можете получить, например, предыдущий год и новый месяц здесь:

var first = new DateTime(DateTime.Today.Year, DateTime.Today.Month, 1).AddMonths(-1);

который может возникнуть, например, в (January 2013) - 1 month вместо (December 2013) - 1 month.

Более вероятная и более злая проблема будет, если вы получите изменение даты между first и last присваиванием:

var first = new DateTime(DateTime.Today.Year, DateTime.Today.Month, 1).AddMonths(-1);
var last = new DateTime(DateTime.Today.Year, DateTime.Today.Month, 1).AddDays(-1);

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

Ответ 7

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

если у вас нет проблем с производительностью, я буду следовать правилу "обратите внимание на улучшение производительности"

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