IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage C++ Discussion :

Appel chaîné de fonction et code compilé


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de transgohan
    Homme Profil pro
    Développeur Temps réel Embarqué
    Inscrit en
    Janvier 2011
    Messages
    3 149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Temps réel Embarqué

    Informations forums :
    Inscription : Janvier 2011
    Messages : 3 149
    Par défaut Appel chaîné de fonction et code compilé
    Bonjour à toutes et à tous,

    réfléchissant sur le mix de deux énormes applications similaires qui doivent à terme pouvoir être lancées indépendament ou bien ensemble je me pose de nombreuses questions sur quel serait le mieux dans l'organisation de ce projet pour garder en lisibilité tout en gardant les performances.

    J'ai donc pensé à l'appel succéssif de fonction, comment les compilateurs gèrent-ils cela ? Cela rentre-t-il dans les optimisations automatiques ?

    J'entend par là la chose suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    void maFonction(int val){
      maFonction2(val);
    }
    L'appel de maFonction() à maFonction2() va-t-il générer deux changements de pile ou bien une optimisation va-t-elle exécuter directement maFonction2 en évinçant du code asm l'appel à maFonction ?

    Cordialement,
    xTG.

  2. #2
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    Honnêtement, je ne me tracasserais pas trop de ce genre de considération dans un premier temps.

    D'abord, parce que le temps nécessaire à l'appel d'une fonction en lui-même n'est que rarement rédibitoire par rapport au temps de fonctionnement d'une fonction, mais surtout parce que cela dépend vraiment des ciroconstances:

    D'un coté, il se peut que le compilateur effectue effectivement deux appels de fonctions, si aucune des deux n'est inlinée, mais de l'autre, les fonctions inlinées ne font que demander au compilateur de remplacer l'appel de la fonction par son code.

    Si le code résultant dépasse un certain nombre d'instruction processeur, le compilateur peut en effet parfaitement décider de ne pas inliner une fonction pourtant définie comme inline

    Enfin, Ce genre de considération entre vraiment dans ce que l'on peut appeler les optimisations prématurées :

    Avant de t'inquiéter de ce genre de "détails", veilles déjà à ce que toutes tes fonctions fassent ce que tu attends effectivement de leur part, et veilles à ce que tes algorithmes soient efficaces.

    Si, une fois que tu es sur que tu as (correctement ) implémenté les algorithmes les plus efficaces, tu éprouves encore des problèmes de perfs, il sera toujours temps de passer un profiler afin de voir s'il y a effectivement des appels de fonctions dont l'appel seul représente un cout en temps inacceptable
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Membre Expert
    Avatar de transgohan
    Homme Profil pro
    Développeur Temps réel Embarqué
    Inscrit en
    Janvier 2011
    Messages
    3 149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Temps réel Embarqué

    Informations forums :
    Inscription : Janvier 2011
    Messages : 3 149
    Par défaut
    Bah le souci c'est que je suis pas l'auteur des deux énormes codes.
    Donc je serai bien incapable de dire si ils sont optimisés ou non (je pars du principe que oui vu qu'ils sont pour des systèmes critiques tout de même) mais surtout je n'ai pas 6 mois devant moi pour les étudier.
    Ma problématique c'est plutôt de faire une sorte de launcher pour interfacer le lancement de ces deux applications sans aller bouffer sur leurs performances. (Si je vous dis qu'une préemption du système peut foutre la merde ça vous parle mieux ? )

    D'où cette question qui semble à priori tirée par les cheveux pour les 99% des développeurs mais qui est hautement sensible dans mon cas.

    Je sais pas si j'arrive à me faire comprendre et à expliquer véritablement mon problème. En gros on me demande de faire du code fantôme jusqu'à une certaine tolérance.

  4. #4
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Oui, oui, j'ai bien compris ton problème...

    Mais il faut être conscient que ce n'en est en réalité pas un :p

    Un appel de fonction, cela se traduit généralement par deux instructions processeur au début et une ou deux instructions processeur à la fin de la fonction, à peine plus s'il s'agit de fonctions virtuelle.

    Le cout (en terme de temps d'exécution) d'un appel de fonction est donc marginal par rapport au cout en temps d'exécution de la plupart des fonctions et il y a, pour ne donner qu'un exemple, beaucoup à parier qu'une simple allocation dynamique de la mémoire ou que la construction d'un objet complexe soit beaucoup plus chronophage que le simple fait d'avoir une fonction qui appelle une fonction.

    Le problème auquel tu es confronté est que tu as deux programmes qui ont été développé de manière distincte.

    Si tu dois faire en sorte qu'ils "se rejoignent quelque part", il n'y a pas 36 solutions : il faut soit que tu passes par une "façade", qui a un cout d'appel marginal, soit que tu prenne la décision pure et simple de ... redévelopper tout ou partie d'un des projets de manière à ce qu'il soit compatible avec l'interface de l'autre.

    A priori, ce serait quand meme se donner beaucoup de mal pour rien

    Dans l'ordre des problèmes qui peuvent nuire aux performances, celui des appels de fonction doit se situer quelque part entre la 50 eme et la 100 eme place...

    Si problème de performances il y a (car tu n'es même pas encore sur à l'heure actuelle qu'il y aura effectivement des problèmes de performances !! ), il y aura sans doute 50 ou 100 causes pour lequel le gain en terme de performances sera largement supérieur à celui que tu pourrais obtenir en évitant un appel de fonction.

    Je ne dis pas que tu as tord de te poser la question, mais je dis que, dans l'ordre des priorités, il y a très certainement des questions autrement plus utiles à se poser
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  5. #5
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Je pense que :
    • Déjà, avec un bon compilateur, il ne devrait y avoir aucune différence
    • Si tu es vraiment dans un cas où ce genre de considérations de performances importe (système temps réel dur, avec contraintes très fortes), je pense que tu as d'autres problèmes :
      • Ce genre de code fonctionne rarement sur des systèmes où tu as de bon compilateurs, donc ma première remarque est potentiellement fausse, mais qui sait... A vérifier...
      • Ce genre de code n'est pas prévu pour tourner en compagnie d'autre code. Par exemple, il fait très attention à l'utilisation de la mémoire, du cache, des registres.... et le fait d'exécuter un autre code au beau milieu peut totalement invalider ces optimisations
    • Tu évoques la notion d'un système et du fait qu'il a la possibilité de préempter ton application. J'en déduis que tu n'es en fait probablement pas dans un cas temps réel dur avec contraintes très fortes
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  6. #6
    Membre Expert
    Avatar de transgohan
    Homme Profil pro
    Développeur Temps réel Embarqué
    Inscrit en
    Janvier 2011
    Messages
    3 149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Temps réel Embarqué

    Informations forums :
    Inscription : Janvier 2011
    Messages : 3 149
    Par défaut
    Citation Envoyé par JolyLoic Voir le message
    • Tu évoques la notion d'un système et du fait qu'il a la possibilité de préempter ton application. J'en déduis que tu n'es en fait probablement pas dans un cas temps réel dur avec contraintes très fortes
    Le système se limite à l'ordonnanceur et au gestionnaire d'interruption au grand mot, donc non je ne parlai pas de système en tant que système d'exploitation. Mais ta déduction/simplification est un peu biaisée je trouve. Si pas de préemption cela veut dire qu'il n'y a aucune données externes à ton système. Ce qui n'est pas une grande majorité de ce qu'on conçoit faut bien l'admettre...

    Là où le bas blesse c'est justement qu'on m'a demandé de joindre ces deux programmes et qu'on ne dépasse pas les 1% de performance. Sauf que je ne sais absolument pas comme vous l'avez dit si ces deux programmes ne vont pas se tarader la mémoire chacun... J'espère sincèrement qu'ils tapent principalement dans le cache L1 parce que sinon tout ce que je pourrai rajouter ne serait que bagatelle.

    Bon il y a pas trente-six moyen au final... Je vais faire une façade la plus simple possible avec appel des deux sous-programme avec des paramètres statiques et voir les temps que j'obtiens. Si déjà avec ça on explose je pourrai retourner que c'est pas possible sans recoder les applis.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. appel d'une fonction C à partir de code asm !
    Par b52x_med dans le forum Programmation d'OS
    Réponses: 1
    Dernier message: 05/08/2012, 13h57
  2. Appel d'une fonction mysql dans du code javascript
    Par johnson95 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 26/09/2008, 16h29
  3. Réponses: 27
    Dernier message: 23/04/2008, 18h11
  4. Réponses: 4
    Dernier message: 30/05/2007, 18h05
  5. [Compilation] Appel d'une fonction C++ depuis du code C
    Par bladerunners dans le forum C++
    Réponses: 1
    Dernier message: 06/09/2006, 14h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo