¿La multiplicación entera es realmente la misma velocidad que la suma en la CPU moderna?

Escucho esta declaración con bastante frecuencia, que la multiplicación en el hardware moderno está tan optimizada que en realidad es la misma velocidad que la suma. ¿Es eso cierto?

Nunca puedo obtener ninguna confirmación autorizada. Mi propia investigación solo agrega preguntas. Las pruebas de velocidad generalmente muestran datos que me confunden. Aquí hay un ejemplo:

#include <stdio.h>
#include <sys/time.h>

unsigned int time1000() {
  timeval val;
  gettimeofday(&val, 0);
  val.tv_sec &= 0xffff;
  return val.tv_sec * 1000 + val.tv_usec / 1000;
}

int main() {
    unsigned int sum = 1, T = time1000();
    for (int i = 1; i < 100000000; i++) { sum += i + (i+1); sum++; }
    printf("%u %u\n", time1000() - T, sum);
    sum = 1;
    T = time1000();
    for (int i = 1; i < 100000000; i++) { sum += i * (i+1); sum++; }
    printf("%u %u\n", time1000() - T, sum);
}

El código anterior puede mostrar que la multiplicación es más rápida:

clang++ benchmark.cpp -o benchmark
./benchmark
746 1974919423
708 3830355456

Pero con otro compilador, otros argumentos del compilador, un bucle interno escrito de manera diferente, los resultados pueden variar y ni siquiera puedo obtener una aproximación.

Respuestas a la pregunta(8)

Su respuesta a la pregunta