Цикл с пустым телом в Java - PullRequest
       1

Цикл с пустым телом в Java

6 голосов
/ 11 января 2012

Во время исправления ошибки в очень старом проекте я столкнулся со странным методом, он выглядит так:

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

Вызывает ли это остановку на некоторое время, или это будет опущено при оптимизации JVM?

Ответы [ 4 ]

5 голосов
/ 11 января 2012

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

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

Java: сколько времени использует пустой цикл?

2 голосов
/ 11 января 2012

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

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

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

1 голос
/ 11 января 2012

Не знаю, изменилось ли оно, я не пользовался 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 голосов
/ 11 января 2012

Да, это будет оптимизировано. Я пробовал: D

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