Вы должны обязательно вернуть ElapsedMilliseconds вместо ElapsedTicks. Значение, возвращаемое ElapsedTicks, зависит от частоты секундомера, которая может быть разной в разных системах. Он не обязательно будет соответствовать свойству Ticks объекта Timespan или DateTime.
См. http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.elapsedticks.aspx.
Если вы действительно хотите получить дополнительное разрешение тиков, вы должны вернуть watch.Elapsed.Ticks
(то есть Timestamp.Ticks) вместо watch.ElapsedTicks
(это может быть один из самых тонких потенциальных ошибки в .Net). Из MSDN:
отметки секундомера отличаются от
DateTime.Ticks. Каждый тик в
Значение DateTime.Ticks представляет один
100-наносекундный интервал. Каждый тик в
значение ElapsedTicks представляет
интервал времени, равный 1 секунде
делится на частоту.
Кроме этого, я полагаю, что ваш код в порядке, хотя я думаю, что вы включили бы некоторые издержки вызова метода в свои измерения, которые могут быть значительными, если сами методы занимают очень мало времени для выполнения. Кроме того, вы, вероятно, захотите исключить первый вызов метода из вычисленного среднего значения, но я не уверен, как вы это сделаете в своем классе.
И последнее замечание, которое, вероятно, не относится к большинству применений этого класса: секундомер работает немного быстрее по сравнению с системным временем. На моем компьютере он опережает примерно на 5 секунд (это секунд , а не миллисекунд) через 24 часа, а на других машинах этот дрейф может быть еще больше. Поэтому немного вводить в заблуждение говорить, что он очень точен , тогда как на самом деле он очень гранулирован . Для временных методов короткой продолжительности это, очевидно, не будет существенной проблемой.
И еще один последний момент, который, безусловно, имеет отношение к : я часто замечал, что во время бенчмаркинга я получал кучу времени выполнения, которые все сгруппированы в узком диапазоне значений (например, 80 , 80, 79, 82 и т. Д.), Но иногда в Windows происходит что-то еще (например, открытие другой программы или мой антивирус запускается, или что-то в этом роде), и я получаю дикое значение с другими (например, 80 80, 79, 271, 80 и т. Д.). Я думаю, что простым решением этой проблемы является использование медианы ваших измерений вместо среднего . Я не знаю, поддерживает ли Linq это автоматически или нет.