Насколько точен System.Diagnostics.Stopwatch? - PullRequest
27 голосов
/ 26 декабря 2008

Насколько точен System.Diagnostics.Stopwatch ? Я пытаюсь сделать некоторые метрики для разных путей кода, и мне нужно, чтобы это было точно. Должен ли я использовать секундомер или есть другое решение, которое является более точным.

Мне сказали, что иногда секундомер дает неверную информацию.

Ответы [ 8 ]

20 голосов
/ 04 марта 2010

Я только что написал статью, в которой объясняется, как выполнить тестовую настройку для получения высокой точности (лучше 0,1 мс) от секундомера. Я думаю, это должно все объяснить.

http://www.codeproject.com/KB/testing/stopwatch-measure-precise.aspx

5 голосов
/ 18 ноября 2015

Класс System.Diagnostics.Stopwatch точно измеряет прошедшее время, но способ, которым работает метод ElapsedTicks, привел некоторых людей к выводу, что он не точен, когда у них действительно просто логическая ошибка в коде. 1001 *

Причина, по которой некоторые разработчики считают, что секундомер не точен, заключается в том, что ElapsedTicks от секундомера НЕ УРАВНЯЕТСЯ с тиками в DateTime. Проблема возникает, когда код приложения использует ElapsedTicks для создания нового DateTime.

var watch = new Stopwatch();
watch.Start();
... (perform a set of operations)
watch.Stop();
var wrongDate = new DateTime(watch.ElapsedTicks); // This is the WRONG value.

При необходимости длительность секундомера можно преобразовать в DateTime следующим образом:

// This converts stopwatch ticks into DateTime ticks.
// First convert to TimeSpan, then convert to DateTime
var rightDate = new DateTime(watch.Elapsed.Ticks); 

Вот статья, которая объясняет проблему более подробно: http://geekswithblogs.net/BlackRabbitCoder/archive/2012/01/12/c.net-little-pitfalls-stopwatch-ticks-are-not-timespan-ticks.aspx

3 голосов
/ 26 декабря 2008

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

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

Если это было синхронизировано со счетчиком высокого разрешения, то он будет с точностью до микросекунд. Это на самом деле с точностью до наносекунд (10-9 секунд, т.е. миллиардная доля секунды), но происходит так много всего другого, что точность наносекунды действительно немного бессмысленна. При выполнении синхронизации или бенчмаркинга кода вы должны выполнить несколько запусков и взять среднее время - из-за других процессов, работающих в Windows, количества выполняемых операций подкачки на диск и т. Д. Значения между двумя запусками могут различаться.

2 голосов
/ 28 ноября 2011

Если вы хотите более точные сроки. Посмотрите на QueryPerformanceCounter. Ссылка MSDN для QueryPerformanceCounter . Аккуратная реализация дана здесь . В этом примере загружается coredll.dll для CE, для Windows следует загрузить Kernel32.dll, как указано в документации MSDN.

2 голосов
/ 18 марта 2010

Класс секундомера возвращает разные значения при различной конфигурации, так как частота зависит от установленного оборудования и операционной системы.

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

Подробнее: http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.aspx

2 голосов
/ 26 декабря 2008

Почему вы не профилируете свой код вместо того, чтобы сосредоточиться на микропроцессорах?

Есть несколько хороших профилировщиков с открытым исходным кодом, таких как:

0 голосов
/ 26 декабря 2008

В дополнение к поддержке совета HUAGHAGUAH выше, я бы добавил, что вы должны ОЧЕНЬ скептически относиться к микропроцессорам в целом. Несмотря на то, что узкоспециализированное тестирование производительности занимает законное место, очень легко настроить незначительную деталь. Поэтому напишите и проверьте код, предназначенный для удобства чтения и ясности, затем профилируйте его, чтобы узнать, где находятся «горячие точки» (или есть ли 1001 * , о которых стоит беспокоиться), а затем настройте (только) эти части.

Я вспоминаю, как работал с программистом, который оптимизировал немного кода, который выполнялся, пока система ожидала ввода от человека. Экономия времени абсолютно исчезла в промежутке между нажатиями клавиш!

0 голосов
/ 26 декабря 2008

MSDN имеет пример с секундомера. У них также есть это, показывая, насколько точно это в пределах наносекунд. Надеюсь, это поможет!

...