Подтвердить что ты не робот

Насколько точным является System.Diagnostics.Stopwatch?

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

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

4b9b3361

Ответ 1

Почему вы не просматриваете свой код, а не фокусируетесь на микро-тестах?

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

Ответ 2

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

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

Ответ 3

Никогда не полагайтесь на одно измерение ничего для точности.

Запустите каждый путь кода в течение нескольких минут и подсчитайте количество итераций, чтобы получить среднее значение.

Ответ 4

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

Причина, по которой некоторые разработчики считают, что секундомер не является точным, заключается в том, что ElapsedTicks из секундомера НЕ СОБИРАТЬ к Ticks в 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

Ответ 5

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

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

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

Ответ 6

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

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

Дополнительная информация: http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.aspx

Ответ 7

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

Ответ 8

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

Ответ 9

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

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