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

C Discussion :

Améliorer la vitesse d'exécution


Sujet :

C

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 39
    Par défaut Améliorer la vitesse d'exécution
    Bonjour,

    Je me demandais s'il était possible d'augmenter la vitesse d'exécution de mon programme. Plus précisément augmenter la vitesse de ma boucle.
    Disons que:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    While(1)
    {
       // calcul
    }
    Et est-il possible de voir la vitesse à laquelle un programme s'exécute (c'est peut être un peu vague...).

    Merci

  2. #2
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Bonjour,

    Il est assez simple de voir la vitesse : il suffit d'utiliser les fonctions de temps de la bibliothèque standard et de calculer la différence de temps entre deux tours de boucles.


    Pour améliorer la vitesse de ton programme, il faut d'abord réduire la complexité de ton algorithme, rendre ton algorithme plus performant.

    Ensuite, tu peux jouer sur la priorité de ton programme pour qu'il ai accès plus souvent au CPU.

    Tu peux aussi sur certains OS (testé sur Debian squeeze ) utiliser une fois printf ce qui donnera un priorité légèrement plus élevée au thread courant.

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 39
    Par défaut
    Merci de pour ta réponse,

    J'ai retrouvé ça pour calculer le temps d’exécution :http://www.developpez.net/forums/d79...n-prog-resolu/

    Sinon pour ce qui est d'améliorer la vitesse, l'algorithme est vraiment basique.
    Ensuite:
    jouer sur la priorité de ton programme pour qu'il ai accès plus souvent au CPU.

    Comment faire ?

    Merci

  4. #4
    Membre Expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Par défaut
    Il faut regarder la commande "nice" et l'utiliser en root !

    Et fais attention... un algorithme "vraiment basique" peut s'optimiser "dans la logique" si beaucoup de choses se répètent souvent...
    La difficulté à optimiser peut par contre te faire t'arracher tes cheveux !

    Garde en tête aussi les optimisations "techniques" : faire le moins possible d'I/O !
    vitesse DD <<< vitesse accès mémoire < vitesse CPU (registres, etc...)
    • Moins tu fais de read/write, plus tu vas gagner de temps ! (si possible ne faire qu'un seul READ et un seul WRITE).
    • Moins tu call de fonctions, moins tu perds de temps à empiler/dépiler des registres en mémoire... (voir le mot clé "inline" du C pour garder un code lisible et un ASM optimisé)
    • Moins tu déréférences de pointeur, moins tu "sortiras" du CPU pour lire/écrire la mémoire.


    EDIT : pour le déréférencement, c'est semi-vrai...
    En effet, les caches L1/2/3 vont faire une partie du travail de lecture/écriture mémoire sans que tu ne leur demandes...
    Mais pour qu'ils soient réellement efficaces : garder des tableaux contigus pour tes résultats...
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  5. #5
    Membre Expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Par défaut
    Bonjour,

    en plus de remarques de Neckara (qui d'ailleurs devait parler de complexité temporelle de l'algorithme plus que de la complexité de compréhension ...) je peux te conseiller d'utiliser un profiler. Le proiler est un outil intéressant qui, après une exécution de ton programme, te liste les endroits de ton source qui sont le plus consommateurs en temps. Ce sont les optimisation de ces endroits qui amélioreront le plus significativement les temps de réponses de ton programme. Chaque plateforme propose un profiler donc que tu sois sous windows linux ou mac tu devrais trouver ton bonheur.

    Augmenter les priorités d'exécutions a ses limites, cela ne sert pas à grand chose si le goulet d'étranglement se situe au niveau d'un appel io par exemple, en revanche rajouter un mécanisme de cache pourrait dans ce cas être profitable (parfois).

  6. #6
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Citation Envoyé par Metalman Voir le message
    [*]Moins tu fais de read/write, plus tu vas gagner de temps ! (si possible ne faire qu'un seul READ et un seul WRITE).
    Ou utiliser fread et fwrite qui ont un buffer pour limiter les opérations d'E/S.

    Citation Envoyé par Metalman Voir le message
    [*]Moins tu call de fonctions, moins tu perds de temps à empiler/dépiler des registres en mémoire... (voir le mot clé "inline" du C pour garder un code lisible et un ASM optimisé)
    Attention, ce n'est pas tout à fait vrai.
    Déjà, il faut comme kwariz le souligne utiliser un profiler, selon ce qui est fait, l'appel de fonctions peut être négligeable en comparaison.

    Par contre remplacer des algorithmes récursifs en itératifs peut être intéressant même si le compilateur peut "dérécursiver" (copyright Neckara pour ce mot ) certains algorithmes réccursifs.

    Ensuite, pour le mot clé inline, il faut se méfier, un inline sera un "copié-collé" de code et augmente la taille du programme, ce qui peut même provoquer des pertes de performances cf FAQ.


    Citation Envoyé par Metalman Voir le message
    Mais pour qu'ils soient réellement efficaces : garder des tableaux contigus pour tes résultats...
    Attention aussi à l'ordre de parcours du tableau : tab[i][j][k] : d'abord parcourir en fonction des k, puis des j, puis des i ainsi on lira les éléments les un à la suite des autres.
    Sur de gros tableaux, parcourir d'abord les i nous fera lire les éléments de jmax*kmax en jmax*kmax, ce qui nécessitera des opérations supplémentaires au niveau du cache

    @kwariz : oui, je parlais bien en complexité d'algorithme ( O(n), O(n²), ...)

    @dashed : Je pense que kwariz t'as donné la meilleure réponse qui puisse t'être faite, utiliser un profiler.
    L'optimisation prématurée est dangereuse, il faut d'abord identifier ses besoins en performances et voir quelles zones du code sont à optimiser plutôt que d'optimiser "au hasard".

  7. #7
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 39
    Par défaut
    Merci pour toutes vos réponses, je vais m'orienter vers le profiler.

  8. #8
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Je viens de m'apercevoir qu'on a oublier une chose importante :
    compiler en release avec l'option -O3, ceci permettra au compilateur de faire plusieurs optimisations.

  9. #9
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 39
    Par défaut
    D'accord, merci beaucoup.

  10. #10
    Membre Expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Par défaut
    Citation Envoyé par Neckara Voir le message
    Je viens de m'apercevoir qu'on a oublier une chose importante :
    compiler en release avec l'option -O3, ceci permettra au compilateur de faire plusieurs optimisations.
    Euuuh... ça copie/colle aussi un peu de code, comme mon inline si je ne me trompe pas...

    Enfin il y a une généralité à garder en tête :
    Soit tu écris en dur beaucoup de choses, et ça réduit le nombre de calculs,
    Soit tu réduis ce qui est en dur, et tu calcules beaucoup !
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  11. #11
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Citation Envoyé par Metalman Voir le message
    Euuuh... ça copie/colle aussi un peu de code, comme mon inline si je ne me trompe pas...
    Mais le compilateur sait parfaitement où copier du code et où ne pas en copier pour obtenir des performances optimales , et puis il ne fait pas que ça.

  12. #12
    Membre Expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Par défaut
    Citation Envoyé par Metalman Voir le message
    Euuuh... ça copie/colle aussi un peu de code, comme mon inline si je ne me trompe pas...

    Enfin il y a une généralité à garder en tête :
    Soit tu écris en dur beaucoup de choses, et ça réduit le nombre de calculs,
    Soit tu réduis ce qui est en dur, et tu calcules beaucoup !
    Bonjour,

    oui le -O3 (sur gcc) duplique du code parfois déroule des boucles etc ... Le comportement du inline est plus délicat. Même si tu précises qu'une fonction est inline (au sens C99) le compilateur peut décider de ne pas l'inliner. Il peut factoriser pour t'éviter à écrire des choses en dur aussi ...
    Il y a une chose qui est super importante néanmoins : un compilateur sera bien souvent plus malin à optimiser que la vaste majorité des programmeurs surtout si on lui donne de bonnes indications.
    Une option de gcc qui n'est pas à négliger si on cherche la perf à tout prix : on compile une première fois avec -fprofile-arcs, on utlise la version qui sera profilée et ensuite tu peux demander à gcc de recompiler en prenant en compte les données récoltées pendant le profilage (réorganisation du code pour augmenter la locailté, profiter de la prédiction de conditionnelles, ...)

  13. #13
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Citation Envoyé par kwariz Voir le message
    oui le -O3 (sur gcc) duplique du code parfois déroule des boucles etc ... Le comportement du inline est plus délicat. Même si tu précises qu'une fonction est inline (au sens C99) le compilateur peut décider de ne pas l'inliner. Il peut factoriser pour t'éviter à écrire des choses en dur aussi ...
    Pour les fonctions inline, le problème, c'est qu'en apprenant que le compilateur peut choisir de ne pas inliner, certains programmeurs peuvent être tenté de forcer l'inlining avec une option particulière de gcc .

    Citation Envoyé par kwariz Voir le message
    Une option de gcc qui n'est pas à négliger si on cherche la perf à tout prix : on compile une première fois avec -fprofile-arcs, on utlise la version qui sera profilée et ensuite tu peux demander à gcc de recompiler en prenant en compte les données récoltées pendant le profilage (réorganisation du code pour augmenter la locailté, profiter de la prédiction de conditionnelles, ...)
    Je ne connaissais pas faudra que je note ^^

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

Discussions similaires

  1. [VxiR2] Comment améliorer la vitesse d'exécution
    Par ahmed_amine dans le forum Deski
    Réponses: 2
    Dernier message: 01/03/2011, 13h52
  2. [SQL]ADODataset et ADOQuery Vitesse d'exécution.
    Par aityahia dans le forum Bases de données
    Réponses: 1
    Dernier message: 30/06/2008, 19h44
  3. Vitesse d'exécution d'un code en C.
    Par criga dans le forum C
    Réponses: 8
    Dernier message: 11/12/2007, 05h17
  4. Au sujet de la vitesse d'exécution des programmes
    Par emie31 dans le forum Langage
    Réponses: 5
    Dernier message: 09/11/2006, 13h42
  5. Réponses: 4
    Dernier message: 02/04/2006, 18h42

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