.NET Stopwatch - снижение производительности


person Ahmet Altun    schedule 08.08.2011    source источник
comment
Я очень подозреваю, что использование любого из них даст вам те же результаты. Несущественные отличия.   -  person Only Bolivian Here    schedule 08.08.2011
comment
См. stackoverflow.com/questions/2923283/   -  person ccellar    schedule 08.08.2011
comment
См .: stackoverflow.com/questions/28637/ - tl; dr: Используйте секундомер.   -  person Only Bolivian Here    schedule 08.08.2011
comment
DateTime может быть очень неточным, если вы пытаетесь измерить производительность с желаемой точностью. Итак, для вас; если для вас важны результаты, вы можете исключить DateTime.   -  person vcsjones    schedule 08.08.2011
comment
Я не понимаю, как это точный дубликат. Я подозреваю, что его сбор репутации преследует цель пометить вопросы как дубликаты и закрыть их.   -  person Rohit    schedule 18.08.2012
comment
Это НЕ дубликат других указанных вопросов. Этот вопрос касается накладных расходов на звонок. Остальные вопросы касаются только точности возвращаемой информации.   -  person Neville Cook    schedule 30.03.2015


Ответы (5)


Stopwatch ничего не делает между вызовами Start и _3 _... Он просто сохраняет текущую метку времени (через QueryPerformanceCounter), когда вы ее запускаете, и сравнивает ее с текущей меткой времени, когда вы ее останавливаете. Таким образом, нет причин, по которым это могло бы повлиять на производительность вашего кода, по крайней мере, незначительно. Stopwatch был разработан специально для точного измерения времени, поэтому вы можете быть уверены, что он полностью оптимизирован. Это также намного точнее, чем сравнение последовательных значений DateTime.Now. ...

person Thomas Levesque    schedule 08.08.2011
comment
Вопрос также в том, что делает секундомер внутри вызовов Start () и Stop () и как это влияет на приложение. Анализатор производительности VS2013 показывает, что Stopwatch.Stop () тратит около 0,92% (приложение выполняет 80000 запросов sql, 1thread, sw.Start () / sw.Stop () перед каждым) - person mistika; 16.06.2017
comment
Объяснение, которое я искал. - person Neo; 09.12.2017

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

GetTickCount() должен быть одним из самых быстрых способов профилирования, но с точностью до нескольких миллисекунд. Функция GetTickCount() Windows API проверяет только простую переменную (которая обновляется каждые несколько миллисекунд); его стоимость - это стоимость вызова собственного метода и не более того. Он представлен как Environment.TickCount в .NET. Но, как я уже сказал, я сомневаюсь, что это имеет значение. DateTime.UtcNow/Now имеют ту же (низкую) точность, что и GetTickCount.

Теоретически на джиттер может быть какое-то влияние, но это маловероятно.

person CodesInChaos    schedule 08.08.2011

Ответ действительно зависит от того, какой точности вы пытаетесь достичь. Для точности больше секунд секундомер является лучшим подходом из-за использования более точной системы измерения, чем дата и время. См. http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.aspx

С точки зрения производительности, я сомневаюсь, что есть такая большая разница в том, как Start () и DateTime.Now сохраняют значения из соответствующей системы измерения и при извлечении миллисекунд вычисляют разницу и преобразуют (при необходимости) в соответствующая единица измерения

person virlan2004    schedule 08.08.2011

Я не думаю, что это действительно имеет значение, если вы вызываете его всего несколько раз. Однако все зависит от того, какой уровень точности вы запрашиваете; Stopwatch намного точнее, потому что он полагается на QueuePerformanceCounter API, поэтому он использует более высокое разрешение.

person Jalal Said    schedule 08.08.2011

Я думаю, что второй будет более эффективным с точки зрения производительности, и, как указывают ссылки в комментарии, если вы хотите измерить время ниже секунд, DateTime не будет точным, хотя он был бы эффективным.

Я так думаю, потому что StopWatch будет постоянно измерять тики по сравнению с DateTime, который будет содержать только один экземпляр DateTime, то есть startTime.

person Haris Hasan    schedule 08.08.2011
comment
+1 за первое правильное предложение. Получение текущего DateTime - это просто чтение счетчика из памяти. Однако, как вы говорите, производительность - это не тот показатель, о котором здесь нужно думать, ее точность. - person nawfal; 22.04.2013