Fastcall est-il vraiment plus rapide?

La convention d’appel fastcall est-elle vraiment plus rapide que les autres conventions d’appel, telles que cdecl? Y a-t-il des points de référence qui montrent comment la convention d’appel affecte la performance?

Cela dépend de la plateforme. Pour un Xenon PowerPC, par exemple, il peut s’agir d’une différence d’ordre de grandeur due à un problème de load-hit-store avec passage de données sur la stack. J’ai cdecl empiriquement la surcharge d’une fonction cdecl à environ 45 cycles, contre 4 pour un fastcall .

Pour un x86 désordonné (Intel et AMD), l’impact peut être bien moindre, car les registres sont tous masqués et renommés de toute façon.

La réponse est vraiment que vous devez évaluer vous-même la plate-forme particulière qui vous intéresse.

La convention d’appel fastcall est-elle vraiment plus rapide que les autres conventions d’appel, telles que cdecl?

Je pense que l’implémentation de fastcall de fastcall sur x86 et x64 implique de transmettre les deux premiers parameters dans des registres plutôt que dans la stack.

Comme il économise généralement au moins quatre access mémoire, oui, il est généralement plus rapide. Cependant, si la fonction impliquée est insuffisante en termes de registres et est donc susceptible de les écrire de toute façon aux utilisateurs locaux, il est peu probable que cela augmente de manière significative.

La convention d’appel (au moins sur x86) ne fait pas vraiment de différence de vitesse. Dans Windows, _stdcall été créé par défaut car il produit des résultats tangibles pour les programmes non sortingviaux, car il en résulte généralement une taille de code inférieure à celle de _cdecl . _fastcall n’est pas la valeur par défaut car la différence qu’il fait est beaucoup moins tangible. Ce que vous compensez en argumentant via des registres, vous perdez dans des corps de fonctions moins efficaces (comme mentionné précédemment par Anon). Vous ne gagnez rien en transmettant des registres si la fonction appelée doit immédiatement tout renvoyer en mémoire pour ses propres calculs.

Cependant, nous pouvons diffuser des idées théoriques tout au long de la journée, en comparant votre code à la bonne réponse. _fastcall sera plus rapide dans certains cas, et plus lent dans d’autres.

Sur le x86 moderne – non. Entre le cache de la L1 et l’in-lining, il n’y a pas de place pour fastcall.