Newsletter Developpez.com

Inscrivez-vous gratuitement au Club pour recevoir
la newsletter hebdomadaire des développeurs et IT pro

GoingNative 2013 - Andrei Alexandrescu - Ecrire du code rapide en C++
Rapidement

Le , par germinolegrand, Membre expert
Andrei Alexandrescu - Ecrire du code rapide en C++, rapidement
GoingNative 2013

La conférence de Andrei Alexandrescu lors des GoingNative 2013 est disponible :


Peaufiner son code est important, cela permet d'avoir mieux qu'un simple proof-of-concept, mais quelque chose de performant.

A. Alexandrescu rappelle en insistant fortement que la seule intuition qui ne soit pas fausse au sujet de la performance du code, c'est "je devrais mesurer ça".

Mais la mesure du temps est un problème car elle est gourmande et est assez flou et imprécise. Il recommande d'utiliser des façons détournées de mesurer des performances :
  • vitesse du flux (en byte par seconde par exemple)
  • saturation du CPU
  • consommation d'énergie
  • nombre d'instructions exécutées entre chaque résultat
  • nombre d'écritures


Organisation des données

Il s'agit selon lui actuellement du problème n°1 pour les performances.

Les premiers 64 bits sont les plus importants car ils sont facilement accessibles par le CPU.

Si vous compressez trop vos données, vous épuiserez vos performances à transformer vos données pour travailler avec.

Les bitfields ne sont pas fait pour être performants mais réduire la taille des données.

Dans les valeurs -1, 0, 1 que l'on vous conseille d'utiliser, votre constante préférée devrait être zéro, car le hardware dispose d'opérations spéciales pour interagir avec lui.

Dévirtualisation

La virtualité en C++ est très efficace pour les grandes hiérarchies, sont flexibles, et les appels virtuels sont optimisés par du load balancing au niveau du cache d'instructions.
Cependant, on paye pour la flexibilité potentielle, non celle réalisé en réalité. De plus, on perd en mémoire car le vptr est toujours au début des structures (donc il occupe les 64 premiers bits qui sont si importants), et on ne peut pas changer le type d'un objet in-situ il faut passer par les constructeurs/destructeurs qui sont relativement couteux. La virtualité est beaucoup moins efficace sur des hiérarchies fermées/petites.

Le switch de type est une possibilité, mais n'est bonne que pour 7 branches maximum, et a l'inconvénient de mélanger le code froid (exécuté rarement) avec le code chaud (exécuté souvent), et le code pour des types différent est obligé d'être concentré en un même point. On échange également la modularité pour des performances.

Implémenter une vtable à la main, bien que donnant un meilleur contrôle des constructeurs/destructeurs et permettant de changer le type in-situ, est bien plus couteux que la vraie.

La solution est une vtable verticale. Bien qu'impliquant beaucoup de casts et ne supportant qu'un nombre statique de classes et de fonctions virtuelles, elles sont bien plus performantes puisqu'elles permettent d'accéder à la bonne fonction en une seule opération.

Pour terminer, après le connaissez vos algorithmes de Sean Parent dans sa conférence qui précède celle-ci, voici le connaissez votre architecture d'Andrei Alexandrescu, cela vous permettra d'écrire un meilleur code.

Élider ou Déplacer, telle est la question.

Par rapport à la construction par copie, la construction par déplacement demande peu de travail. L'élision n'en demande aucun. Or, pas de travail est toujours moins de travail que peu de travail.

Ne faites pas de retour par valeur même si le déplacement est élidé quand cela vous obligera à faire des allocations supplémentaires par ailleurs.

En tous les cas, mesurez .

Conférence précédente : Sean Parent - C++ Seasoning
Évènement : GoingNative 2013

Et vous,
Qu'en pensez-vous ?


Vous avez aimé cette actualité ? Alors partagez-la avec vos amis en cliquant sur les boutons ci-dessous :


 Poster une réponse

Avatar de JolyLoic JolyLoic - Rédacteur/Modérateur https://www.developpez.com
le 13/09/2013 à 6:44
Un point m'a marqué dans la présentation : Sur l'application où ils travaillaient, 1% de gain de perf se traduisait par un gain en énergie consommée pour faire tourner les datacenters de facebook équivalent à plusieurs années de salaire d'ingénieur.

Dit autrement, on est de nouveau dans une environnement où optimiser son code peut être rentable, et où le coût humain n'est plus le coût le plus important pour une société informatique.
Avatar de Luc Hermitte Luc Hermitte - Expert éminent https://www.developpez.com
le 13/09/2013 à 9:23
Il y avait eu pas mal de commentaires sur la partie des elisions de copies qui allaient de le sens qu'il ne fallait pas trop aider le compilateurs à faire des micro-optims si mes souvenirs sont bons et que les choses évoluent justement côté compilos.
Du coup, je ne sais pas trop sur quel pied danser sur ce sujet précis.
Avatar de Médinoc Médinoc - Expert éminent sénior https://www.developpez.com
le 13/09/2013 à 10:38
Qu'est-ce qu'une vtable verticale?
Avatar de oodini oodini - Membre émérite https://www.developpez.com
le 13/09/2013 à 10:51
Citation Envoyé par JolyLoic  Voir le message
Un point m'a marqué dans la présentation : Sur l'application où ils travaillaient, 1% de gain de perf se traduisait par un gain en énergie consommée pour faire tourner les datacenters de facebook équivalent à plusieurs années de salaire d'ingénieur.

Dit autrement, on est de nouveau dans une environnement où optimiser son code peut être rentable, et où le coût humain n'est plus le coût le plus important pour une société informatique.

C'est un peu malhonnête de comparer un coût relatif à un coût absolu.

Combien y a-t-il d'ingénieur chez Facebook ?
Quelle est l'économie réalisée par rapport au chiffre d'affaire ?
Avatar de germinolegrand germinolegrand - Membre expert https://www.developpez.com
le 13/09/2013 à 15:39
@Luc: je dirais que si tu veux les performances maintenant, tu mesures et tu fait les micros optis. Si tu les veux plus tard ou que tu mises sur la longévité, fait un code simple puisque c'est ce que les compilo seront le plus amenés à optimiser en toute logique.

@Médinoc: je te conseille de regarder la conférence pour ça, ça prendrait le double de ce qui est écrit ici pour l'expliquer.

@tous: si quelqu'un se sent de faire un article pour expliquer les vtables, ou même un simple post de forum, je serai ravi de le mettre en valeur dans la rubrique .

@oodini: on peut ramener ça en relatif : coût en énergie économisée sur le système > salaire équipe nécessaire à optimiser et maintenir le système. Leurs systèmes consomment beaucoup, mais comme ils sont gros (et optimisé au détriment de la propreté/simplicité du code !) ils demandent une équipe d'experts (qui coûtent donc -très- chers !).
Avatar de David Fleury David Fleury - Membre averti https://www.developpez.com
le 13/09/2013 à 18:44
J'ai eu un peu peur de cette présentation.

A mon sens, elle présente de techniques avancées (réécriture du polymorphisme), ou autres (les valeurs en retour) dans un contexte très particulier (optimisation du code pour Facebook, ingénieurs hyper qualifié) où chaque microseconde compte, qui pourrait être utilisées hors contexte.

La quantité de bug généré par le code qui pourrait écrit dans cette optique m'effraie (sans parler du coût de maintenance d'un tel projet)

Ensuite quand on voit la présentation suivante "Don't help the compiler", qui dit à peu près le contraire. Elle en devient encore plus effrayant.
Avatar de oodini oodini - Membre émérite https://www.developpez.com
le 20/02/2014 à 13:36
Citation Envoyé par germinolegrand  Voir le message
Les appels virtuels sont optimisés par du load balancing au niveau du cache d'instructions.

Je suis en train de mater la vidéo, et je ne saisis pas bien l'explication.
Si quelqu'un pouvait m'éclairer...
Offres d'emploi IT
Ingénieur analyste programmeur (H/F)
Safran - Auvergne - Montluçon (03100)
Chef projet big data - pse flotte H/F
Safran - Ile de France - Évry (91090)
Architecte et intégrateur scade/simulink H/F
Safran - Ile de France - Vélizy-Villacoublay (78140)

Voir plus d'offres Voir la carte des offres IT
Contacter le responsable de la rubrique C++