2010-12-03 1 views
7

Если я разрабатываю тест по алгоритму сортировки, могу ли я сделать этот способ, чтобы избежать прогрева JVM? Спасибо!Избегайте разогрева 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 
+2

Вы все еще пытаетесь сравнить 5 000 элементов, или решили ли вы следовать рекомендациям, приведенным в предыдущем вопросе? И если вы решили следовать этому совету, вы должны принять один из ответов. – Anon 2010-12-03 13:38:32

+0

Спасибо Anon, я сделаю это – Ang 2010-12-03 13:50:01

ответ

5

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

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


В this little case study ЛТ компиляции ногами после 1700 звонков.

0

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

3

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

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

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

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

2

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

1) обеспечить свой полный тест (включая итерации цикла) находится в подпрограмме, которая повторно вызывается. Таким образом, ваш тест имеет цикл for() в «родительском» методе. подтолкните его к «ребенку» и вызовите это несколько раз. Это позволяет различным технологиям JIT действительно выполнять полную оптимизацию без необходимости замены кода в полете (dynamic loop transfer и т. Д.)

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

Смежные вопросы