2012-01-11 3 views
6

При исправлении ошибки в очень старом проекте я столкнулся со странным методом, это выглядит следующим образом:Петля с пустым телом в Java

void waiter() { 
     for (int i = 0; i < 20000; i++) ; 
    } 

ли это причиной остановки некоторое время или он будет пропущен Оптимизация JVM?

+1

Почему бы лет uever написать такой кусок ... кода? –

+0

Это не мое, я только начал работать с этим проектом ...: D –

+0

Я думаю, чтобы приостановить выполнение программы, он использует эту логику. ;) –

ответ

5

Он будет оптимизирован после нескольких прогонов с помощью JIT. JVM при первом запуске должен проверить, не используется ли значение, если значение i, которое увеличивается.

Проверить эту статью, а также:

Java: how much time does an empty loop use?

2

Может быть оптимизирован, возможно, нет. Зависит от уровня оптимизации в компиляторе.

Переменная i относится к петле, поэтому она не будет доступна после. Компилятор способен идентифицировать статически, что цикл будет выполняться известным числом раз. Он также знает, что пустое утверждение повторяется много раз. Затем он может преобразовать несколько пустых операторов в один пустой оператор или вообще не указывать. Это приводит к удалению кода из абстрактного дерева синтаксиса.

Это произойдет при некоторых настройках оптимизации и компиляторах, а не под другими.

+0

Не могли бы вы поддержать его с некоторой документацией? Под «оптимизированным» вы подразумеваете «удаленный»? Казалось бы странным, что компилятор опускает какой-то фрагмент кода. –

+0

@ ŁukaszBachman Оптимальный случай пропускает этот код и настройку i 20000. – holgac

+0

Даже не это, потому что 'i' привязано к циклу! – Joe

1

Я не знаю, изменилось ли оно, я не использовал java в течение 2 лет, но, похоже, это не так.

http://www.herongyang.com/JVM/Benchmark-Int-Empty-Loop-16-Nanosecond.html http://www.herongyang.com/JVM/Benchmark-Long-Empty-Loop-25-Nanosecond.html

Этот тест также подтверждает, что Java байт-код компилятор "Javac" является а не делать любую оптимизацию для замены пустого цикла на «i = steps» , который является чистым эффектом цикла.

+0

javac не сделал, не делает и никогда не будет делать каких-либо интересных оптимизаций. И ссылка показывает один из тестов набора номера. Независимо от того, насколько велика вы устанавливаете значение счетчика, вы получите тот же результат: вы запускаете цикл ~ 10k раз в интерпретаторе, JIT запускается и удаляет остальную часть цикла независимо от того, насколько велика. Хотя в этом случае это, по-видимому, является предполагаемым результатом. – Voo

0

Да, это будет optimised.I've пробовал: D

+0

С каким компилятором/настройкой? –

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