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

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

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

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

4b9b3361

Ответ 1

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 в разделе комментариев: если вы хотите действительно точного измерения выполнения некоторого кода, вам придется использовать счетчики производительности, встроенные в операционную систему. Следующий ответ содержит хороший обзор.

Ответ 2

Исходя из личного опыта, класс 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 первым. Время, необходимое для этого, добавляется ко времени выполнения. Точно так же другие факторы также могут привести к изменению времени выполнения.

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

Посмотрите на следующее:

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

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

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

Ответ 3

StopWatch класс ищет лучшее решение.

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

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

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

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

Ответ 4

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

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

Ответ 5

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

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

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

Ответ 6

 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);
   }
 }

Ответ 7

Для этого я использовал свойство Environment.TickCount.

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