58 votes

Les foncteurs sont-ils réellement plus rapides que les pointeurs vers les fonctions?

Selon Scott Meyers, un domaine dans lequel C ++ brille par rapport à C est que les objets fonction sont plus rapides que les pointeurs de fonction. Il dit que c'est parce que les objets de fonction sont en ligne, ce qui augmente la vitesse.

J'ai deux questions à ce sujet:

  1. Comment pouvons-nous vérifier que les objets de fonction sont bien alignés? Peut-on vérifier cela en pratique?

  2. L'inclusion d'objets de fonction dépend-elle du compilateur que nous utilisons ou tous les compilateurs se comportent-ils de la sorte?

76voto

Yakk Points 31636

Le C++ et C normes les feuilles d'un bouquet de liberté pour les compilateurs. Les compilateurs sont libres de compter jusqu'à 1 milliard de dollars entre chaque instruction, ou de le faire seulement si un nombre entier est un nombre premier de valeur en elle.

Décent "réel" compilateurs ne pas le faire. C'est une qualité de mise en œuvre de problème.

Inline fonction des objets en quelque chose qui ressemble std::sort est quelque chose que chaque véritable compilateur ne. Il est extrêmement facile de détecter ce qui doit être incorporé dans ces cas, parce que les informations de type porte le code nécessaire pour être incorporé.

De le faire avec un pointeur de fonction est plus difficile. De le faire avec un pointeur de fonction où tout a été converti en void* ou char* des pointeurs est encore plus difficile.

L'effet de ceci est que, dans la pratique, un style C appel d' qsort vs C++-style appel à l' std::sort peut entraîner un grand avantage pour l' std::sort.

qsort est environ 2x plus lent que l' std::sort, comme le montre ici, dans un ridiculement simple situation de tri disposées de façon aléatoire des nombres entiers.

L'inspection de l'assemblage de code de sortie est principalement un détail, et c'est beaucoup de travail pour peu de retour. La prise en béton exemples du monde réel vous donne une idée de l'importance de l'impact est vraiment.

Tous les 3 de clang, gcc et MSVC où en mesure de faire std::sort être nettement plus rapide que leur qsort. Et comme c'est facile d'optimisation, tout en optimisant les pointeurs de fonction en inline appels n'est pas, vous vous attendez à moins principaux compilateurs ne valait pas mieux que ce à qsort.

18voto

πάντα ῥεῖ Points 15683
  1. Comment peut-on vérifier que la fonction des objets qui sont en fait inline? Nous pouvons le vérifier dans la pratique?

Bien sûr, inspecter les enfin émis code assembleur.

  1. L'alignement des objets de fonction dépend du compilateur que nous utilisons, ou tous les compilateurs se comporter comme ça?

Il dépend fortement de compilateur mise en œuvre et le niveau d'optimisation utilisé.
Donc non, il n'y a pas de garantie particulière compilateurs (linkers) se comportent de la sorte.

Appels par le biais de pointeurs de fonction ne peut pas être insérée.


Selon lui, la fonction des objets sont inline, il y a donc une augmentation de la vitesse.

OMI "objets de fonction sont inline" devrait mieux lu (ou entendu, je ne sais pas où ce cite est à partir de):

les objets de fonction peut être insérée alors que les appels par le biais de pointeurs de fonction ne peut pas.

1voto

Oui, la fonction des objets pourrait conduire à une accélération du code. Mais la seule façon de s'assurer que tout soit à l'indice de référence.

  1. La documentation dit: "GCC peut-être toujours pas en mesure d'incorporer une fonction pour de nombreuses raisons, l' -Winline option peut être utilisée pour déterminer si une fonction n'a pas été incorporé et pourquoi pas."

  2. Bien sûr, il dépend du compilateur, version, drapeaux, etc. Parfois inline peut être contre-productif (code de ballonnements, etc.), ainsi, chaque compilateur a son propre ensemble de règles pour décider si une fonction doit être insérée. Par ailleurs, l' inline mot-clé est qu'une indication, et certaines bibliothèques comme propres ont un moment difficile à appliquer inline.

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