Mejora de velocidad del código: no pases estructuras de más de 16 bytes en AMD64
- Para mejorar el rendimiento del lenguaje Neat, se cambió la forma de pasar arreglos: en lugar de usar un solo parámetro de estructura, ahora se usan tres parámetros de puntero.
- La razón por la que los arreglos de Neat eran más lentos que los del lenguaje D es que su tamaño de 24 bytes supera los 16 bytes, por lo que los parámetros se pasan de una manera distinta.
- Según la especificación SystemV AMD64 ABI, todas las estructuras que superan los 16 bytes se pasan mediante punteros.
Verificación del problema mediante benchmarks
- Con benchmarks se comprobó la diferencia de rendimiento entre pasar una estructura completa y pasar campos individuales.
- Al pasar una estructura, es necesario asignarla en la pila y copiarla, mientras que al pasar campos individuales se pueden enviar directamente por registros SSE.
- Pasar campos individuales ofrece un rendimiento aproximadamente 2 veces mayor que pasar la estructura completa.
La elección del diseñador del lenguaje
- Al llamar una API de C, se debe seguir la ABI de C, pero los tipos de alto nivel usados internamente no tienen por qué representarse como estructuras.
- El diseñador del lenguaje puede decidir cómo se pasarán arreglos, tuplas y tipos suma.
- Pasar como campos individuales los tipos que superan los 16 bytes puede ayudar a mejorar el rendimiento.
La opinión de GN⁺
- Este artículo es muy útil para desarrolladores interesados en la optimización de software.
- En especial, muestra que el tamaño de una estructura y su forma de pasarse pueden tener un impacto importante al desarrollar aplicaciones sensibles al rendimiento.
- Los diseñadores de lenguajes o desarrolladores de APIs pueden aprovechar esta información para encontrar oportunidades de mejora de rendimiento.
1 comentarios
Opiniones de Hacker News
struct Vectorpara pasarlo por referencia comoconst struct Vector &, sin afectar a quien llama. Mucho código C++ con bugs de punteros usó punteros innecesariamente, cuando pasar por referencia habría sido más fácil y seguro de usar.