c++ performance calling-convention fastcall

c++ - ¿Es fastcall realmente más rápido?



performance calling-convention (4)

¿Es la convención de llamada fastcall realmente más rápida que otras convenciones de llamada, como cdecl?

Creo que la implementación de fastcall de fastcall en x86 y x64 implica pasar los dos primeros parámetros en registros en lugar de en la pila.

Dado que normalmente guarda al menos cuatro accesos de memoria, sí, generalmente es más rápido. Sin embargo, si la función involucrada está sin registro y, por lo tanto, es probable que las escriba a los locales en la pila, no es probable que haya un aumento significativo.

¿Es la convención de llamada fastcall realmente más rápida que otras convenciones de llamada, como cdecl? ¿Hay algún punto de referencia que muestre cómo el rendimiento se ve afectado por la convención de llamadas?


En x86 moderno - no. Entre la memoria caché L1 y la alineación no hay lugar para llamadas rápidas.


La convención de llamadas (al menos en x86) no hace mucha diferencia en la velocidad. En Windows, _stdcall se convirtió en el valor predeterminado porque produce resultados tangibles para programas no triviales en el sentido de que generalmente resulta en un tamaño de código menor en comparación con _cdecl . _fastcall no es el valor predeterminado porque la diferencia que hace es mucho menos tangible. Lo que compensa en el paso de argumentos a través de los registros se pierde en cuerpos de función menos eficientes (como lo mencionó anteriormente Anon). No se gana nada al pasar los registros si la función llamada necesita inmediatamente derramar todo en la memoria para sus propios cálculos.

Sin embargo, podemos difundir ideas teóricas durante todo el día y comparar su código con la respuesta correcta. _fastcall será más rápido en algunos casos y más lento en otros.


Depende de la plataforma. Para un PowerPC de Xenon, por ejemplo, puede ser una diferencia de orden de magnitud debido a un problema de carga-golpe-tienda con el paso de datos en la pila. Programé empíricamente la sobrecarga de una función cdecl en aproximadamente 45 ciclos en comparación con ~ 4 para una fastcall .

Para un x86 fuera de orden (Intel y AMD), el impacto puede ser mucho menor, porque todos los registros están sombreados y se les ha cambiado el nombre de todos modos.

La respuesta realmente es que usted necesita hacer una evaluación comparativa en la plataforma particular que le interesa.