Это хороший способ проверить количество времени, которое потребовалось для запуска некоторого кода в C #? - PullRequest
5 голосов
/ 08 сентября 2010

Что я имею в виду ...

получить время, запустить код, получить время, сравнить время и вывести секунды:

я правильно делаю?1005 *

DateTime timestamp = DateTime.Now;
//...do the code...
DateTime endstamp = DateTime.Now;

string results = ((endstamp.ticks - timestamp.ticks)/10000000).ToString();

Ответы [ 8 ]

13 голосов
/ 08 сентября 2010

Для этого следует использовать Секундомер , например:

var sw = Stopwatch.StartNew();
//...do the code...
sw.Stop();
var result = sw.ElapsedTicks; //ticks it took
//or less accurate/for bigger tasks, sw.ElapsedMilliseconds

Отредактировано для включения улучшения * Брайана из комментариев.

11 голосов
/ 08 сентября 2010

Как отмечали многие, класс высокоточных секундомеров предназначен для ответа на вопрос "сколько времени это заняло?"тогда как класс DateTime предназначен для ответа на вопрос «когда Доктор Кто начинает?»Используйте правильный инструмент для работы.

Однако проблема правильного измерения истекшего времени заключается не только в правильной настройке таймера.Вы также должны убедиться, что вы измеряете то, что действительно хотите измерить.Например, рассмотрим:

// start the timer
M();
// stop the timer
// start another timer
M();
// stop the timer

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

Итак, какое измерение является "правильным"?Первое измерение?Второй?Средний из них? Это зависит от того, что вы пытаетесь оптимизировать для .Если вы оптимизируете для быстрого запуска , тогда вы очень сильно заботитесь о времени работы.Если вы оптимизируете для количество идентичных страниц, обслуживаемых в секунду на прогретом сервере , тогда вам совершенно наплевать на время выполнения и вам следует разрабатывать свои тесты с точностью до , а не Это. Убедитесь, что вы измеряете то, что вы на самом деле оптимизируете.

6 голосов
/ 08 сентября 2010

Нет. Вместо этого используйте класс System.Diagnostics.Stopwatch. DateTime.Now не обладает желаемым уровнем точности (хотя структура DateTime сама по себе достаточно точна).

Stopwatch watch = new Stopwatch();
watch.Start();
// do stuff
watch.Stop();
long ticks = watch.ElapsedTicks;
1 голос
/ 08 сентября 2010

Рекомендации, приведенные в предыдущих ответах, будут работать для простых измерений.Если вам нужно что-то более продвинутое, вы можете использовать профилировщик (есть коммерческие и бесплатные, такие как equatec ).

1 голос
/ 08 сентября 2010

Очевидно, что произвольные процессы, выполняемые на вашей машине, могут исказить полученный вами результат.
Секундомер является хорошим решением, как указано в MSDN:

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

Класс Stopwatch помогает манипулировать счетчиками производительности, связанными с синхронизацией, в управляемом коде.В частности, поле Frequency и метод GetTimestamp можно использовать вместо неуправляемых API-интерфейсов Win32 QueryPerformanceFrequency и QueryPerformanceCounter.

0 голосов
/ 08 сентября 2010

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

Вот статья об этом.

0 голосов
/ 08 сентября 2010

Это, вероятно, нормально, но обратите внимание, что есть несколько способов для «количества времени, которое потребовалось для запуска некоторого кода».То, что у вас есть, это время настенных часов: количество времени, которое прошло в мире между первым и вторым звонками до DateTime.Now (приблизительно).Это будет включать время, потраченное на ожидание блокировок или доступа к диску, время, потраченное на запуск других потоков, не содержащих ваш код, и т. Д.

0 голосов
/ 08 сентября 2010

Лучше использовать класс System.Diagnostics.StopWatch http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.aspx

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