it-swarm.xyz

Рассчитать время выполнения метода

Возможный дубликат: 
Как я могу измерить, как долго работает функция?

У меня есть метод ввода-вывода времени, который копирует данные из одного места в другое. Какой самый лучший и самый реальный способ расчета времени выполнения? Thread? Timer? Stopwatch? Любое другое решение? Я хочу самый точный и максимально краткий.

423
Mahdi Tahsildari

Stopwatch предназначен для этой цели и является одним из лучших способов измерения времени выполнения в .NET.

var watch = System.Diagnostics.Stopwatch.StartNew();
// the code that you want to measure comes here
watch.Stop();
var elapsedMs = watch.ElapsedMilliseconds;

Не используйте DateTime для измерения времени выполнения в .NET.


Обновление:

Как отметил @ series0ne в разделе комментариев: если вы хотите действительно точного измерения выполнения некоторого кода, вам придется использовать счетчики производительности, встроенные в операционную систему. следующий ответ содержит хороший обзор.

865
Darin Dimitrov

Исходя из личного опыта, класс System.Diagnostics.Stopwatch может использоваться для измерения времени выполнения метода, однако БУДЬТЕ ОСТОРОЖНЫ: он не совсем точен!

Рассмотрим следующий пример:

Stopwatch sw;

for(int index = 0; index < 10; index++)
{
    sw = Stopwatch.StartNew();
    DoSomething();
    Console.WriteLine(sw.ElapsedMilliseconds);
}

sw.Stop();

Пример результатов

132ms
4ms
3ms
3ms
2ms
3ms
34ms
2ms
1ms
1ms

Теперь вам интересно; «ну почему это заняло 132 мс в первый раз, а в остальное время значительно меньше?»

Ответ в том, что Stopwatch не компенсирует активность «фонового шума» в .NET, такую ​​как JITing. Поэтому при первом запуске вашего метода, .NET JIT это первым. Время, необходимое для этого, добавляется ко времени выполнения. Точно так же другие факторы также могут привести к изменению времени выполнения.

Что вам действительно нужно для абсолютной точности, так это Performance Profiling!

Взгляните на следующее:

RedGate ANTS Performance Profiler является коммерческим продуктом, но дает очень точные результаты. - Повысьте производительность ваших приложений с помощью .NET-профилирования

Вот статья StackOverflow по профилированию: - Что такое хорошие профилировщики .NET?

Я также написал статью о профилировании производительности с помощью секундомера, на которую вы можете посмотреть - Профилирование производительности в .NET

61
series0ne

StopWatch class ищет ваше лучшее решение.

Stopwatch sw = Stopwatch.StartNew();
DoSomeWork();
sw.Stop();

Console.WriteLine("Time taken: {0}ms", sw.Elapsed.TotalMilliseconds);

Также у него есть статическое поле с именем Stopwatch.IsHighResolution . Конечно, это проблема аппаратного обеспечения и операционной системы.

Указывает, основан ли таймер на производительности с высоким разрешением счетчик.

24
Soner Gönül

Если вы заинтересованы в понимании производительности, лучший ответ - использовать профилировщик.

В противном случае System.Diagnostics.StopWatch предоставляет таймер высокого разрешения.

17
Jeff Foster

StopWatch будет использовать счетчик высокого разрешения

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

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

7
Brian Agnew
 using System.Diagnostics;
 class Program
 {
    static void Test1()
    {
        for (int i = 1; i <= 100; i++)
        {
            Console.WriteLine("Test1 " + i);
        }
    }
  static void Main(string[] args)
    {

        Stopwatch sw = new Stopwatch();
        sw.Start();
        Test1();
        sw.Stop();
        Console.WriteLine("Time Taken-->{0}",sw.ElapsedMilliseconds);
   }
 }
0
RAKIBUZ SULTAN PRANTO

Я использовал свойство Environment.TickCount для этой цели.

int start = Environment.TickCount;
// Your code here...
int end = Environment.TickCount;
int diffInMilliseconds = end - start;
0
Srihari Sridharan