Эффективность Java Loop. если-продолжить ИЛИ если - PullRequest
2 голосов
/ 08 октября 2010

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

Скажем так.У меня есть массив {'a', 'x', 'a', 'a'} и цикл, который должен избегать 'x' элемента. Теперь мне интересно, как эти два подхода отличаются с точки зрения эффективности - не берется время, или время, или для разграничения циклов

char[] arrExample = {'a','x','a','a'};
for(int idx = 0; idx<arrExample.length; idx++){
    if(arrExample[idx] == 'x')
        continue;

    System.out.println(arrExample[idx]);
}

и общий цикл выглядит следующим образом

char[] arrExample = {'a','x','a','a'};
for(int idx = 0; idx<arrExample.length; idx++){
    if(arrExample[idx] != 'x')
        System.out.println(arrExample[idx]);
}

так что комментарии экспертов рады,Спасибо!

Ответы [ 7 ]

5 голосов
/ 08 октября 2010

Даже если вы перешли на неоптимизированный байт-код, он будет практически идентичен. Есть только две настоящие отличия. Первым является размещение оператора перехода, но этот оператор перехода будет по-прежнему выполняться столько же раз. Кроме того, операторы == и! = Являются атомарными, и для их выполнения требуется одинаковое количество времени.

Как уже было сказано, используйте все, что имеет для вас смысл. Но я должен признать, что эту версию заявления о продолжении довольно неудобно читать.

3 голосов
/ 08 октября 2010

Если вы не профилировали свое приложение на реальных входных данных и не определили, что этот конкретный цикл занимает значительное количество времени, вам не следует беспокоиться о ручной оптимизации кода на этом уровне:

  • Скорее всего, этот конкретный цикл не имеет существенного значения для общей производительности.
  • Скорее всего, рассматриваемые вами изменения не будут иметь никакого значения.
  • Даже если это произойдет, есть вероятность, что наиболее эффективный код будет зависеть от аппаратной платформы и версии JVM. (Компиляторы JIT постоянно совершенствуются.)

На самом деле, специалисты Sun заявили, что, написав ваш код сложным способом, вы можете затруднить работу оптимизатора JIT. Таким образом, хотя некоторая ручная оптимизация может улучшить производительность с одной версией JVM, такая же оптимизация может фактически ухудшить производительность с другой версией.

3 голосов
/ 08 октября 2010

Я бы сказал, что если вы обеспокоены тем, что вы смотрите на слишком низкий уровень.Скорее всего, нет заметной разницы.

Обычно я предпочитаю не использовать код продолжения, а использовать вместо него символ! =, Поскольку это приводит к получению более приятного кода ... но это не всегда так.

Предпочитатьясность кода / скорость к скорости, если скорость не оказывается проблемой.

3 голосов
/ 08 октября 2010

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

2 голосов
/ 08 октября 2010

Производительность в том, что вы не видите большой разницы, но вторая выглядит более читабельной.

Даже если есть (очень незначительная) разница в производительности, я бы выбрал второе.

1 голос
/ 08 октября 2010

Если вы действительно, действительно заботитесь об эффективности этого цикла, то у вас есть два варианта, как я это вижу:

  • Измерьте это (на платформе, которая вас интересует)
  • Проверьте сгенерированный байт-код, чтобы увидеть, какой из них более эффективен.

Но на самом деле, как указала Амбер, вы должны получить идентичные байтовые коды с полудоправимым компилятором. Так что используйте то, что кажется более понятным. Для меня, особенно с немного большим корпусом для if, если продолжить, то прояснится.

0 голосов
/ 01 июня 2012

сложность обоих циклов одинаковы, ни один из них не даст вам существенных отличий. Лично я не хочу жертвовать читаемостью кода ради экономии микросекунд.

Допустим, вы выбрали одну из вышеуказанных реализаций. Разные компиляторы будут производить разную оптимизацию, и ваша «экономия микросекунд» может исчезнуть.

С точки зрения читабельности кода, я предпочитаю тот, у которого нет продолжения или прерывания.

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