44 votes

Le fastcall est-il vraiment plus rapide ?

La convention d'appel fastcall est-elle vraiment plus rapide que les autres conventions d'appel, comme cdecl ? Existe-t-il des benchmarks qui montrent comment les performances sont affectées par la convention d'appel ?

36voto

Crashworks Points 22920

Cela dépend de la plateforme. Pour un PowerPC Xenon, par exemple, il peut s'agir d'une différence d'un ordre de grandeur due à un problème de load-hit-store avec le passage des données sur la pile. J'ai chronométré de manière empirique l'overhead d'une commande cdecl à environ 45 cycles contre ~4 pour un fastcall .

Pour un x86 non ordonné (Intel et AMD), l'impact peut être beaucoup moins important, car les registres sont de toute façon tous ombragés et renommés.

En fait, la réponse est que vous devez vous évaluer vous-même sur la plate-forme qui vous intéresse.

19voto

Anon. Points 26829

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

Je crois que l'implémentation de Microsofts fastcall sur x86 et x64 implique de passer les deux premiers paramètres dans des registres au lieu de les passer sur la pile.

Puisqu'il permet d'économiser au moins quatre accès à la mémoire, oui, il est généralement plus rapide. Toutefois, si la fonction concernée est privée de registres et qu'elle est donc susceptible de les écrire de toute façon en local sur la pile, il est peu probable que l'augmentation soit significative.

13voto

Billy ONeal Points 50631

La convention d'appel (au moins sur x86) ne fait pas vraiment de différence en termes de vitesse. Sous Windows, _stdcall a été choisi comme valeur par défaut parce qu'il produit des résultats tangibles pour les programmes non triviaux, en ce sens qu'il aboutit généralement à une taille de code plus petite par rapport à _cdecl . _fastcall n'est pas la valeur par défaut, car la différence qu'elle apporte est beaucoup moins tangible. Ce que vous compensez en passant des arguments via les registres, vous le perdez en corps de fonctions moins efficaces (comme l'a déjà mentionné Anon.). Vous ne gagnez rien à passer dans des registres si la fonction appelée doit immédiatement tout déverser en mémoire pour ses propres calculs.

Cependant, nous pouvons débiter des idées théoriques à longueur de journée - évaluez votre code pour trouver la bonne réponse. _fastcall sera plus rapide dans certains cas, et plus lente dans d'autres.

10voto

ima Points 4782

Sur les x86 modernes - non. Entre le cache L1 et l'in-lining, il n'y a pas de place pour le fastcall.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X