Штангенциркуль: микро- и макро тесты
Для ELKI мне нужны (и имеют) более гибкие реализации сортировки, чем то, что обеспечивается стандартным Java JDK и API коллекций. (Сортировка не является моей конечной целью. Я использую частичную сортировку для структур индексов массовой загрузки, таких как kd-tree и R*-tree, и я хочу сделать довольно общую реализацию их доступной, более общей, чем та, что в настоящее время в ELKI - но в любом случае оптимизация сортировки означает оптимизацию времени построения индекса).
Тем не менее, алгоритмы сортировки масштабируются очень по-разному в зависимости от размера ваших данных. Для крошечных массивов это известный факт, что сортировка вставкой может работать хорошо (и на самом деле, большинство реализаций быстрой сортировки отступят к сортировке вставки ниже определенного порога); не по теории, а по конвейерным процессорам и эффектам размера кода, не рассматриваемым теорией сортировки.
Поэтому в настоящее время я тестирую ряд реализаций сортировки, чтобы найти наилучшую комбинацию для моих конкретных потребностей; Я хочу, чтобы мои более гибкие реализации были в некоторой степени на уровне реализаций JDK по умолчанию (которые уже точно настроены, но, возможно, для другой версии JDK).
В долгосрочной перспективе мне нужно, чтобы эти вещи было легко воспроизвести и повторить. В какой-то момент мы увидим JDK8. А на Dalvik VM результаты также могут отличаться от результатов на Java 7. Черт, они могут даже отличаться на процессорах AMD, Core i7 и Atom. Поэтому, возможно, Cervidae будет включать в себя различные стратегии сортировки и выберет наиболее подходящую по времени загрузки класса.
Мои текущие усилия на GitHub: https://github.com/kno10/cervidae
Итак, теперь к актуальному вопросу. Последний коммит суппорта добавил экспериментальный код для макробенчмарков. Тем не менее, я сталкиваюсь с проблемой, которая мне нужна как. Макробенчмарки суппорта перестают работать, когда время выполнения составляет менее 0,1% от разрешения таймера; с 10000 объектами некоторые алгоритмы достигают этого порога. В то же время, микробенчмарки жалуются на то, что вы должны делать макробенчмарки, когда ваши пробеги занимают слишком много времени...
Поэтому для сравнительного анализа разных размеров сортировки мне действительно нужен подход, который динамически переключается с микробенчмаркинга на макробенчмаркинг в зависимости от времени выполнения. На самом деле, я бы даже предпочел, чтобы калипер автоматически понял, что время выполнения достаточно велико для тестирования макроса, а затем просто сделал бы одну итерацию.
Прямо сейчас я пытаюсь подражать этому с помощью:
@Macrobenchmark
public int macroBenchmark() { ... }
public int timeMicroBenchmark(int reps) {
int ret = 0;
for (int i = 0; i < reps; i++) {
ret += macroBenchmark();
}
}
поделиться кодом сравнения в обоих сценариях. Альтернативный код будет использовать
@Macrobenchmark
public int macroBenchmark() {
return timeMicroBenchmark(1);
}
public int timeMicroBenchmark(int reps) { ... }
какой из двух "адаптеров" предпочтительнее? Любые другие советы для получения последовательных сравнений от микро вплоть до макроса?
Учитывая, что веб-интерфейс суппорта в настоящее время не работает, что вы используете для анализа результатов? В настоящее время я использую крошечный скрипт на python для обработки результата JSON и отчета о взвешенных средних. И на самом деле, мне больше нравились старые текстовые отчеты, чем веб-интерфейс.
О, и есть ли способ, чтобы Caliper просто перезапустил тест, когда компиляция Hotspot произошла в цикле тестирования? Прямо сейчас он регистрирует ошибку, но, может быть, он может просто перезапустить эту часть теста?
1 ответ
Я думаю, что проблема заключается в том, что результаты работы микробенчмарка неверно истолковываются как "жалоба". Это говорит:
"ИНФОРМАЦИЯ: Для этого эксперимента не требуется микробенчмарк. Гранулярность таймера (%s) составляет менее 0,1%% от измеренного времени выполнения. Если все эксперименты для этого эталонного теста имеют время выполнения больше, чем% s, рассмотрите инструмент макробенчмарка".
Сообщение специально сформулировано так, чтобы передать, что отдельный эксперимент был длительным, но, поскольку другие эксперименты для этого эталонного метода могут и не быть, это, безусловно, не является ошибкой. Инструменту микробенчмарка немного больше накладных расходов, но хотя в вашем эксперименте микробенчмарк может не потребоваться, результаты по-прежнему остаются совершенно достоверными.