Как измерить производительность кода в.NET?

45
задан Airsource Ltd 19 January 2009 в 20:44
поделиться

10 ответов

Stopwatch класс, доступный начиная с.NET 2.0, является лучшим способом пойти для этого. Это - очень высокопроизводительный счетчик с точностью до частей миллисекунды. Смотрите на документация MSDN , который довольно ясен.

РЕДАКТИРОВАНИЕ: Как ранее предложено, также желательно выполнить Ваш код неоднократно для получения разумного среднего времени.

62
ответ дан Stefan Steinegger 8 November 2019 в 00:50
поделиться
3
ответ дан Patrick Cuff 8 November 2019 в 00:50
поделиться

Иногда может быть лучше посмотреть на то, почему Вам нужна ко времени операция? Это отстает? Или Вам просто любопытно? Первое правило оптимизации, "Не делают этого". Так, в зависимости от то, что Вы на самом деле измеряете, могло изменить мнение о том, какой инструмент подходит лучше всего для задачи.

0
ответ дан 8 November 2019 в 00:50
поделиться

Посмотрите, что ответом на Является DateTime. Теперь лучший способ измерить function’s уровень? для объяснения или читают мой сообщение в блоге о высокопроизводительном измерении

, проблема состоит в том, что DateTime имеет разрешение приблизительно 15 мс, это не может быть более точно, чем это. Секундомер, однако, может.

3
ответ дан Community 8 November 2019 в 00:50
поделиться

Используйте настоящего профилировщика, такого как dotTrace.

4
ответ дан Otávio Décio 8 November 2019 в 00:50
поделиться

Можно использовать эти Stopwatch, предполагая использование.NET 2.0 или более новые.

System.Diagnostics.Stopwatch.StartNew();

Stopwatch класс также имеет общедоступное поле IsHighResolution только для чтения, которое сообщит, основан ли секундомер на счетчике производительности с высоким разрешением. Если не, это основано на системном таймере.

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

4
ответ дан Palec 8 November 2019 в 00:50
поделиться

Только для добавления к тому, что другие уже сказали об использовании Секундомера и измерении средних чисел.

Удостоверяются, что Вы называете свой метод перед измерением. Иначе Вы измерите время, необходимое к JIT скомпилировать код также. Это может значительно скосить Ваши числа.

кроме того, удостоверьтесь, что Вы измеряете код режима выпуска, поскольку оптимизация выключена по умолчанию для сборок отладки. Настройка кода отладки бессмысленна, по моему скромному мнению.

И удостоверяются, что Вы измеряете то, что Вы на самом деле хотите измерить. Когда оптимизация умирает, КОМПИЛЯТОР/JIT-КОМПИЛЯТОР может перестроить код или удалить его полностью, таким образом, можно закончить тем, что измерили что-то немного различное, чем предназначенный. По крайней мере, смотрите на сгенерированный код, чтобы удостовериться, что код не был разделен.

В зависимости от того, что Вы пытаетесь измерить, имеют в виду, что реальная система подчеркнет время выполнения по-другому, чем типичное тестовое приложение. Некоторые проблемы производительности связаны с, например, как объекты собраны "мусор". Эти проблемы не будут обычно обнаруживаться в простом тестовом приложении.

На самом деле, лучшие советуют, должен измерить реальные системы с реальными данными, поскольку тесты песочницы могут оказаться очень неточными.

8
ответ дан Brian Rasmussen 8 November 2019 в 00:50
поделиться

Я нахожу эти полезные

http://accelero.codeplex.com/SourceControl/changeset/view/22633#290971 http://accelero.codeplex.com/SourceControl/changeset/view/22633#290973 http://accelero.codeplex.com/SourceControl/changeset/view/22633#290972

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

, Таким образом, это

var tickTimer = new TickTimer();
//call a method that takes some time
DoStuff();
tickTimer.Stop();
Debug.WriteLine("Elapsed HighResElapsedTicks " + tickTimer.HighResElapsedTicks);
Debug.WriteLine("Elapsed DateTimeElapsedTicks " + tickTimer.DateTimeElapsedTicks);
Debug.WriteLine("Elapsed ElapsedMilliseconds " + tickTimer.ElapsedMilliseconds);
Debug.WriteLine("Start Time " + new DateTime(tickTimer.DateTimeUtcStartTicks).ToLocalTime().ToLongTimeString());

произведет это

Elapsed HighResElapsedTicks 10022886
Elapsed DateTimeElapsedTicks 41896
Elapsed ElapsedMilliseconds 4.18966178849554
Start Time 11:44:58

, DebugTimer является оберткой для TickTimer, который запишет результат для Отладки. (отметьте: это поддерживает Доступный шаблон)

, Таким образом, это

using (new DebugTimer("DoStuff"))
{
    //call a method that takes some time
    DoStuff();
}

произведет это к окну отладки

DoStuff: Total 3.6299 ms

, IterationDebugTimer для синхронизации, сколько времени это берет, чтобы выполнить операцию многократно и записать результат для Отладки. Это также выполнит начальную букву, выполненную, который не включен, чтобы проигнорировать время запуска. (отметьте: это поддерживает Доступный шаблон)

, Таким образом, это

int x;
using (var iterationDebugTimer = new IterationDebugTimer("Add", 100000))
{
    iterationDebugTimer.Run(() =>
    {
        x = 1+4;
    });
}

произведет это

Add: Iterations 100000 
Total 1.198540 ms 
Single 0.000012 ms
9
ответ дан Simon 8 November 2019 в 00:50
поделиться

Выполняйте свой код неоднократно. Проблема, кажется, что Ваш код выполняется намного быстрее, чем гранулярность Вашего измерительного прибора. Простое решение этого должно выполнить Ваш код многие, много раз (тысячи, возможно, миллионы) и затем вычислить среднее время выполнения.

Редактирование: Кроме того, из-за природы текущих оптимизирующих компиляторов (и Виртуальные машины, такие как CLR и JVM) может быть очень неправильно измерить скорость выполнения одних строк кода, так как измерение может влиять на скорость довольно много. Намного лучший подход должен был бы представить всю систему (или по крайней мере большие блоки) и проверка, где узкие места.

11
ответ дан Joachim Sauer 8 November 2019 в 00:50
поделиться

В этой статье проекта кода показано, как использовать высокопроизводительный таймер для измерения скорости выполнения вашего кода:

http://www.codeproject.com /KB/cs/highperformancetimercshar.aspx

Здесь вы можете найти ряд профилировщиков C # с открытым исходным кодом:

http://csharp-source.net/open-source/profilers

1
ответ дан 26 November 2019 в 20:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: