Избегайте разминки jvm - PullRequest
       1

Избегайте разминки jvm

8 голосов
/ 03 декабря 2010

Если я разрабатываю тест алгоритма сортировки, могу ли я сделать так, чтобы избежать разогрева JVM? Спасибо!

double count = 0;
double start, end;
for(int r = 0; r < warmup; r++) {
    // do test
}
for(int t = 0; t < runs; t++){
    start = System.nanoTime();
    // do test
    end = System.nanoTime();
    count += start - end;
}
double avg = count/avg

Ответы [ 4 ]

6 голосов
/ 03 декабря 2010

Под прогревом JVM обычно понимается время, которое требуется JVM для поиска горячих точек и JIT этих разделов кода.Если вы проводите свои реальные тесты несколько сотен (на самом деле, я полагаю, нескольких тысяч) раз, вы должны быть достаточно хороши.

Однако вы должны знать, что, даже если вы делаете это, никаких гарантий нет.Вам нужно будет поэкспериментировать с вашей конкретной JVM, чтобы выяснить, сколько работы вам нужно сделать, прежде чем жизненно важные части JITed и т. Д.


В это небольшое тематическое исследование JIT-компиляция началась после 1700 звонков.

3 голосов
/ 03 декабря 2010

Если я разрабатываю тест алгоритма сортировки, могу ли я сделать так, чтобы избежать разогрева JVM?

Сначала немного педантизма. Вы не должны избегать разогрева JVM. Это должно произойти. То, что вы пытаетесь сделать, это предотвратить прогрев JVM от искажения результатов теста.

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

Обычно я просто печатаю необработанные тайминги, отфильтровываю начальные итерации «прогрева», которые имеют аномальные временные значения «на глаз», а затем вычисляю средние значения вручную. Это неуклюже, но дает мне некоторую уверенность в том, что я учел прогрев и другие возможные источники аномалий.

2 голосов
/ 03 декабря 2010

Это очень большая область, но вот пара советов:

1) убедитесь, что ваш ПОЛНЫЙ тест (включая цикл итерации) находится в подпрограмме, которая неоднократно вызывается.Таким образом, ваш тест имеет цикл for () в методе «parent».нажмите его на «ребенка» и вызывайте его повторно.Это позволяет различным технологиям JIT действительно выполнять полную оптимизацию без необходимости замены кода в полете ( передача динамического цикла и т. Д.)

2).долгое время после долгой разминки.30 с - это минимум для реального периода измерения, после столь же длительного прогрева, если это возможно.Например, SPECjbb и т. Д. Выполняются в течение нескольких минут на одну итерацию для нескольких итераций.

0 голосов
/ 03 декабря 2010

Да. Поскольку цикл прогрева выполняет сам тест, это означает, что все классы и т. Д. Будут загружены и JIT-компиляции должны были быть запущены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...