Signification Gcc -O2
Répondre à la discussion
Affichage des résultats 1 à 11 sur 11

Signification Gcc -O2



  1. #1
    cosmoff

    Signification Gcc -O2


    ------

    Bonjour,
    J ai testé un code :
    While (time(NULL) < 10 ) {
    Var *= 1.2;
    I++;
    }
    Je regarde combien de fois je rentre dans la boucle en 10 seconde. Et je remarque que lorsque je compile avec l option -O2 je vais 10 fois plus dans la boucle ce qui m a beaucoup étonné.
    Je me suis renseigné sur l option -O2 et je suis tombé sur ça :
    Optimize even more. GCC performs nearly all supported optimizations that do not involve a space-speed tradeoff. The compiler does not perform loop unrolling or function inlining when you specify -O2

    Dans mon code je n utilise pas de fonction inline bien que la fonction inline fait gagner du temps car on évite des saut d adresse donc je suis étonné. Mais j ai bien une boucle, et je ne comprend pas comment il arrive à optimiser la vitesse d exécution de mon programme en supprimant la boucle?

    Je précise que j ai déjà fait un peu d assembleur.

    Merci d avance pour votre aide

    -----

  2. #2
    Jack
    Modérateur

    Re : Signification Gcc -O2

    Je ne comprends pas comment tu peux effectuer la boucle pendant 10 secondes avec ton "While (time(NULL) < 10 ) ".
    Tu peux expliquer le principe?

  3. #3
    cosmoff

    Re : Signification Gcc -O2

    Oui en réalité il fait faire :
    Int début = time (null);
    While (time (null) < début + 10){
    La fonction time retourne un temps tout simplement

  4. #4
    Jack
    Modérateur

    Re : Signification Gcc -O2

    Et donc, la question est-elle toujours d'actualité avec le code modifié?

  5. A voir en vidéo sur Futura
  6. #5
    invite936c567e

    Re : Signification Gcc -O2

    Bonsoir

    Je ne vois pas ce qu'il y a d'étonnant à aller plus vite quand on réalise une optimisation du code. Parvenir à gagner un facteur entre 5 et 10 sur la vitesse en partant d'un code C non optimisé (ou optimisé en taille) est très courant.

    Si tu souhaites savoir où le gain a pu être réalisé, le plus simple serait encore de comparer le code généré avec et sans l'option -O2. Tu pourrais par exemple découvrir que le code non optimisé est particulièrement inefficace, ou bien que le code optimisé ne fait pas vraiment ce que tu souhaites.

  7. #6
    cosmoff

    Re : Signification Gcc -O2

    Ce qui me pose problème c est que mon code est très simple (3 instructions) et je ne vois pas où on peut l optimiser

  8. #7
    Paraboloide_Hyperbolique

    Re : Signification Gcc -O2

    Bonjour,

    L'optimisation peut se voir au niveau du code assembleur (flag -S dans gcc). Vous pouvez constater les différences en entrant votre code ici: https://godbolt.org/ et en spécifiant le flag d'optimisation voulu.

  9. #8
    polo974

    Re : Signification Gcc -O2

    il suffit de comparer le code assembleur.
    option -S
    Jusqu'ici tout va bien...

  10. #9
    pm42

    Re : Signification Gcc -O2

    Citation Envoyé par polo974 Voir le message
    il suffit de comparer le code assembleur.
    option -S
    En effet. On peut aussi dire que nous donner le code complet qui marche sans mettre des majuscules sur Int et While pourrait aider si on voulait tester nous même.

  11. #10
    invite936c567e

    Re : Signification Gcc -O2

    Citation Envoyé par cosmoff Voir le message
    Ce qui me pose problème c est que mon code est très simple (3 instructions) et je ne vois pas où on peut l optimiser
    Il n'y a peut-être que trois lignes contenant des instructions en langage C, mais chacune réalise en fait plusieurs opérations.

    Je ne sais pas à quelle cible est destiné ce code, mais sur de petites plateformes (micro-contrôleurs 8 bits, par exemple) ces opérations peuvent être nombreuses.

    Par exemple, un simple I++ nécessite de :
    - pointer sur la première adresse de la variable I,
    - copier cette variable dans des registres,
    - ajouter une unité aux registres (succession d'additions avec retenue),
    - re-pointer sur la première adresse de la variable I,
    - recopier les registres dans cette variable.
    Typiquement, un tel code peut être optimisé en conservant la valeur de I dans des registres étendus au regard de l'addition (sur 16 bits pour une UC 8 bits) et en n'effectuant les pointages et les copies qu'une fois, avant et après la boucle. On peut aisément gagner un facteur 10 sur la vitesse avec ce type d'optimisation.

  12. #11
    inviteb9f49292

    Re : Signification Gcc -O2

    "man gcc" a la réponse à nos questions... et même bien plus!
    Les optimisations en fonction du niveau y sont détaillées.
    Et bonus, je suis tombé là-dessus:
    Code:
    gcc -Q -O2 --help=optimizers

Discussions similaires

  1. signification
    Par invite7b463ef4 dans le forum Mathématiques du collège et du lycée
    Réponses: 1
    Dernier message: 06/02/2014, 17h36
  2. signification
    Par invite11df21b5 dans le forum Matériel - Hardware
    Réponses: 1
    Dernier message: 09/02/2013, 16h46
  3. signification?
    Par invite5b74ec91 dans le forum Mathématiques du supérieur
    Réponses: 4
    Dernier message: 21/06/2011, 14h04
  4. signification ->
    Par invite15ed96f0 dans le forum Programmation et langages, Algorithmique
    Réponses: 2
    Dernier message: 09/06/2011, 15h48
  5. signification de R+ et R*
    Par invite35aeaad0 dans le forum Mathématiques du collège et du lycée
    Réponses: 5
    Dernier message: 10/10/2009, 15h47