Вебинары Разобраться в IT Реферальная программа
Программирование Аналитика Дизайн Маркетинг
ПРИХОДИТЕ УЧИТЬСЯ НОВОЙ ПРОФЕССИИ ЛЕТОМ СО СКИДКОЙ ДО 70% Забронировать скидку
10 Июл 2023
2 мин
68

Почему в Java выражение 2 * (i * i) работает быстрее, чем 2 * i * i?

В мире программирования на Java нередко возникает интересный вопрос о том, как скобки влияют на скорость выполнения арифметических операций. Рассмотрим

В мире программирования на Java нередко возникает интересный вопрос о том, как скобки влияют на скорость выполнения арифметических операций. Рассмотрим простой пример. Предположим, у нас есть цикл, в котором происходят вычисления:

int n = 0;
for (int i = 0; i < 1000000000; i++) {
    n += 2 * (i * i);
}

И если заменить выражение 2 * (i * i) на 2 * i * i, то время выполнения программы увеличится. Но почему это происходит?

Сначала следует понимать, что Java следует правилам приоритета операций и ассоциативности. В нашем случае, умножение (*) имеет одинаковый приоритет и ассоциативность слева направо. Это означает, что в выражении 2 * i * i сначала произойдет умножение 2 * i, а затем результат умножится на i. Но когда мы используем скобки, как в выражении 2 * (i * i), мы меняем порядок операций, заставляя сначала умножить i * i, а затем результат умножить на 2.

На первый взгляд кажется, что это не должно влиять на производительность, но на самом деле дело в том, как Java оптимизирует операции умножения. Умножение на 2 — это очень простая операция, которую Java может оптимизировать, превратив ее в битовый сдвиг влево. Это гораздо быстрее обычного умножения, и Java может использовать эту оптимизацию, когда знает, что один из операндов равен 2.

В случае 2 * (i * i), Java видит, что мы умножаем результат i * i на 2 и может использовать оптимизацию. Но в случае 2 * i * i, Java не может быть уверена, что результат 2 * i будет умножаться на 2, поэтому не может применить оптимизацию, что приводит к более медленному выполнению.

Таким образом, хотя кажется, что скобки не должны влиять на производительность, на практике они могут иметь значение из-за того, как Java оптимизирует определенные виды операций.

Добавить комментарий

Подарок
Забрать подарок