2010-02-02 28 views
38

¿La convención de llamadas de llamada rápida es mucho más rápida que otras convenciones de llamadas, como cdecl? ¿Hay algún punto de referencia que muestre cómo se ve afectado el rendimiento al llamar a la convención?¿La llamada rápida es realmente más rápida?

+5

"¿Cómo se ve afectado el rendimiento al llamar a la convención?" Ligeramente. – avakar

+12

Excepto cuando se ve afectado masivamente. – Crashworks

+1

Vea también http://bcbjournal.org/articles/vol4/0004/When_to_use___fastcall.htm?PHPSESSID=7ea0b77df8671b0af9001fbca735c1bc – bluish

Respuesta

30

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

Para un x86 fuera de servicio (Intel y AMD), el impacto puede ser mucho menor, ya que los registros están todos sombreados y renombrados de todos modos.

La respuesta es que necesita compararla usted mismo en la plataforma particular que le interesa.

16

¿La convención de llamadas de llamada rápida es mucho más rápida que otras convenciones de llamadas, como cdecl?

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

Como normalmente guarda al menos cuatro accesos a la memoria, sí, generalmente es más rápido. Sin embargo, si la función implicada es la falta de registros y es probable que los escriba a los locales en la pila de todos modos, no es probable que haya un aumento significativo.

+4

En x64 solo hay una convención de llamadas –

10

La convención de llamadas (al menos en x86) realmente 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 da como resultado un tamaño de código más pequeño 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 argumento que pasa a través de registros, lo pierde en cuerpos funcionales menos eficientes (como lo mencionó Anon anteriormente). No se gana nada al pasar registros si la función llamada necesita inmediatamente derramar todo en la memoria para sus propios cálculos.

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

8

En moderno x86 - no. Entre la memoria caché L1 y el forro interior no hay lugar para la llamada rápida.

+10

Si una función está enlineada, no es ni fastcall ni cdecl ni ninguna otra convención de llamadas. – Crashworks

+7

Exactamente. La recuperación desde L1 es de 1 ciclo por encima del registro, en la mayoría de los casos está por debajo del nivel de ruido, es difícil incluso compararlo de manera confiable. Y las funciones en las que algunos ciclos de llamada son una diferencia importante deben incluirse de todos modos. – ima

+1

Tengo que estar de acuerdo con esto: cualquier función que sea lo suficientemente simple como para beneficiarse de fastcall se beneficiaría de la creación aún más. –

Cuestiones relacionadas