Тест производительности C# Код завершается с разными результатами при каждом запуске - PullRequest
0 голосов
/ 15 марта 2020

Моя цель - сравнить производительность множества C# реализаций одного и того же. В конце концов, я хочу подобрать наиболее быструю реализацию. Я использую StopWatch для измерения времени каждого прогона, а также я использую достаточно большой вход, чтобы позволить реализации работать дольше и находить существенные различия во времени между прогонами и быть уверенным, что они не выходят за пределы ошибка.

Проблема в том, что я нахожу очень большие колебания, даже когда выполняется точно такой же код. Иногда, если я переупорядочу тестовые примеры, это повлияет на результат определения 1009 * тестового примера с увеличением времени на 50%, что выходит за пределы погрешности и полностью меняет вывод о том, какая реализация быстрее. Это со следующим кодом, выполняемым перед самим тестовым набором и перед измерением времени:

Thread.Sleep(500);
GC.Collect(2, GCCollectionMode.Forced, true, true);
GC.Collect(2, GCCollectionMode.Forced, true, true);
Thread.Sleep(500);

Я понимаю, что не могу полностью исключить G C, но все еще колебания во времени 50% слишком много Что вы можете предложить, кроме того, чтобы исключить как можно больше переменных, чтобы найти гораздо более согласованные и точные измерения времени выполнения кода?

Ответы [ 2 ]

2 голосов
/ 19 марта 2020

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

1 голос
/ 15 марта 2020

колебания происходят из-за фоновой работы операционной системы. Другими словами , если вы откроете Task Manager, вы увидите, что даже если нет активной программы, но CPU usage постоянно изменяется на 2-3%. Поэтому , не бывает постоянной ситуации. это похоже на плавучую лодку в море.

Так что для вашего теста не только вы должны полагаться на свой код, но и собирать некоторые системные данные и уменьшать коэффициент ошибок . и представьте, что таблица выглядит как таблица ниже.

Execution cycle | CPU usage %| RAM Usage GB| Hard Usage|

-----------------------------------------------------------
        100     |     2      |     1       |     2     |
        1000    |     5      |     0.75    |     1     |
        10000   |     10     |     0.5     |     2     |
        100000  |     11     |     1.5     |     4     |
        1000000 |     3      |     0.6     |     3     |

Вы должны достичь уравнения, подобного приведенному ниже:

Real Execution Performance = (g(CPU,RAM,Hard))*N mili-seconds 

N:= Nominal Execution Performance

Error coefficient `g(CPU,RAM,Hard)` related to CPU related to RAM related to Hard

Например: Real Execution Performance = 0.7*(20,000) =14,000 mili-seconds

Честно говоря: я не смог достичь Коэффициент ошибок , и я ищу его.

...