2013-07-19 3 views
4

Для некоторых частных проектов я использую Stopwatch для измерения производительности.Секундомер для тестирования производительности

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

Я думал о написании собственного класса секундомера. Он мог рассчитать с помощью клещей и дать неопределенный ElapsedMicroseconds на основе Stopwatch.ElapsedTicks и TimeSpan.TicksPerMillisecond. Это, вероятно, будет не очень хорошим способом.

Мне определенно нужно что-то, что подкреплено высокопроизводительными счетчиками winapi, , так что datetime и такого не хватит.

Есть ли другие идеи?

+0

Вы * будет * есть чтобы сделать много и много вызовов этой функции, чтобы получить хорошее измерение. Вы сказали, что хотите получить электронное пособие. Запустите кучу и разделите. Это даст вам более точную оценку скорости. –

+0

Я делаю 2 000 000 звонков и вычисляю среднее. Но я думаю, что должен быть лучший способ измерить меньшие суммы. –

+0

Моя точка зрения заключается не в том, чтобы добавлять друг к другу каждый, а просто взять общее время для 2 000 000 и разделить. Чем меньше измерение вы пытаетесь принять, тем более неточным оно будет. –

ответ

6

Если вы получили 0 ElapsedMicroseconds, это означает, что интервал короче 1 мс. Вы можете попробовать измерения периодов в клещах и частота использования:

Stopwatch watch = Stopwatch.StartNew(); 
    ... 
    // Estimated code here 
    ... 
    watch.Stop(); 

    // Microseconds 
    int microSeconds = (int)(watch.ElapsedTicks * 1.0e6/Stopwatch.Frequency + 0.4999); 
    // Nanoseconds (estimation) 
    int nanoSeconds = (int)(watch.ElapsedTicks * 1.0e9/Stopwatch.Frequency + 0.4999); 
+0

Точно, это план. Частота лучше, чем какой-то член DateTime, поэтому +1. Спасибо –

+1

@DmitryBychanko Можете подробнее рассказать вам о +0.4999 в своем расчете? –

+1

Я объединил Double до ближайшего Int Microseconds; например если у меня есть, скажем, 3,87 микросекунды, если я положил (int) (3.87), он вернет 3, это не желаемое значение. Часто мы добавляем просто 0.5, но я предпочитаю, чтобы 0,5 округлялись до нуля, а не к одному, поэтому я положил 0.499999 ... –

1

Секундомер является, что вам нужно. Использование:

double diffMs = (stopWatch.ElapsedTicks * 1000.0)/Stopwatch.Frequency;

StopWathch.ElapsedMilliseconds определяется как долго. Поэтому невозможно, чтобы он был точнее, чем одна миллисекунда.

+0

И это хороший план для измерения этого пути? –

1

простите мое невежество, (но), если это меньше, чем за одну миллисекунду (1000 тиков), вы, конечно, не должны диагностировать его производительность вопросы

+0

У меня есть много вызовов функции, которую я хочу измерить. Но, чтобы сделать не менее 10 000, чтобы иметь хорошее измерение в тестах, это «скучно». –

+0

@MareInfinitus Это также * эффективно *. Даже если вы можете точно измерить один вызов, разница в разных вызовах означает, что вы должны сделать большое количество вызовов и усреднить время, если хотите иметь значимое приближение его продолжительности. – Servy

+0

Как уже упоминалось в другом комментарии, я делаю 2 000 000 звонков и вычисляю среднее значение, но я придумал идею, когда увидел 317 тиков и 0 ElapsedMilliseconds –

Смежные вопросы