Это сильно зависит от архитектуры и модели процессора.
В прежние времена (приблизительно 1980-1990 гг.) количество единиц в двух числах было фактором — чем больше единиц, тем больше времени требовалось для умножения [после корректировки знака, поэтому умножение на -1 было не медленнее, чем умножение на 1, но умножение на 32767 (15 единиц) было заметно медленнее, чем умножение на 17 (2 единицы)]. Это потому, что умножение по существу:
unsigned int multiply(unsigned int a, unsigned int b)
{
res = 0;
for(number of bits)
{
if (b & 1)
{
res += a;
}
a <<= 1;
b >>= 1;
}
}
В современных процессорах умножение выполняется довольно быстро в любом случае, но 64-битное умножение может быть на один или два такта медленнее, чем 32-битное значение. Просто потому, что современные процессоры могут «позволить себе» уложить всю логику для этого за один цикл — как по скорости самих транзисторов, так и по площади, которую эти транзисторы занимают.
Кроме того, в старые времена часто были инструкции для получения результатов 16 x 16 -> 32 бит, но если вы хотели 32 x 32 -> 32 (или 64), компилятор должен был вызвать библиотечную функцию [или встроенную такую функция]. На сегодняшний день я не знаю ни одного современного высокопроизводительного процессора [x86, ARM, PowerPC], который не может выполнять по крайней мере 64 x 64 -> 64, некоторые делают 64 x 64 -> 128, и все это в одной инструкции (не всегда один цикл, хотя').
Обратите внимание, что я полностью игнорирую тот факт, что «наличие данных в кеше является важным фактором». Да, это фактор — и это немного похоже на игнорирование сопротивления ветра при движении со скоростью 200 км/ч — это совсем не то, что вы игнорируете в реальном мире. Впрочем, для ЭТОГО обсуждения это совершенно неважно. Точно так же, как люди, создающие спортивные автомобили, заботятся об аэродинамике, чтобы сложное [или простое] программное обеспечение работало быстро, требуется определенная забота о содержимом кеша.
person
Mats Petersson
schedule
08.03.2018
int
илиunsigned
. Следовательно, 123 * 456, а также 123456 * 7890 компилируются какint
*int
, если хотя бы одно из значений хранится в переменной. (Константы умножаются во время компиляции.) Исключением будет оптимизация для степени двойки, как уже упоминалось. - person Scheff's Cat   schedule 08.03.2018-m8bit-idiv
, но это скорее исключение, чем правило. Одно место, где вы найдете такие вещи, — это чрезвычайно сокращенные архитектуры набора команд, где умножение — это микрокодированная инструкция. хм. Заставляет меня задаться вопросом: является ли бит-аккумулятор nand текущим битовым стеком и бит-стеками обмена, если ложная машина Тьюринга завершена? - person technosaurus   schedule 08.03.2018