Должен ли я использовать умножение или деление? - PullRequest
111 голосов
/ 22 октября 2008

Вот глупый забавный вопрос:

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

y = x / 2.0;
// or...
y = x * 0.5;

Предполагая, что мы используем стандартные операторы, предоставляемые с языком, какой из них имеет лучшую производительность?

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

Хотя лично мне интересен ответ для Python 2.4-2.5, не стесняйтесь также публиковать ответ и для других языков! И если вы хотите, не стесняйтесь публиковать и другие причудливые способы (например, используя операторы побитового сдвига).

Ответы [ 25 ]

1 голос
/ 06 ноября 2010

Как и в постах № 24 (умножение быстрее) и № 30 - но иногда они так же просты для понимания:

1*1e-6F;

1/1e6F;

~ Я нахожу их обоих так же легко читать, и мне приходится повторять их миллиарды раз. Поэтому полезно знать, что умножение обычно происходит быстрее.

1 голос
/ 22 октября 2008

Я бы предложил умножение в целом, потому что вам не нужно тратить циклы, гарантируя, что ваш делитель не равен 0. Это, конечно, не относится, если ваш делитель является константой.

0 голосов
/ 05 марта 2015

После такой долгой и интересной дискуссии я могу принять следующее: окончательного ответа на этот вопрос нет. Как отмечали некоторые люди, это зависит как от аппаратного обеспечения (cf piotrk и gast128 ), так и от компилятора (тесты cf @ Javier ). Если скорость не критична, если вашему приложению не требуется обрабатывать в реальном времени огромное количество данных, вы можете выбрать четкость, используя деление, тогда как, если скорость обработки или загрузка процессора являются проблемой, умножение может быть самым безопасным. Наконец, если вы точно не знаете, на какой платформе будет развернуто ваше приложение, тестирование не имеет смысла. И для ясности кода, единственный комментарий сделает работу!

0 голосов
/ 22 октября 2008

Хорошо, если мы предположим, что операция сложения / вычитания стоит 1, то умножим затраты на 5 и разделим затраты на 20.

0 голосов
/ 20 января 2012

Технически нет такой вещи, как деление, есть просто умножение на обратные элементы. Например, вы никогда не делите на 2, вы фактически умножаете на 0,5.

«Деление» - давайте подумаем, что оно существует на секунду - всегда сложнее, чем умножение, потому что для «деления» x на y сначала нужно вычислить значение y^{-1}, чтобы y*y^{-1} = 1 затем сделайте умножение x*y^{-1}. Если вы уже знаете y^{-1}, то не рассчитывать его из y должно быть оптимизацией.

...