Здесь есть как минимум два вопроса: производительность базовых операций и что делает компилятор. (Фактически, что делают и компилятор Java-to-bytecode и JIT-компилятор.)
Во-первых, вопрос о «сырых» операциях. Как правило, сложение, вычитание и умножение занимают примерно одинаковое время на большом количестве процессоров. Вы можете себе представить, что умножение намного медленнее, но оказывается, что это не так. Посмотрите, например, на эту статью , в которой приведены некоторые экспериментальные временные характеристики инструкций X86 на различных процессорах. В целом умножение немного медленнее, так как оно имеет более высокую задержку . Это фактически означает, что если бы процессор не делал ничего, кроме серии умножений для разных частей данных, это было бы немного медленнее, чем выполнение серии сложений для разных частей данных. Но при условии, что существуют другие инструкции о том, что может выполняться «в то время, как умножение заканчивается», то в итоге между сложением и умножением не будет большой разницы.
Я также недавно составил список таймингов инструкций с плавающей запятой, используемых Hotspot на 32-битном Pentium (цифры были взяты из руководства по процессорам Intel, и, насколько я помню, я тестировал экспериментально, что на практике это время вы получаете). Обратите внимание, что есть очень похожий шаблон: сложение, вычитание и умножение по существу занимают одно и то же время; деление заметно медленнее.
Затем, если вы посмотрите на таблицу на странице, которую я только что упомянул, вы увидите, что деления на степени 2 быстрее, потому что компилятор JIT может преобразовать их в умножение. Степени двух могут быть представлены точно в представлении с плавающей запятой, поэтому нет потери точности, если вы замените деление на x умножением на 1 / x, где x - степень 2.
Иными словами, и компилятор Java, и компилятор JIT могут применять различные оптимизации, которые означают, что лежащие в основе инструкции для данного фрагмента кода не обязательно являются теми, о которых вы думаете. Как уже упоминали другие, одна из самых основных частей оптимизации заключается в предварительном вычислении значений, так что если вы напишите «5 + 5 + 5 + 5 + 5», на самом деле компилятор Java должен заменить это на «25».