Калипер: микро- и макро-бенчмарки

Для ELKI мне нужны (и есть) более гибкие реализации сортировки, чем те, что предоставляются в стандартной версии Java. JDK и API коллекций. (Сортировка не является моей конечной целью. Я использую частичную сортировку для массовой загрузки индексных структур, таких как kd-дерево и R*-дерево, и я хочу сделать их доступной довольно общей реализацией, более общей, чем то, что в настоящее время есть в ELKI. - но в любом случае оптимизация сортировки означает оптимизацию времени построения индекса).

Однако алгоритмы сортировки масштабируются по-разному в зависимости от размера ваших данных. Для крошечных массивов известно, что сортировка вставками может работать хорошо (и фактически большинство реализаций быстрой сортировки возвращаются к сортировке вставками ниже определенного порога); не теорией, а конвейерной обработкой ЦП и эффектами размера кода, не учитываемыми теорией сортировки.

Поэтому в настоящее время я тестирую несколько реализаций сортировки, чтобы найти наилучшую комбинацию для моих конкретных нужд; Я хочу, чтобы мои более гибкие реализации были примерно на одном уровне с реализациями JDK по умолчанию (которые уже точно настроены, но, возможно, для другой версии JDK).

В долгосрочной перспективе мне нужно, чтобы эти вещи можно было легко воспроизвести и запустить повторно. В какой-то момент мы увидим JDK8. И на Dalvik VM результаты также могут отличаться от результатов на Java 7. Черт возьми, они могут даже отличаться на процессорах AMD, Core i7 и Atom. Так что, возможно, Cervidae будет включать разные стратегии сортировки и выбирать наиболее подходящую во время загрузки класса.

Мои текущие усилия сосредоточены на GitHub: https://github.com/kno10/cervidae.

Итак, теперь к самому вопросу. Последний коммит суппорта добавил экспериментальный код для макротестов. Однако я столкнулся с проблемой, что мне нужны оба. Макротесты Caliper терпят неудачу, когда время выполнения составляет менее 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 происходила в цикле тестирования? Прямо сейчас он регистрирует ошибку, но, может быть, он может просто перезапустить эту часть теста?


person Erich Schubert    schedule 05.04.2013    source источник
comment
Возможно, слишком поздно для вас, но есть новая (она была запущена несколько недель назад) часть инструмента бенчмаркинга openJDK: openjdk.java.net/projects/code-tools/jmh, который должен решить некоторые проблемы, возникающие с суппортом. Создан некоторыми инженерами по производительности в Oracle. Отказ от ответственности: я еще не пробовал, но это кажется многообещающим.   -  person assylias    schedule 05.04.2013
comment
Спасибо. JMH выглядит многообещающе. Кроме того, потому что он кажется менее ориентированным на веб-интерфейс, чем суппорт. Кроме того, он не требует столько зависимостей. Одна вещь, которую я действительно ненавижу во многих текущих проектах Java, — это массивные цепочки зависимостей, которые вы получаете повсюду. Caliper не является исключением из этого, в зависимости, например, от спящего режима, вытягивая еще как минимум 20 зависимостей. Может и попробую - чем раньше, тем лучше. Например, я еще не начал обновлять свои тесты кучи до версии 1.0. Для них также потребуются гораздо более сложные рабочие нагрузки, чем сортировка.   -  person Erich Schubert    schedule 05.04.2013
comment
RE: веб-интерфейс. Сегодня выпускается версия, совместимая с HEAD. :-)   -  person gk5885    schedule 09.04.2013
comment
RE: Компиляция горячих точек. Я хотел бы представить такое поведение, но были некоторые проблемы с путем миграции для людей, использующих Caliper 0.5, и с разницей в поведении. Промежуточным решением было просто сообщить людям. Ошибка сейчас отслеживается. code.google.com/p/caliper/issues/detail?id= 238   -  person gk5885    schedule 09.04.2013
comment
@ gk5885 gk5885 я посмотрю на webui push, когда вернусь с PAKDD2013. что касается повторного запуска при компиляции точки доступа: действительно ли есть путь обновления с 0.5? Мне пришлось довольно много изменить с декабря 1.0 до текущей версии. в любом случае, я думаю, перезапуск при компиляции горячей точки можно сделать флагом командной строки.   -  person Erich Schubert    schedule 12.04.2013
comment
@assylias, с какими проблемами jmh справляется лучше, чем суппорт? мне на самом деле кажется, что суппорт используется немного более продвинутый (хотя, на мой взгляд, слишком толстый)   -  person Erich Schubert    schedule 12.04.2013
comment
@ErichSchubert Я не думаю, что для теста должно быть слишком много изменений, но запуск команды немного отличается. code.google.com/p/caliper/wiki/CommandLineOptions был недавно обновлен. чтобы отразить новые параметры, так что, надеюсь, это должно помочь.   -  person gk5885    schedule 17.04.2013
comment
@assylias FWIW, мы видели этот тест и его комментарий и немного подозрительны по разным причинам. Методология, которую использует Caliper, представляет собой синтез опыта и советов многих давних разработчиков библиотек и платформ Java. Тем не менее, в jmh есть интересные аспекты, которые стоит изучить и провести сравнительный анализ, но, к сожалению, я не смог заставить его построить.   -  person gk5885    schedule 17.04.2013
comment
@gk5885 gk5885 Это было бы действительно интересно - вы также можете опубликовать сообщение в их списке рассылки, чтобы начать обсуждение. К вашему сведению, мне удалось довольно безболезненно создать его на Netbeans/Windows 7 в качестве проекта Maven.   -  person assylias    schedule 17.04.2013
comment
Итак, текстовый интерфейс ушел навсегда в Caliper 1.0?   -  person BeeOnRope    schedule 22.04.2013


Ответы (1)


Я думаю, что проблема в том, что вывод инструмента microbenchmark неверно интерпретируется как «жалоба». В нем говорится:

«ИНФОРМАЦИЯ: Этот эксперимент не требует микробенчмарка. Детализация таймера (%s) составляет менее 0,1%% измеренного времени выполнения. Если все эксперименты для этого эталонного теста имеют время выполнения больше %s, рассмотрите возможность использования инструмента макротестирования».

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

person gk5885    schedule 09.04.2013