Чтобы отслеживать производительность в нашем программном обеспечении, мы измеряем продолжительность интересующих нас звонков.
, например:
using(var performanceTrack = new PerformanceTracker("pt-1"))
{
// do some stuff
CallAnotherMethod();
using(var anotherPerformanceTrack = new PerformanceTracker("pt-1a"))
{
// do stuff
// .. do something
}
using(var anotherPerformanceTrackb = new PerformanceTracker("pt-1b"))
{
// do stuff
// .. do something
}
// do more stuff
}
Это приведет к чему-то вроде:
pt-1 [----------------------------] 28ms
[--] 2ms from another method
pt-1a [-----------] 11ms
pt-1b [-------------] 13ms
В конструкторе PerformanceTracker я запускаю секундомер.(Насколько я знаю, это самый надежный способ измерения длительности.) В методе утилизации я останавливаю секундомер и сохраняю результаты в аналитических материалах приложения.
Я заметил значительные колебания между результатами.Чтобы решить эту проблему, я уже сделал следующее:
- Запуск в сборке, за пределами Visual Studio.
- Сначала вызов прогрева, не включенный в статистику.
- Перед каждым звонком (всего 75 звонков) я звоню сборщику мусора.
После этого колебание меньше, но все же не очень точное.Например, я запустил свой тестовый набор дважды.Оба раза
Смотрите здесь результаты в миллисекундах.
Avg: 782,946666666667 981,68
Мин: 489 против 513
Макс: 2600 против 4875
stdev: 305,854933523003против 652,343471128764
sampleSize: 75 против 75
Почему измерение производительности с помощью секундомера все еще дает большие различия в результатах?На SO (https://stackoverflow.com/a/16157458/1408786) я обнаружил, что, возможно, мне следует добавить следующее в мой код:
//prevent the JIT Compiler from optimizing Fkt calls away
long seed = Environment.TickCount;
//use the second Core/Processor for the test
Process.GetCurrentProcess().ProcessorAffinity = new IntPtr(2);
//prevent "Normal" Processes from interrupting Threads
Process.GetCurrentProcess().PriorityClass = ProcessPriorityClass.High;
//prevent "Normal" Threads from interrupting this thread
Thread.CurrentThread.Priority = ThreadPriority.Highest;
Но проблема в том, что у нас много асинхронного кода. Как я могу получить надежныйОтслеживание производительности в коде? Моя цель - обнаружить снижение производительности, когда, например, после проверки в методе на 10 мс медленнее, чем раньше ...