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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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
    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".

  6. #6
    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.

  7. #7
    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).

+ 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