¿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?
Respuesta
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.
¿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.
En x64 solo hay una convención de llamadas –
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.
En moderno x86 - no. Entre la memoria caché L1 y el forro interior no hay lugar para la llamada rápida.
Si una función está enlineada, no es ni fastcall ni cdecl ni ninguna otra convención de llamadas. – Crashworks
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
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. –
- 1. ¿La sección crítica es siempre más rápida?
- 2. serialización C++ más rápida?
- 3. alternativa más rápida a file_get_contents()
- 4. ¿Cuál es la forma más rápida de grabar varios archivos?
- 5. Prueba de primalidad más rápida
- 6. ¿Implementación multiplataforma A * más rápida?
- 7. jquery: inserción DOM más rápida?
- 8. Alternativa más rápida a ColorConvertOp
- 9. hipotenusa más rápida en javascript?
- 10. Parent(), una alternativa más rápida?
- 11. Versión más rápida de Convert.ChangeType
- 12. La forma más rápida de aprender Maven
- 13. La forma más rápida de completar ArrayList
- 14. ¿Por qué la llamada a función virtual es más rápida que dynamic_cast?
- 15. alternativa más rápida a memcpy?
- 16. ¿Implementación más rápida de Math.round?
- 17. ¿Qué es la inserción o manipulación más rápida del DOM?
- 18. ¿La actualización de MySQL es más rápida que INSERT INTO?
- 19. que es la consulta más rápida de win32 o SQL?
- 20. ¿Cuál es la vista o sub consulta más rápida?
- 21. La implementación de escapada más rápida?
- 22. ¿Una alternativa más rápida a DecimalFormat.format()?
- 23. forma más rápida de generar bits aleatorios
- 24. multiplicación de Fixnum más rápida en ruby?
- 25. ¿Forma más rápida de obtener múltiples FileInfo?
- 26. Implementación SVM más rápida utilizable en Python
- 27. La forma más rápida de probar la conexión a Internet
- 28. multiplicación de enteros rápida/rápida en ruby?
- 29. ¿Es una instrucción LINQ más rápida que un bucle 'foreach'?
- 30. Android SQLite: ¿Qué consulta ("consulta" o "rawQuery") es más rápida?
"¿Cómo se ve afectado el rendimiento al llamar a la convención?" Ligeramente. – avakar
Excepto cuando se ve afectado masivamente. – Crashworks
Vea también http://bcbjournal.org/articles/vol4/0004/When_to_use___fastcall.htm?PHPSESSID=7ea0b77df8671b0af9001fbca735c1bc – bluish