Подтвердить что ты не робот

Который стоит больше зацикливания; присвоение или if-statement?

Рассмотрим следующие два сценария:

boolean b = false;
int i = 0;
while(i++ < 5) {
    b = true;
}

ИЛИ

boolean b = false;
int i = 0;
while(i++ < 5) {
    if(!b) {
        b = true;
    }
}

Что более "дорого"? Если ответ зависит от используемого языка/компилятора, предоставьте. Основным языком программирования является Java.

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

4b9b3361

Ответ 1

Пожалуйста, не забывайте правила Клуба Оптимизации.

  • Первое правило Optimization Club - это не оптимизация.
  • Второе правило Клуба Оптимизации - это не оптимизация без измерения.
  • Если ваше приложение работает быстрее, чем базовый транспортный протокол, оптимизация завершена.
  • Один фактор за раз.
  • Нет рыночных мер, нет графиков рынка.
  • Тестирование будет продолжаться до тех пор, пока оно должно быть.
  • Если это ваша первая ночь в Оптимизационном клубе, вам нужно написать тестовый пример.

Кажется, что вы нарушили правило 2. У вас нет никаких измерений. Если вы действительно хотите знать, вы сами ответите на вопрос, настроив тест, который запускает сценарий A против сценария B и находит ответ. Существует так много различий между разными средами, мы не можем ответить.

Ответ 2

Вы проверили это? Работая над системой Linux, я помещаю ваш первый пример в файл LoopTestNoIf.java, а второй - в файл LoopTestWithIf.java, завернул основную функцию и класс вокруг каждого из них, скомпилировал и затем выполнил с помощью этого bash script:

#!/bin/bash
function run_test {
  iter=0
  while [ $iter -lt 100 ]
  do
    java $1
    let iter=iter+1
  done
}
time run_test LoopTestNoIf
time run_test LoopTestWithIf

Результаты:

real    0m10.358s 
user    0m4.349s 
sys     0m1.159s 

real    0m10.339s
user    0m4.299s 
sys     0m1.178s

Показывая, что наличие if делает это немного быстрее в моей системе.

Ответ 3

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

В приведенном выше примере я бы предположил, что первое быстрее. Вы выполняете 5 заданий. В последнем вы выполняете 5 тестов, а затем задание.

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

Ответ 4

Любой компилятор (за исключением, возможно, отладки) будет оптимизировать оба этих оператора для

bool b = true;

Но, как правило, относительная скорость присваивания и ветки зависит от архитектуры процессора, а не от компилятора. Современный суперскалярный процессор работает на ветвях. Простой микроконтроллер использует примерно одинаковое количество циклов для каждой инструкции.

Ответ 5

Относительно вашего примера barebones (и, возможно, вашего реального приложения):

boolean b = false;
// .. other stuff, might change b
int i = 0;
// .. other stuff, might change i
b |= i < 5;
while(i++ < 5) {
    // .. stuff with i, possibly stuff with b, but no assignment to b
}

проблема решена?

Но на самом деле - речь идет о стоимости вашего теста (обычно больше, чем просто if (boolean)) и стоимости вашего задания (обычно больше, чем просто primitive = x). Если тест/назначение дорогостоящий или цикл достаточно длинный или у вас достаточно высокие требования к производительности, вы можете разбить его на две части - но для всех этих критериев требуется, чтобы вы тестировали, как это работает. Конечно, если ваши требования более требовательны (например, b может переворачиваться назад и вперед), вам может потребоваться более сложное решение.