Тест производительности C # - PullRequest
0 голосов
/ 28 декабря 2018

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

, например:

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 мс медленнее, чем раньше ...

...