Question

La fastcall convention d'appel vraiment plus vite que d'autres conventions d'appel, comme cdecl? Y a-t-il des repères là-bas qui montrent comment la performance est affectée par la convention d'appel?

Était-ce utile?

La solution

Cela dépend de la plate-forme. Pour un PowerPC Xenon, par exemple, il peut être un ordre de grandeur de différence en raison d'un problème frappé charge magasin au transfert des données sur la pile. Je chronométré de manière empirique la surcharge d'une fonction de cdecl à environ 45 cycles par rapport à ~ 4 pour une fastcall.

Pour un hors-ordre x86 (Intel et AMD), l'impact peut être beaucoup moins, parce que les registres sont tous assombris et rebaptisés de toute façon.

La réponse est que vous devez vous-même référence sur la plate-forme particulière que vous aimez.

Autres conseils

  

est la fastcall convention d'appel vraiment plus rapide que d'autres conventions d'appel, comme cdecl?

Je crois que la mise en œuvre de Microsofts fastcall sur x86 et x64 consiste à faire passer les deux premiers paramètres dans les registres au lieu de la pile.

Comme il enregistre généralement au moins quatre accès à la mémoire, oui, il est généralement plus rapide. Cependant, si la fonction concernée est registre affamée et est donc susceptible de les écrire à la population locale sur la pile de toute façon, il n'y a pas susceptible d'être une augmentation significative.

Convention d'appel (au moins sur x86) ne fait pas vraiment beaucoup d'une différence de vitesse. Dans Windows, _stdcall a été fait par défaut, car elle produit des résultats tangibles pour les programmes non triviaux en ce qu'elle entraîne généralement plus petite taille du code par rapport à _cdecl. _fastcall n'est pas la valeur par défaut, car la différence qu'il fait est beaucoup moins tangible. Qu'est-ce que vous faites pour en plaidoirie en passant par les registres vous perdre dans le corps des fonctions moins efficaces (comme mentionné précédemment par Anon.). Vous ne gagnez rien en passant dans des registres si la fonction appelée doit immédiatement renverser tout en en mémoire pour ses propres calculs.

Cependant, nous pouvons bec idées théoriques toute la journée - votre code de référence pour la bonne réponse. _fastcall sera plus rapide dans certains cas, et plus lent dans d'autres.

x86 moderne - pas. Entre cache L1 et en doublure il n'y a pas de place pour fastcall.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top