Как использовать бета-версию снимка Caliper без Maven?
Меня попросили использовать проект Google Caliper для создания нескольких микробенчмарков. Я бы очень хотел использовать функции аннотации новейшего бета-снимка, но, за исключением нескольких небольших примеров, у меня возникают проблемы с поиском хорошей документации о том, как на самом деле запустить эту штуку... Существует видеоурок, который инструктирует пользователей по новая функция интеграции maven, которую мне также попросили НЕ использовать.
Прямо сейчас у меня есть небольшой пример, снятый с одного из них, модифицированный другой информацией, которую я почерпнул из другого SO вопроса:
public class Benchmarks {
public class Test {
@Param int size; // set automatically by framework
private int[] array; // set by us, in setUp()
@BeforeExperiment void setUp() {
// @Param values are guaranteed to have been injected by now
array = new int[size];
}
@Benchmark int timeArrayIteration(int reps) {
int dummy = 0;
for (int i = 0; i < reps; i++) {
for (int doNotIgnoreMe : array) {
dummy += doNotIgnoreMe;
}
}
return dummy;
}
}
//(Questionable practice here?)
public static void main (String args[]) {
CaliperMain.main(Test.class, args);
}
}
Запуск его дает мне сообщение, что я не установил значение по умолчанию для размера. У меня проблемы с поиском, где я должен был положить это.
Полное удаление "size" путем комментирования строки @Param и придания жесткого значения объявлению массива в setUp просто приводит к тому, что он решает, что "никаких экспериментов не будет", что, я полагаю, имеет смысл.
Если бы были какие-либо современные ресурсы или учебники, которые могли бы указать на то, что я делаю неправильно (честно говоря, очень много), я был бы очень признателен.
РЕДАКТИРОВАТЬ:
Я обновил это согласно некоторым советам:
public class Benchmarks {
@Param({"1", "10", "1000"}) int size; // set automatically by framework
private int[] array; // set by us, in setUp()
@BeforeExperiment void setUp() {
// @Param values are guaranteed to have been injected by now
array = new int[size];
}
@Benchmark int timeArrayIteration(int reps) {
int dummy = 0;
for (int i = 0; i < reps; i++) {
for (int doNotIgnoreMe : array) {
dummy += doNotIgnoreMe;
}
}
return dummy;
}
}
Я запускаю бета-версию и передаю класс Benchmarks в качестве аргумента. Я получаю следующее:
Experiment selection:
Instruments: []
User parameters: {size=[1, 10, 1000]}
Virtual machines: [default]
Selection type: Full cartesian product
There were no experiments to be performed for the class Benchmarks using the instruments [allocation, runtime]
Кажется, он не обнаруживает никаких инструментов. Я не передаю ничего, поскольку в документации упоминается, что он просто использует распределение по умолчанию, время выполнения (что хорошо для моих целей).
ДВОЙНОЕ РЕДАКТИРОВАНИЕ: Нашел эту проблему, глупая ошибка. Сделаю быстрое описание, как только я это подтвердлю.
2 ответа
Запуск его дает мне сообщение, что я не установил значение по умолчанию для размера.
Параметры устанавливаются либо из значений по умолчанию:
@Param({"1", "10", "1000"}) int size;
Или передавая значения через -D
флаг. Например: -Dsize=1,10,1000
, Перечисления и логические значения получают особую обработку, поскольку в нем используются все возможные значения без необходимости перечислять их в аннотации.
Полное удаление "size" путем комментирования строки @Param и придания жесткого значения объявлению массива в setUp просто приводит к тому, что он решает, что "никаких экспериментов не будет", что, я полагаю, имеет смысл.
Вероятно, проблема в том, что ваш эталонный тест является внутренним классом и нуждается в ссылке на включающий класс (хотя это должно было быть ошибкой). Либо сделайте ваш эталонный класс классом верхнего уровня (рекомендуется), либо сделайте его статическим.
Также нет особой необходимости включать основной метод. Вызов CaliperMain
с вашим эталонным классом в качестве первого параметра эквивалентно.
Запуск его дает мне сообщение, что я не установил значение по умолчанию для размера.
Это очень просто:
@Param({"1", "10", "1000"}) int size;
Полное удаление "size" путем комментирования строки @Param и придания жесткого значения объявлению массива в setUp просто приводит к тому, что он решает, что "никаких экспериментов не будет", что, я полагаю, имеет смысл.
Нет, это не так. Без каких-либо параметров каждый метод тестирования должен выполняться ровно один раз. Смотрите другой ответ для решения.
Там довольно много Javadoc, например, на @Param
, На самом деле, не так много изменилось. Аннотации заменили условные обозначения (теперь вам не нужны time
префикс), параметры остались прежними, установка использует аннотацию вместо наследования.