Partage
  • Partager sur Facebook
  • Partager sur Twitter

Fonction inline?

Anonyme
    5 juin 2020 à 16:48:05

    Bonjour à tous,

    Je suis en train d'apprendre des choses un peu plus avancées (je reste débutant aux yeux de la plupart d'entre vous hein :) ), notamment sur l'aspect optimisation de code

    Si on prend cet exemple ultra simple:

    void foo();
    void bar();
    
    main()
    {
    
    bar();
    
    }
    
    void foo()
    {
    // calcul répété de nombreuses fois
    }
    
    void bar()
    {
    foo();
    }

    En testant avec std::chrono (bon il y a surement mieux), je perd en temps d'exécution dans bar(), jusque là ça parait logique

    Ce que je ne comprend pas, c'est que même en passant bar() inline, je perd dans les 600ms sur une durée d'environ 4sec en passant par ce dernier au lieu de foo() direct. Perso je pensais qu'il n'y aurait pas de différence du coup! Ou alors j'ai raté un épisode

    On va dire que pour le moment ce genre d'opti n'est pas vital pour mes humbles projets mais j'aimerai quand même comprendre, ne serais-ce que par curiosité :)



    • Partager sur Facebook
    • Partager sur Twitter
      5 juin 2020 à 17:22:27

      "inline" n'est qu'une indication que le compilateur est autorisé à ne pas suivre (voir il est autorisé à vous vomir dessus si vous faite nimportnawak avec).

      Bien avant de faire des choses à base d'inlining (ce que fait l'optimiseur bien mieux que vous), c'est dans les options de compilation qu'il faut chercher des réponses. Et ça sera pas une "magic bullet" où il suffit d'ajouter bidule à machin.

      Et comme toujours pour l'optimisation, on mesure les performances AVANT, et avec de "vrais" outils de profiling : un profileur, pour chercher à optimiser ce qu'il vaut le coup d'optimiser DANS LES CONDITIONS RÉELLES D'UTILISATION.

      • Partager sur Facebook
      • Partager sur Twitter
      Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
        5 juin 2020 à 18:54:13

        Le compilo peut inliner des trucs définis dans la même unité de traduction que l'on n'a pas déclarés inline, et vice-versa.

        La première et plus importante utilisation d'inline, c'est pour définir (!= de déclarer) des fonctions dans des .h. Le reste, même quand on sait à peu près comment ça fonctionne, le compilateur nous surprendra toujours.

        Quant aux optims, le simple fait de rajouter une instruction à une fonction non appelée dans un code mesuré peut altérer les performances (d'une autre fonction donc) à causes de multiples effets de bords.

        Bref, en dessous de 5%, c'est difficile de savoir s'il y a un véritable progrès -- vu que cela peut être la conséquence d'un hasard d'alignement de fonctions dans le binaire final.

        Et si tu veux mesurer des petits bouts, des outils de micro benchmarking comme google.benchmark sont bien pratiques. Mais... sur un petit cas, une fonction qui n'était pas demandée/suggérée inlinée peut le devenir dans notre dos...

        • Partager sur Facebook
        • Partager sur Twitter
        C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.

        Fonction inline?

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown