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

.NET Секундомер - штраф за производительность

Возможные дубликаты:
Является ли DateTime.Now лучшим способом измерения производительности функции?
Секундомер против использования System.DateTime.Now для событий синхронизации

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

Какая из них, по вашему мнению, имеет лучшую производительность?

Stopwatch sw = new Stopwatch();
sw.Start();
int a = 5;

// Critical lines of code

long elapsedMs = se.Elapsed.TotalMilliseconds;

ИЛИ

DateTime startDate = DateTime.Now;
int a = 5;

// Critical lines of code

long elapsedMs = DateTime.Now.Subtract(startDate).TotalMilleseconds;
4b9b3361

Ответ 1

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

Ответ 2

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

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

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

Ответ 3

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

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

Ответ 4

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

Ответ 5

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

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