Является ли DateTime.Now лучшим способом измерения производительности функции?
Мне нужно найти узкое место и нужно максимально 9X_.net точно измерить время.
Является ли следующий 9X_c# фрагмент кода лучшим способом измерения 9X_datetime-functions производительности?
DateTime startTime = DateTime.Now;
// Some execution process
DateTime endTime = DateTime.Now;
TimeSpan totalTimeTaken = endTime.Subtract(startTime);
- Если вам нужна более высокая точность, используйте Stopwatch.GetTimestamp, в прот ...
Ответ #1
Ответ на вопрос: Является ли DateTime.Now лучшим способом измерения производительности функции?
Нет, это не так. Используйте Stopwatch (в System.Diagnostics
)
Stopwatch sw = Stopwatch.StartNew();
PerformWork();
sw.Stop();
Console.WriteLine("Time taken: {0}ms", sw.Elapsed.TotalMilliseconds);
Секундомер 9X_c# автоматически проверяет наличие высокоточных 9X_datetime-manipulation таймеров.
Стоит отметить, что DateTime.Now
часто немного 9X_dot-net медленнее, чем DateTime.UtcNow
из-за работы, которая должна 9X_datetime-manipulation быть проделана с часовыми поясами, DST и тому 9X_timer подобное.
DateTime.UtcNow обычно имеет разрешение 9X_dotnet 15 мс. См. John Chapman's blog post о точности DateTime.Now
для отличного 9X_datetime-manipulation резюме.
Интересные мелочи: секундомер возвращается 9X_datetime-functions к DateTime.UtcNow
, если ваше оборудование не поддерживает 9X_speed высокочастотный счетчик. Вы можете проверить, использует 9X_performance ли секундомер оборудование для достижения 9X_dot-net высокой точности, посмотрев на статическое 9X_datetime-functions поле Stopwatch.IsHighResolution.
- @Pavel, чтобы было ясно, секундомер рекомендуется Microsoft как лучшее решение (низкие накладные расходы и высокая точность) для современных многоядерных процессоров, работающих под управлением Windows ...
Ответ #2
Ответ на вопрос: Является ли DateTime.Now лучшим способом измерения производительности функции?
Если вы хотите что-то быстрое и грязное, я 9X_datetime-manipulation бы предложил вместо этого использовать секундомер 9X_.net для большей степени точности.
Stopwatch sw = new Stopwatch();
sw.Start();
// Do Work
sw.Stop();
Console.WriteLine("Elapsed time: {0}", sw.Elapsed.TotalMilliseconds);
В качестве 9X_timer альтернативы, если вам нужно что-то более 9X_timers сложное, вам, вероятно, следует рассмотреть 9X_efficiency возможность использования стороннего профилировщика, такого 9X_speed как ANTS.
Ответ #3
Ответ на вопрос: Является ли DateTime.Now лучшим способом измерения производительности функции?
This article говорит, что прежде всего вам нужно сравнить 9X_.net-framework три альтернативы, Stopwatch
, DateTime.Now
И DateTime.UtcNow
.
Он также показывает, что 9X_speed в некоторых случаях (когда счетчик производительности 9X_slow не существует) секундомер использует DateTime.UtcNow 9X_datetime + некоторую дополнительную обработку. Из-за 9X_timer этого очевидно, что в этом случае DateTime.UtcNow 9X_datetime-functions - лучший вариант (потому что другие используют 9X_c# его + некоторая обработка)
Однако, как оказалось, счетчик 9X_dotnet существует почти всегда - см. Explanation about high-resolution performance counter and its existence related to .NET Stopwatch?.
Вот график 9X_dotnet производительности. Обратите внимание на 9X_slow низкую стоимость UtcNow по сравнению с альтернативами:
Ось 9X_performance X - это размер данных выборки, а ось Y - относительное 9X_dotnet время примера.
Одна вещь, в которой Stopwatch
лучше, - это 9X_c#.net то, что он обеспечивает измерения времени 9X_datetime-functions с более высоким разрешением. Во-вторых, это 9X_.net более объектно-ориентированный характер. Однако 9X_csharp создать объектно-ориентированную оболочку 9X_efficiency вокруг UtcNow
не так сложно.
- Первая ссылка не работает.<p><span cla ...
Ответ #4
Ответ на вопрос: Является ли DateTime.Now лучшим способом измерения производительности функции?
Полезно втиснуть код бенчмаркинга в служебный 9X_c#.net класс/метод. Класс StopWatch
не обязательно должен 9X_c# быть Disposed
или Stopped
при ошибке. Итак, самый простой 9X_datetime-manipulation код для времени некоторого действия
public partial class With
{
public static long Benchmark(Action action)
{
var stopwatch = Stopwatch.StartNew();
action();
stopwatch.Stop();
return stopwatch.ElapsedMilliseconds;
}
}
Пример кода вызова
public void Execute(Action action)
{
var time = With.Benchmark(action);
log.DebugFormat(“Did action in {0} ms.”, time);
}
Вот 9X_c#.net версия метода расширения
public static class Extensions
{
public static long Benchmark(this Action action)
{
return With.Benchmark(action);
}
}
И пример кода вызова
public void Execute(Action action)
{
var time = action.Benchmark()
log.DebugFormat(“Did action in {0} ms.”, time);
}
- А как насчет лучшей детализации? Мног ...
Ответ #5
Ответ на вопрос: Является ли DateTime.Now лучшим способом измерения производительности функции?
Функциональность stopwatch была бы лучше (более высокая 9X_timer точность). Я бы также порекомендовал просто 9X_speed загрузить один из популярных профилировщиков 9X_efficiency (DotTrace и ANTS — те, которыми я пользовался чаще всего… бесплатная 9X_slow пробная версия DotTrace полностью функциональна 9X_csharp и не ворчит, как некоторые из другие).
Ответ #6
Ответ на вопрос: Является ли DateTime.Now лучшим способом измерения производительности функции?
Используйте класс System.Diagnostics.Stopwatch.
Stopwatch sw = new Stopwatch();
sw.Start();
// Do some code.
sw.Stop();
// sw.ElapsedMilliseconds = the time your "do some code" took.
9X_.net-framework
Ответ #7
Ответ на вопрос: Является ли DateTime.Now лучшим способом измерения производительности функции?
То же самое Секундомер, это намного лучше.
Что 9X_c# касается измерения производительности, вы 9X_dot-net также должны проверить, является ли ваш 9X_csharp «// Some Execution Process» очень коротким 9X_dotnet процессом.
Также имейте в виду, что первый 9X_dot-net запуск вашего "// Some Execution Process" может 9X_c-sharp быть намного медленнее, чем последующие 9X_datetime-functions запуски.
Обычно я тестирую метод, запуская 9X_dotnet его 1000 раз или 1000000 раз в цикле, и 9X_c-sharp получаю гораздо более точные данные, чем 9X_csharp один раз.
Ответ #8
Ответ на вопрос: Является ли DateTime.Now лучшим способом измерения производительности функции?
Все это отличные способы измерения времени, но 9X_efficiency это лишь косвенный способ найти узкие места.
Самый 9X_dotnet прямой способ найти узкое место в потоке 9X_.net - запустить его, и пока он делает то, что 9X_timer заставляет вас ждать, остановите его с помощью 9X_c# клавиши паузы или прерывания. Сделайте это 9X_c#.net несколько раз. Если ваше узкое место занимает 9X_datetime X% времени, X% - это вероятность того, что 9X_.net вы поймаете его в действии на каждом снимке.
Ответ #9
Ответ на вопрос: Является ли DateTime.Now лучшим способом измерения производительности функции?
К вашему сведению, класс .NET Timer не 9X_dot-net предназначен для диагностики, он генерирует 9X_timer события с заданным интервалом, например 9X_datetime-manipulation так (от MSDN):
System.Timers.Timer aTimer;
public static void Main()
{
// Create a timer with a ten second interval.
aTimer = new System.Timers.Timer(10000);
// Hook up the Elapsed event for the timer.
aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
// Set the Interval to 2 seconds (2000 milliseconds).
aTimer.Interval = 2000;
aTimer.Enabled = true;
Console.WriteLine("Press the Enter key to exit the program.");
Console.ReadLine();
}
// Specify what you want to happen when the Elapsed event is
// raised.
private static void OnTimedEvent(object source, ElapsedEventArgs e)
{
Console.WriteLine("The Elapsed event was raised at {0}", e.SignalTime);
}
Так что это на самом деле не поможет 9X_efficiency вам узнать, сколько времени что-то заняло, просто 9X_csharp то, что прошло определенное количество времени.
Таймер 9X_datetime также представлен как элемент управления 9X_performance в System.Windows.Forms... вы можете найти 9X_c#.net его в своем наборе инструментов дизайнера 9X_speed в VS05/VS08
Ответ #10
Ответ на вопрос: Является ли DateTime.Now лучшим способом измерения производительности функции?
Это правильный способ:
using System;
using System.Diagnostics;
class Program
{
public static void Main()
{
Stopwatch stopWatch = Stopwatch.StartNew();
// some other code
stopWatch.Stop();
// this not correct to get full timer resolution
Console.WriteLine("{0} ms", stopWatch.ElapsedMilliseconds);
// Correct way to get accurate high precision timing
Console.WriteLine("{0} ms", stopWatch.Elapsed.TotalMilliseconds);
}
}
Дополнительную информацию 9X_dotnet см. на странице Use Stopwatch instead of DataTime for getting accurate performance counter.
Ответ #11
Ответ на вопрос: Является ли DateTime.Now лучшим способом измерения производительности функции?
Visual Studio Team System имеет некоторые функции, которые могут 9X_speed помочь в решении этой проблемы. По сути, вы 9X_c# можете писать модульные тесты и смешивать 9X_datetime-manipulation их в разных сценариях для запуска с вашим 9X_dot-net программным обеспечением в рамках стресс-теста 9X_slow или нагрузочного теста. Это может помочь 9X_timers определить области кода, которые больше 9X_slow всего влияют на производительность ваших 9X_datetime-manipulation приложений.
Группа Microsoft "Шаблоны 9X_dotnet и практики" имеет некоторые рекомендации 9X_dot-net в Visual Studio Team System Performance Testing Guidance.
Ответ #12
Ответ на вопрос: Является ли DateTime.Now лучшим способом измерения производительности функции?
Я только что нашел сообщение в блоге Вэнса 9X_.net-framework Моррисона о том, что a CodeTimer class он написал, что это 9X_c#.net упрощает использование StopWatch
и делает некоторые 9X_slow полезные вещи на стороне.
Ответ #13
Ответ на вопрос: Является ли DateTime.Now лучшим способом измерения производительности функции?
Я использую в своих программах класс StopWatch, как 9X_dot-net показано здесь.
Stopwatch sw = new Stopwatch();
sw.Start();
// Critical lines of code
long elapsedMs = sw.Elapsed.TotalMilliseconds;
Ответ #14
Ответ на вопрос: Является ли DateTime.Now лучшим способом измерения производительности функции?
Я очень мало проверял производительность 9X_c#.net такого рода (я склонен просто думать «это 9X_dot-net медленно, сделайте это быстрее»), поэтому 9X_c#.net я почти всегда придерживался этого.
Google 9X_c-sharp показывает множество ресурсов/статей для 9X_datetime проверки производительности.
Многие упоминают 9X_c#.net об использовании pinvoke для получения информации 9X_datetime-manipulation о производительности. Во многих материалах, которые 9X_timer я изучаю, упоминается только использование 9X_datetime perfmon.
Изменить:
Видел выступления Секундомера.. Красиво! Я 9X_dot-net кое-чему научился :)
Ответ #15
Ответ на вопрос: Является ли DateTime.Now лучшим способом измерения производительности функции?
Это недостаточно профессионально:
Stopwatch sw = Stopwatch.StartNew();
PerformWork();
sw.Stop();
Console.WriteLine("Time taken: {0}ms", sw.Elapsed.TotalMilliseconds);
Более надежная 9X_.net-framework версия:
PerformWork();
int repeat = 1000;
Stopwatch sw = Stopwatch.StartNew();
for (int i = 0; i < repeat; i++)
{
PerformWork();
}
sw.Stop();
Console.WriteLine("Time taken: {0}ms", sw.Elapsed.TotalMilliseconds / repeat);
В моем реальном коде я добавлю вызов 9X_c# GC.Collect для изменения управляемой кучи 9X_slow до известного состояния и добавлю вызов 9X_datetime-manipulation сна, чтобы можно было легко разделить различные 9X_c-sharp интервалы кода в профиле ETW.
-
11
-
5
-
3
-
4
-
7
-
6
-
7
-
1
-
4
-
3
-
4
-
2
-
2
-
8
-
2
-
20
-
2
-
3
-
5
-
8
-
3
-
2
-
9
-
5
-
6
-
9
-
8
-
11
-
5
-
3
-
4
-
4
-
6
-
3
-
10
-
3
-
11
-
7
-
9
-
6
-
4
-
2
-
3
-
3
-
3
-
4
-
15
-
3
-
7
-
6