Страницы

Поиск по вопросам

среда, 1 января 2020 г.

Производится ли оптимизация вызовов функций при умножении на ноль?

#java


Пусть, есть выражение:

int result = a1*function1() + a2*function2();


Где a1,2 - это коэффициенты 0 или 1.
А function1,2 - это довольно тяжеловесные по вычислительной сложности функции.

То если a1, например, равен нулю, будет ли вычисляться function1()? Или сразу примет
значение 0?
    


Ответы

Ответ 1



То если a1, например, равен нулю, будет ли вычисляться function1()? Или сразу примет значение 0? Будет. Укороченная оценка (Short-circuit evaluation) работает только для двух логических (булевых) операторов && и ||.

Ответ 2



Простейший способ узнать это, не прибегая к помощи SO - отладочный вывод в помощь: @Test public void ttt() { int a1 = 0; int a2 = 1; int result = a1 * function1() + a2 * function2(); System.out.println(result); } private int function1() { int result = 1; for(int i = 0; i < 1000; i++) { result *= new Random().nextInt() * new Random().nextInt(); } System.out.println("func1 calculated"); return result; } private int function2() { int result = -100500; for(int i = 0; i < 1000; i++) { result += new Random().nextInt() + new Random().nextInt(); } System.out.println("func2 calculated"); return result; } func1 calculated func2 calculated -1045391715 Ответ: да, function1 будет вычисляться.

Комментариев нет:

Отправить комментарий