Что такое лучший способ рассчитать промежуток времени - PullRequest
4 голосов
/ 29 декабря 2011

В моей программе на c # мое требование состоит в том, чтобы рассчитать временной интервал для выполнения бизнес-логики, который находится внутри цикла foreach. Я должен сохранить промежуток времени.

Я использую следующий код

for (int i = 0; i < 100; i++)
{
    DateTime start= DateTime.Now; 
    // Business logic
    DateTime end= DateTime.Now; 
    TimeSpan time = start.Subtract(end);
    // Save timespan in log file
}

Пожалуйста, исправьте меня, правильно ли я использую код, или мне нужно изменить для повышения производительности и результата.

Ответы [ 4 ]

16 голосов
/ 29 декабря 2011

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

var sw = Stopwatch.StartNew();
// business logic
sw.Stop();
TimeSpan time = sw.Elapsed;
2 голосов
/ 29 декабря 2011

Самый простой способ:

TimeSpan time = DateTime.Now - start;

В качестве альтернативы, вы можете использовать секундомер, который дает более точные результаты.См. http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.aspx о том, как работать с секундомером.

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

Чтобы ответить на ваши последующие вопросы, (1) вы правы, вам не нужно повторно создавать StopWatch каждую итерацию.Вам просто нужно использовать метод перезапуска, например, так:

Stopwatch sw = new Stopwatch();
sw.Start(); // To initialize
for (int i = 0; i < 100; i++)
{
    sw.Restart();
    // Business logic 
    TimeSpan time = sw.Elapsed;
    // Save timespan in log file
}

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

TimeSpan time = sw.Elapsed;
int iSecondsOrMinutes = time.TotalSeconds < 60 ? time.Seconds : (int)time.TotalMinutes;

В этом примере используется Тернарный оператор сохранить целое число на количество минут или секунд.

1 голос
/ 29 декабря 2011

Похоже, вы используете временной интервал для измерения производительности.Ваш код в порядке, однако вы должны знать, что DateTimes очень точны (около 10-15 мс на большинстве машин - см. Раздел «Механизм бесполезного таймера» здесь для объяснения).

DateTimes также не являются смежными;Что если первый DateTime будет получен непосредственно перед переходом на летнее время, а последний - сразу после?Операция, которая занимает одну секунду, может отображаться как час или даже отрицательное время.Даже в UTC все время есть потенциальные проблемы, когда пользователь меняет время вручную, или скачки, вызванные тем, что компьютер засыпает и просыпается, и т. Д.

Лучшей альтернативой будет использование Stopwatch class , который предназначен для такого рода вещей и использует высокоточный таймер внутри (через функцию QueryPerformanceCounter() Win32).

...