Что такое штраф ресурсов за использование System.Diagnostics.Stopwatch? - PullRequest
10 голосов
/ 28 апреля 2009

Например

foo() //Some operation bound by an external resource. db,I/O, whatever.

против

var watch = new Stopwatch();
watch.Start();
foo()
var time = watch.ElapsedMilliseconds
watch.Stop();

Ответы [ 3 ]

9 голосов
/ 28 апреля 2009

Я считаю, что секундомер построен поверх QueryPerformanceCounter, поэтому каждый вызов приводит к переходу ядра. Если foo () очень короткое, накладные расходы QPC превзойдут его.

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

4 голосов
/ 28 апреля 2009

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

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

Экземпляры секундомера создаются (обычно) поверх вызова QueryPerformanceCounter. Они не бесплатны, но и не слишком дороги. Все, что стоит измерить с помощью секундомера, будет достаточно долго выполняемой задачей, поэтому стоимость задачи сделает вызов QueryPerformanceCounter незначительным. В противном случае, почему вы это измеряете?

2 голосов
/ 28 апреля 2009

По моему опыту, - это некоторые заметные издержки при использовании класса Stopwatch. Конечно, гораздо больше, чем использование Environment.TickCount или тому подобное для измерения времени, но все же не слишком здорово. Тем не менее, это может или не может быть большой проблемой для вас. Если измеряемый период времени, как правило, очень короткий (как это обычно бывает при использовании Stopwatch, учитывая, что другие методы так же хороши для синхронизации более длительных периодов), тогда производительность не должна ощутимо ухудшаться, я представляю Кроме того, конец этой страницы может немного сказать о стоимости запуска Stopwatch в вашей программе. (Не уверен, что я бы посоветовал использовать его для постоянного мониторинга программ.)

...