Lo siento si la pregunta suena estúpida. Solo soy vagamente consciente del problema de la alineación de datos y nunca he realizado ninguna programación de 64 bits. Estoy trabajando en un código x86 de 32 bits ahora mismo. Con frecuencia accede a una matriz de int. A veces se lee un entero de 32 bits. A veces se leen dos o más. En algún momento me gustaría hacer el código de 64 bits. Lo que no estoy seguro es si debo declarar esta matriz int como int
o long int
. Prefiero mantener el ancho del entero igual, por lo que no tengo que preocuparme por las diferencias. Aunque estoy algo preocupado de que leer/escribir una dirección que no está alineada con la palabra natural sea lenta.¿Hay una penalización de rendimiento que acceda a una matriz de enteros de 32 bits en x86-64?
Respuesta
Las penalizaciones por desalineación solo se producen cuando la carga o el almacén cruzan un límite de alineación. El límite es generalmente el menor de:
- La palabra de tamaño natural del hardware. (32 bits o 64 bits *)
- El tamaño del tipo de datos.
Si está cargando una palabra de 4 bytes en una arquitectura de 64 bits (8 bytes). No es necesario que esté alineado en 8 bytes. Solo necesita estar alineado a 4 bytes.
Del mismo modo, si está cargando un carácter de 1 byte en cualquier máquina, no es necesario alinearlo en absoluto.
* Tenga en cuenta que los vectores SIMD pueden implicar un tamaño de palabra natural más grande. Por ejemplo, SSE de 16 bytes aún requiere alineación de 16 bytes en x86 y x64. (Salvo explícitas cargas desalineadas/tiendas)
Así que en resumen, no usted no tiene que preocuparse acerca de los datos alineación. El lenguaje y el compilador hacen un gran esfuerzo para evitar que tengas que preocuparte por ello.
Así que simplemente quédate con el tipo de datos que tenga más sentido para ti.
Hay un montón de buena información disponible aquí: Performance 32 bit vs. 64 bit arithmetic
Incluso más información https://superuser.com/questions/56540/32-bit-vs-64-bit-systems, donde la respuesta afirma haber visto el peor frenar al 5% (a partir de una perspectiva de aplicación, no las operaciones individuales).
La respuesta corta es no, no tendrá un golpe de rendimiento.
Las CPU de 64 bits x86 siguen estando muy optimizadas para una manipulación eficiente de los valores de 32 bits. Incluso en sistemas operativos de 64 bits, el acceso a valores de 32 bits es al menos tan rápido como el acceso a valores de 64 bits. En la práctica, en realidad será más rápido porque se consume menos espacio en la memoria caché y el ancho de banda de la memoria.
Cada vez que accede a una ubicación de memoria, se lee una línea de caché completa en la caché L1, y cualquier acceso posterior a cualquier elemento en esa línea es lo más rápido posible. A menos que su acceso de 32 bits cruce una línea de caché (que no será si está en una alineación de 32 bits) será tan rápido como un acceso de 64 bits.
No del todo. El acceso a 1 valor será el mismo. Si accede a * otro * valor de 32 bits que se encuentra en la misma línea de caché, ya estará allí; incluso lo indicará con "subsiguiente ...". El uso de tamaños de datos más pequeños generalmente es más compatible con la caché debido a la carga de más elementos de datos por línea de caché. – phkahler
- 1. ¿Hay una penalización de rendimiento bajar la versión del SDK
- 2. Empaquetado de bits de una matriz de enteros
- 3. C# - ¿Hay una biblioteca de matemática flotante de 32 bits?
- 4. enteros de 32 bits sin signo en Javascript
- 5. ¿Por qué usar enteros menores que 32 bits?
- 6. __int64 en una máquina de 32 bits?
- 7. ¿Hay alguna manera de multiplicar correctamente dos enteros de 32 bits en Javascript?
- 8. .NET Cronómetro - penalización de rendimiento
- 9. ¿Puedo ejecutar una imagen de VMware de 64 bits en una máquina de 32 bits?
- 10. ¿Hay una penalización de rendimiento al "esconder" objetos de la pantalla en cantidades ridículas?
- 11. multiplicación SSE de 4 enteros de 32 bits
- 12. ¿Es posible acceder a un dll de 64 bits desde una aplicación de 32 bits?
- 13. ¿Por qué los finalizadores tienen una "penalización severa de rendimiento"?
- 14. Rendimiento de punto flotante de 32 bits frente a de 64 bits
- 15. Interlocked.Increment una matriz de enteros
- 16. ¿Qué tiene de malo cambiar 32 bits de una variable de 32 bits?
- 17. Utilizando una DLL de 32 bits en un proceso de 64 bits a través de COM
- 18. ¿Hay una diferencia de velocidad de colisión entre un hash de 32 bits frente a dos hash de 16 bits?
- 19. ¿Cómo convertir una imagen IplImage * OpenCV de 8 bits a una IplImage * de 32 bits?
- 20. Penalización de rendimiento para argumentos indefinidos
- 21. Ejecución de una aplicación C# de 32 bits en una máquina de 64 bits
- 22. @ServiceHost Debug = "true" - ¿penalización de rendimiento?
- 23. ¿Cómo hago referencia a una DLL de 32 bits en un proyecto de 64 bits?
- 24. Formas de acceder a una DLL de 32 bits desde un exe de 64 bits
- 25. conversión de aplicación .NET 32 bits a 64 bits
- 26. JavaScript - Ordena una matriz basada en otra matriz de enteros
- 27. Conversión de punto flotante de 32 bits a 16 bits
- 28. ¿Alguna razón para usar enteros de 32 bits para operaciones comunes en la CPU de 64 bits?
- 29. Penalización de rendimiento de getSerializedSize() en Buffers de protocolo
- 30. Cómo resumir una matriz de enteros en C#
Si desea enteros de ancho fijo, intente: 'int32_t' en' ' –
Mysticial
' int' es el tipo natural para la arquitectura. A menos que tenga una buena razón para usar un tipo diferente, no lo haga. –
@PeteBecker No, no lo es. 'int' todavía tiene 32 bits en la mayoría de los sistemas hoy en día. – Mysticial