Штангенциркуль: микро- и макро тесты

Для 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, рассмотрите инструмент макробенчмарка".

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

Другие вопросы по тегам