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
    PA5CAL

    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
    PA5CAL

    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.
    Dernière modification par PA5CAL ; 30/12/2017 à 10h55.

  12. #11
    lou_ibmix_xi

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