Antes que alguien se cuestione a raiz de la lectura de Sieve en C, si realmente es x64 más lento que x86, voy a adelantarme, y aclarar algunos conceptos.

La respuesta rápida es que si, que x64 puede llegar a ser más lento que x86. Esto ocurrirá en los caos en que el código no pueda sacar ventaja de ninguna de las mejoras de la arquitectura x64. Esto pasará en raros casos, donde el código solamente maneje enteros, y acceda a bloques de memoria de 4 bytes, como era el caso de Sieve. La pérdida de rendimiento en esta situación suele ser entorno al 5%, debida a la sobrecarga de manejar punteros largos.

En la mayoría de aplicaciones, como ya vimos con 7-Zip o MySQL, dará una mejoría en x64 de entre el 5% y el 25%. Claro está que a medida que pase el tiempo, y la arquitectura, así como los compiladores vayan mejorando, estas diferencias irán aumentando, y es que sobre x86, no hay ya mucho que mejorar.

Si hablamos de código, que maneja enteros de 64 bits, o accede a datos en bloques de al menos ese tamaño, la situación sería justo la opuesta a la primera, y tendríamos como en x86 vs x64 (Continuación), incrementos de rendimiento de más del 200%.

Ahora bien, sobre el caso que nos ocupa, que es el Sieve en C, ¿qué pasaría si manipulásemos el algoritmo, para de forma artificial requerir enteros de 64 bits? Aplicamos los cambios necesarios, y el código quedaría así:

...
long long i, k, iter, count;
...
printf("%lld iterations\n", ITER);
...
printf("%lld primes in %ld ms.\n", count, (end-start));
...

Lo ejecutamos, y tenemos:
– x86: 54.615 ms (100%).
– x64: 32.996 ms (165%).

Ya para terminar, quiero remarcar el mensaje final. Las aplicaciones nativas x64 son en el 95% de los casos más veloces que las x86. En el 5% restante, serán mucho más rápidas, o marginalmente menos.