какой из них быстрее 5 + 5 + 5 + 5 + 5 или 5 * 5? - PullRequest
3 голосов
/ 21 января 2011

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

int a = 5 + 5 + 5 + 5 + 5

или

int b = 5 * 5 ?

Это зависит от языка?Я имею в виду, a быстрее, чем b в Java, но не в C

мой ответ a быстрее, чем b из-за сравнения сложения / умножения в компьютерной организации

Ответы [ 8 ]

14 голосов
/ 21 января 2011

Это зависит от платформы (и компилятора).Если вам нужно знать, то измерьте это.Маловероятно, что вы окажетесь в ситуации, когда вам нужно знать.

Однако в обоих ваших примерах они будут оцениваться во время компиляции (поэтому вычисления во время выполнения не будутбыть обязательным);см. например http://en.wikipedia.org/wiki/Constant_folding.

13 голосов
/ 21 января 2011

В вашем случае это ничего не меняет.Давайте скомпилируем:

public class Toto {
    public static void main(String[] args) {
        int a = 5 + 5 + 5 + 5 + 5;
        int b = 5 * 5;
    }
}

и проверим результат декомпиляции:

public class Toto
{
    public static void main(String args[])
    {
        byte byte0 = 25;
        byte byte1 = 25;
    }
}

Компилятор все встроил.

6 голосов
/ 21 января 2011

Оба являются константными выражениями, поэтому они будут упрощены до

int a = 25;
int b = 25;

во время компиляции (уверен на 100%, даже игрушечные компиляторы делают это, так как это одна из самых простых возможных оптимизаций).

В удаленном случае эти операции не упрощаются, если предположить, что существует JIT, который отображает умножение и добавляет коды операций в отношении 1: 1 к их аналогам команд ЦП, в большинстве современных архитектур все целочисленные арифметические операции обычно принимаютто же число циклов, поэтому умножение будет выполняться один раз быстрее, чем добавление в четыре раза (только что проверил, сложение по-прежнему немного быстрее, чем умножение: 1 такт против 3 тактов, поэтому здесь все равно нужно использовать умножение).

Даже в суперскалярной архитектуре, где за цикл может выдаваться более одной инструкции, цепочка операций добавления имеет зависимость от данных, поэтому они должны будут выполняться последовательно (а поскольку инструкция добавления составляет всего 1 цикл,возможно перекрытие трубопровода, все равно4 цикла).

В большинстве архитектур ЦП оптимальной последовательностью команд, вероятно, будет смещение двух позиций влево и добавление исходного значения (5<<2+5).

4 голосов
/ 21 января 2011

Здесь есть как минимум два вопроса: производительность базовых операций и что делает компилятор. (Фактически, что делают и компилятор 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».

1 голос
/ 21 января 2011

Все зависит от среды, которую вы используете:

  • Какой компилятор? Если он хороший, то он компилирует его в константы.

  • Какой остальной программный код? Если результат не используется, он компилируется в NOP (без операции).

  • на каком оборудовании он работает? Если у вас есть процессор, который супер-оптимизирован для умножения, а не для сложения, умножение может (в теории) быть быстрее, чем операция сложения

  • и т.д.

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

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

1 голос
/ 21 января 2011

Мы должны сравнить сложность времени. Функция f1(n) = n * c, эквивалент f2(n) = Sum[1->n] c.

Сложность для умножения составляет O(1) (постоянное время, один расчет для любого n), сложность для сложения равна O(n) (линейное время, количество сложений равно n).

0 голосов
/ 21 января 2011

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

Добавлено:

читать здесь для объяснения

0 голосов
/ 21 января 2011

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

Но во многих случаях сложение происходит быстрее, чем умножение.

...