• # Re: Optimiser un programme C++

    Posté par . En réponse au journal Optimiser un programme C++. Évalué à 6.

    J'ai essayé de faire un free des variables malloquées quand c'était possible, mais à part ça :
    J'appuie fortement ce que dit kadreg, note quand même que faire des free n'accelerera pas la vitesse d'exécution (à moins que tu ne fasse swapper ton ordi à force de ne rien libérer ;).

    - A quoi faut-il faire spécialement attention ?
    Aux nombre d'appels des constructeurs/destructeurs, surtout si ils font tous des new/delete
    A bien inliner les fonctions qui valent le coup
    A passer par référence les paramètres qui sont des structures, même si tu n'as pas l'utilité d'un passage par référence

    - quelle est la commande pour mesurer le temps d'exécution d'une partie particulière du programme ?
    gprof. Tu compiles avec "g++ -g -pg" puis tu tapes "gprof gmon.out". Tu obtiendras les temps passés dans chaque fonction et le nombre d'appel, etc... (man gprof pour plus de détails). Note que gprof ne voit pas les fonctions qui one été inlinées.
    Sinon si tu veux une bonne précision (ie au cycle d'horloge près) tu peux utiliser les time stamp counters des cpus x86 pentium et supérieurs, mais il faudra mettre un peu les mains dans le cambouis pour les lire, ou bien trouver une lib qui le fait.

    - quels sont les trucs à savoir ?
    Les options de g++ à utiliser (par exemple, comment casser le respect de la norme ieee sur les flottants au profit de la vitesse d'exécution, à savoir avec g++ -ffast-math -mno-ieee-fp, ou comment optimiser pour ton architecture : -march=i686 pour les pentium pro, -msse voire -msse2 pour générer du code flottant qui utilise le SSE au lieu du 387)
    Aux problèmes de cache : si tu as des données assez importantes, il faut surveiller l'utilisation de ton cache, et en particulier à quelle vitesse les infos qu'il contient sont remplacées (cache trashing).
    Ne pas se tromper de niveau d'optimisation : si ton algo est en o(n^3), cherches en plutôt un avec une complexité inférieure avant de te lancer dans des optimisations à tout va.
    Ne pas se tromper de structures de données : de la même manière précédemment, tu peux dans certains algos baisser la complexité et donc accélérer l'exécution avec des choses simples comme les listes triées par exemple.