Построение графиков бенчмарков

Часто бывает непонятно - насколько соотносятся цифры тестов, особенно если их было произведено больше двух. Для выяснения этого часто прибегают к построению графиков для результатов в единой системе координат и дальнейшему сравнительному анализу.

Самый простой способ - это визуалиазация данных в браузере, существует множество библиотек, позволяющих отрисовывать всевозможные виды графиков. Самые удобные обычно платные, бесплатные надо настраивать под свои нужды.

Остается только сформировать корректную html-страницу с подключенными библиотеками и данными измерений. Для этого можно воспользоваться функционалом пакета Leopotam.BenchCharts - он позволяет без внешних зависимостей и с минимальными трудозатратами собирать данные и генерировать контент для визуализации:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
BenchCharts charts = new ();
// Добавляем новый график.
BenchChart chartAi = charts.NewChart ()
// Устанавливаем его заголовок.
.SetTitle ("Оценка поведения ИИ")
// Устанавливаем наименование его осей.
.SetAxes ("Количество юнитов", "Опасность")
// Устанавливаем подписи к меткам по оси X.
.SetMarks ("0", "1", "2", "3", "4");
// Добавляем первый отчет в график.
chartAi.NewReport ("Вариант 1")
// Наполняем первый отчет данными.
.Add (0).Add (1).Add (2).Add (3).Add (4);
// Добавляем второй отчет в график.
chartAi.NewReport ("Вариант 2")
// Наполняем второй отчет данными.
.Add (0).Add (2).Add (4).Add (6).Add (8);
// Добавляем третий отчет в график.
chartAi.NewReport ("Вариант 3")
// Наполняем третий отчет данными.
.Add (0).Add (2.5f).Add (5).Add (7.5f).Add (10);
// Генерируем конечный html-файл с графиком.
string html = charts.Build ();
// Можем записать его в нужный файл,
// чтобы открыть позже в браузере.
File.WriteAllText ("Build/generated.html", html);

Если открыть сгенерированный файл, то увидим следующее (это скриншот, в браузере все векторное и масштабируется под любой размер):

Если нет желания настраивать тестовое окружение и хочется побыстрее получить результаты, то пакет предоставляет встроенный механизм тестирования. Например, мы хотим замерить скорость выполнения Math.Sin() и Math.Cos() на сотнях тысяч итераций. Реализуем тестовые случаи:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
class SinTest : IBenchChartTest {
double _res;
// Метод служит для корректной инициализации
// итерации "it" теста.
public void OnInit (int it) { }
// Метод содержит тестируемый код
// итерации "it" теста.
public void OnRun (int it) {
for (int i = 0; i < it * 100000; i++) {
_res = Math.Sin (i);
}
}
// Метод служит для корректной очистки
// итерации "it" теста.
public void OnDestroy (int it) { }
}

class CosTest : IBenchChartTest {
double _res;

public void OnInit (int it) { }

public void OnRun (int it) {
for (int i = 0; i < it * 100000; i++) {
_res = Math.Cos (i);
}
}

public void OnDestroy (int it) { }
}

И собираем новый тест с результатами в старую генерацию (количество графиков не ограничено):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// Код и примера выше.
BenchCharts charts = new ();
BenchChart chartAi = charts.NewChart ()
.SetTitle ("Оценка поведения ИИ")
.SetAxes ("Количество юнитов", "Опасность")
.SetMarks ("0", "1", "2", "3", "4");
chartAi.NewReport ("Вариант 1")
.Add (0).Add (1).Add (2).Add (3).Add (4);
chartAi.NewReport ("Вариант 2")
.Add (0).Add (2).Add (4).Add (6).Add (8);
chartAi.NewReport ("Вариант 3")
.Add (0).Add (2.5f).Add (5).Add (7.5f).Add (10);
// Добавляем новый график и настраиваем его легенду.
BenchChart chartSinCos = charts.NewChart ()
.SetTitle ("Измерение скорости")
.SetAxes ("Количество итераций, сотни тыс.", "Время, мс.")
.SetMarks ("0", "1", "2", "3", "4");
// Создание отчета "sin" и заполнение его результатами запуска теста.
BenchChartRunner.Start (new SinTest (), chartSinCos.NewReport ("sin"));
// Создание отчета "cos" и заполнение его результатами запуска теста.
BenchChartRunner.Start (new CosTest (), chartSinCos.NewReport ("cos"));
// Генерируем конечный html-файл с графиком.
string html = charts.Build ();
File.WriteAllText ("Build/generated.html", html);

Результат:

Актуальные версии пакетов доступны в закрытом telegram-сервере для vk/boosty-подписчиков.
Оформить подписку можно здесь: