Pregunta

Es la convención de llamada fastcall realmente más rápido que otras convenciones de llamada, como cdecl? ¿Hay puntos de referencia por ahí que muestran cómo el rendimiento se ve afectado por la convención de llamada?

¿Fue útil?

Solución

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

Para un 86 fuera de orden (Intel y AMD), el impacto puede ser mucho menor, debido a que los registros están sombreados y cambiar el nombre de todos modos.

La respuesta en realidad es que es necesario establecer criterios de referencia a sí mismo en la plataforma en particular que le interesan.

Otros consejos

  

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

creo que la aplicación de Microsoft de fastcall en x86 y x64 consiste en pasar los dos primeros parámetros en los registros en lugar de en la pila.

Dado que por lo general ahorra por lo menos cuatro accesos de memoria, sí lo es generalmente más rápido. Sin embargo, si la función de registro en cuestión es de hambre y por lo tanto es probable que escribirlos en los locales en la pila de todos modos, no es probable que sea un aumento significativo.

convención de llamada (al menos en x86) en realidad no hace mucha diferencia en la velocidad. En Windows, se hizo _stdcall el valor por defecto, ya que produce resultados tangibles para los programas no triviales en que por lo general resulta en el tamaño de código más pequeño en comparación con _cdecl. _fastcall no es el valor por defecto debido a la diferencia que hace es mucho menos tangible. Lo que se compensan con el argumento que pasa a través de los registros que se pierde en los cuerpos de función menos eficientes (como se ha mencionado anteriormente por Anon.). No se gana nada al pasar en los registros si la función llamada necesita de inmediato a todo lo que fuera derrame en la memoria para sus propios cálculos.

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

En x86 moderna - no. Entre caché L1 y en la guarnición no hay lugar para fastcall.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top