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 ?
Réponses
Trop de publicités?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.
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.
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.