Как контролировать точное количество тестов для запуска с суппортом
Я пытался понять, как правильно контролировать количество прогонов: это триал или повтор? Это сбивает с толку: я запускаю тест с --trial 1 и получаю вывод:
Сценарий 0% {vm=java, пробная версия =0, тест =SendPublisher} 1002183670.00 нс; Ï=315184,24 нс при 3 испытаниях
Похоже, 3 испытания были проведены. Что это за испытания? Какие повторы? Я могу контролировать значение rep с помощью опций --debug & --debug-reps, но каково значение при запуске без отладки? Мне нужно знать, сколько раз был вызван мой проверенный метод.
2 ответа
Между Caliper 0.5 и 1.0 немного изменилась терминология, но это должно объяснить это для обоих. Имейте в виду, что в 0.5 все было немного мутно, поэтому большинство изменений, внесенных в 1.0, должны были сделать вещи более ясными и точными.
Штангенциркуль 0,5
Один вызов Caliper - это бег. Каждый прогон имеет определенное количество испытаний, что является еще одной итерацией всей работы, выполненной в прогоне. В рамках каждого испытания Caliper выполняет несколько сценариев. Сценарий - это комбинация виртуальной машины, эталонного теста и т. Д. Время выполнения сценария измеряется по времени выполнения определенного числа повторений, которое является числом, переданным методу тестирования во время выполнения. Конечно, необходимо многократное повторение, потому что было бы невозможно получить точные измерения для одного вызова в микробенчмарке.
Штангенциркуль 1.0
Суппорт 1.0 следует довольно похожей модели. Один вызов Caliper все еще работает. Каждый прогон состоит из некоторого количества испытаний, но испытание более точно определяется как вызов сценария, измеренного с помощью инструмента.
Сценарий приблизительно определяется как то, что вы измеряете (хост, ВМ, тест, параметры), а инструмент - это какой код выполняет измерение и как он был настроен. Идея заключалась в том, что если бы абсолютно повторяемый тест был функцией формы f(x)=y
, Суппорт будет определяться как instrument(scenario)=measurements
,
При выполнении инструмента времени выполнения (он аналогичен для других), все еще остается то же понятие повторений, которое представляет собой число итераций, переданных в эталонный код. Вы не можете напрямую контролировать значение повторения, так как каждый инструмент выполнит свой собственный расчет, чтобы определить, каким он должен быть.
Во время выполнения Caliper планирует его выполнение, рассчитывая некоторое количество экспериментов, которое представляет собой комбинацию инструмента, эталона, виртуальной машины и параметров. Каждый эксперимент проводится --trials
количество раз и сообщается как индивидуальное испытание с собственным идентификатором.
Как использовать reps
параметр
Традиционно, лучший способ использовать параметр reps - это включить в ваш тестовый код цикл, который выглядит примерно так:
for (int i = 0; i < reps; i++) {…}
Это самый прямой способ убедиться, что количество повторений масштабируется линейно с указанным временем выполнения. Это необходимое свойство, потому что Caliper пытается определить стоимость одной однородной операции на основе совокупной стоимости многих. Если время выполнения не линейно с количеством повторений, результаты будут недействительными. Это также подразумевает, что повторения не должны передаваться непосредственно в проверенный код.
Мне нужно сравнить сокеты и контроль точного количества отправлений / получений и т. Д. На первом месте. Я написал метод времени "не каноническим" способом и просто проигнорировал аргумент rep:void timeSendPublisher(int rep) {
publisher.run(submsgs);
}
Это позволило мне контролировать, сколько сообщений отправляется подписчикам (аргумент submsgs). Когда количество сообщений было достаточно большим, я получил RunTimeException, выброшенный из warmUp TimeMeasure. Я прокомментировал код, который проверяет продолжительность измерения, чтобы увидеть результаты, и получает:
Сценарий 0% {vm=java, пробная версия = 0, тест =SendPublisher, submsgs=50, subs=2} 25102202788.00 нс; Ï=460644,94 нс при 3 испытаниях
Сценарий 50% {vm=java, пробная версия = 0, тест =SendPublisher, submsgs=100, subs=2} 50202435382.00 нс; Ï=1709344,33 нс при 3 испытаниях
Submsgs S линейное время выполнения
50 25,1 ===============
100 50.2 ==============================
vm: java
пробная версия: 0
тест: SendPublisher
1: 2
Можно ли интерпретировать время в отчете, как 25,1 секунды было потрачено на отправку 50 сообщений и 50,2 - на 100 сообщений? Вопрос в том, смогу ли я по-прежнему использовать каркас штангенциркуля или мой случай слишком далек от того, чтобы быть "микро-эталоном"?