2013-08-24 8 views
0

В последнее время я слышал, что оператор% является дорогостоящим с точки зрения времени.Время, затраченное на выполнение%/* + - операции

Итак, вопрос в том, есть ли способ быстрее найти остаток?

Также ваша помощь будет оценена, если кто-то может сказать разницу в выполнении операций%/* + -.

ответ

0

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

Обратите внимание, что несколько процессоров даже не имеют операции умножения, и поэтому (на этих) умножение происходит довольно медленно и добавляет (не менее 64x для 32-разрядного умножения). (Но умный компилятор может улучшить это, если множитель является литералом.) Немного большее число не имеет операции деления или имеет довольно медленный. (На процессоре с умножением умножения множителя может быть только порядка 4 раз медленнее, чем добавлять, но на «нормальном» оборудовании он в 16-32 раза медленнее для 32-разрядной операции. Разделить по своей сути в 2-4 раза медленнее, чем умножить, но может быть намного медленнее на некоторых аппаратных средствах.)

Операция с остатком редко реализуется в аппаратных средствах, и обычно A % B отображает что-то вдоль линий A - ((A/B) * B) (для обеспечения правильного знака может потребоваться несколько дополнительных операций и т. д.).

(я узнал об этом материале, в то время как микропрограммный набор инструкций для SUMC computer for RCA/NASA еще в начале 70-х лет.)

+1

Остальная часть (для '%') довольно часто выводится как часть операции деления. x86 и MIPS реализуют это, что охватывает довольно большой набор современных процессоров. – nneonneo

+0

@nneonneo - Ах, да, я забыл об этом. Хотя несколько процессоров не покрывают остаток от разрыва (как отдельный результат), и часто оставшаяся часть полученная таким образом не соответствует определению языка. В стороне, иногда разочаровывает то, что ни один общий язык не предусматривает операцию * деления с остатком *, поскольку, когда вам нужен остаток, вам часто требуется частное. (Хотя я предполагаю, что некоторые компиляторы могут оптимизировать две операции вместе при правильных обстоятельствах.) –

+0

Python является обычным явлением, и он имеет 'divmod' именно для этой цели :) – nneonneo

0

Нет, компилятор собирается реализовать% наиболее эффективным способом.

С точки зрения скорости, + и - являются самыми быстрыми (и одинаково быстрыми, как правило, с помощью одного и того же оборудования).

*, /, и% намного медленнее. Умножение в основном осуществляется с помощью метода, который вы изучаете в начальной школе, - умножайте первое число на каждую цифру во втором номере и добавляйте результаты. С некоторыми хаками стало возможным бинарное. Несколько лет назад умножение было на 3 раза медленнее, чем добавление. Отдел должен быть аналогичен размножению. Остаток похож на деление (на самом деле он обычно вычисляет оба сразу).

Точные различия зависят от типа ЦП и точной модели. Вам нужно будет искать задержки в спецификациях CPU для вашей конкретной машины.

+0

Есть ли источник я могу получить более подробную информацию? Может быть, мне не хватает чего-то спросить. –

+0

Лучший способ узнать об этом - научиться сборке и цифровой схеме. В качестве бонуса вы узнаете, как ваш компьютер действительно работает и как делаются под капотом. –

Смежные вопросы