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.
Al margen de lo que comentas, hay varias cosas más que considerar respecto al rendimiento. En general, no solo los punteros en x64 son más largos, las propias instrucciones también lo son. Ello provoca que en una línea de caché quepan menos instrucciones de x64 que de x86. Por contra, el juego de instrucciones x64 es un poco más ortogonal y tiene mayor cantidad de registros disponibles, lo que hace que el compilador tenga que hacer un trabajo más parecido al de un compilador para RISC que al de un CISC clásico.
La realidad es que en tareas intensivas del tipo de tu ejemplo, es más fácil sacar ventajas evidentes al código de x64. Para muchas otras cosas, si no necesitas manejar más de 4 GB de datos, es más que discutible. En Linux están probando desde hace tiempo un modo mixto que dicen que da buen rendimiento, con parte de las ventajas de x64 y parte de las ventajas de x86. Veremos en qué acaba la cosa.
Totalmente de acuerdo en que x64 no siempre es más veloz que x86, sin embargo si que en general lo es igual o más, aunque obviamente haya excepciones.
Llevo defendiendo x64 desde hace casi 10 años, y no ha sido hasta muy recientemente que empiezo a ver que los desarrolladores se lo toman en serio.
No comprendía como Photoshop por ejemplo, donde fácilmente puede superar los 2 GB de uso de memoria no tenía una versión x64. O que aplicaciones de cálculo intensivo como WinRAR necesitaran tanto tiempo para lanzar una de 64 bits.