Votre question m'a rendu curieux, alors je me suis lancé et j'ai effectué quelques timings sur le processeur PowerPC de 3 GHz en ordre de marche avec lequel nous travaillons. Le test que j'ai effectué consistait à créer une simple classe de vecteur 4d avec des fonctions get/set.
class TestVec
{
float x,y,z,w;
public:
float GetX() { return x; }
float SetX(float to) { return x=to; } // and so on for the other three
}
J'ai ensuite créé trois tableaux contenant chacun 1024 de ces vecteurs (assez petits pour tenir dans L1) et j'ai exécuté une boucle qui les ajoutait les uns aux autres (A.x = B.x + C.x) 1000 fois. J'ai exécuté cette boucle avec les fonctions définies comme inline
, virtual
et des appels de fonction réguliers. Voici les résultats :
- en ligne : 8ms (0,65ns par appel)
- direct : 68ms (5,53ns par appel)
- virtuel : 160ms (13ns par appel)
Ainsi, dans ce cas (où tout tient dans le cache), les appels de fonctions virtuelles étaient environ 20 fois plus lents que les appels en ligne. Mais qu'est-ce que cela signifie réellement ? Chaque passage dans la boucle a causé exactement 3 * 4 * 1024 = 12,288
appels de fonction (1024 vecteurs fois quatre composantes fois trois appels par addition), ces temps représentent donc 1000 * 12,288 = 12,288,000
appels de fonction. La boucle virtuelle a pris 92 ms de plus que la boucle directe, de sorte que la surcharge supplémentaire par appel était de 7 %. nanosecondes par fonction.
J'en conclus que : sí Les fonctions virtuelles sont beaucoup plus lentes que les fonctions directes. no à moins que vous ne prévoyiez de les appeler dix millions de fois par seconde, cela n'a pas d'importance.
Voir aussi : comparaison de l'assemblage généré.
0 votes
Conformément à ma réponse, je suggère de fermer ce dossier en tant que doublon de stackoverflow.com/questions/113830
0 votes
Duplicata possible de Pénalité de performance pour le travail avec des interfaces en C++ ?
2 votes
Si vous faites du calcul haute performance et du "number crunching", n'utilisez pas de virtualité au cœur du calcul : cela tue définitivement toutes les performances et empêche les optimisations au moment de la compilation. Pour l'initialisation ou la finalisation du programme, ce n'est pas important. Lorsque vous travaillez avec des interfaces, vous pouvez utiliser la virtualité comme vous le souhaitez.
0 votes
quick-bench.com/q/hU7VjdB0IP7rxjYuH46xbocVBxY Essayez ce repère. 10% de différence dans une boucle serrée. 20% dans un appel unique quick-bench.com/q/Y4FvX3adXOjVp3Bh2SmbG-jVtco