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 :

Boucle infinie While et for


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2011
    Messages : 74
    Par défaut Boucle infinie While et for
    Bonjour à tous et à toutes
    Au niveau d'optimisation quelle est la différence entre : While(1){} et for(;; ){}?
    Merci d'avance

  2. #2
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Aucune. Ou tellement rien.

    Deux fonctions :
    Code boucles.c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void withFor(void)
    {
        for(;;)
            ;
    }
     
    void withWhile(void)
    {
        while(1)
            ;
    }

    L'assembleur derrière, généré par MinGW:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    PS D:\Users\pgradot\Documents\C\out\Debug> objdump.exe -d .\boucles.o
    .\boucles.o:     file format pe-i386
     
    Disassembly of section .text:
     
    00000000 <_withFor>:
       0:   55                      push   %ebp
       1:   89 e5                   mov    %esp,%ebp
       3:   eb fe                   jmp    3 <_withFor+0x3>
     
    00000005 <_withWhile>:
       5:   55                      push   %ebp
       6:   89 e5                   mov    %esp,%ebp
       8:   eb fe                   jmp    8 <_withWhile+0x3>
       a:   90                      nop
       b:   90                      nop
    PS D:\Users\pgradot\Documents\C\out\Debug>
    Il y a deux NOP en plus (qui m'étonnent un peu d'ailleurs). N'importe quelle action à l'intérieur de la boucle coûtera plus que 2 NOP en toute logique.

    EDIT : en inversant les deux fonctions dans le fichier, les NOP se retrouvent dans withFor(). Les deux fonctions sont donc identiques. Faudrait voir si les NOP ne sont pas un artefact d'objdump ou du fait que ce soit la dernière fonction du fichier.

    EDIT bis : ces NOP n'ont vraiment rien à faire là :
    Code boucles.c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    void withWhile(void)
    {
        while(1)
            ;
    }
     
    void withFor(void)
    {
        for(;;)
            ;
    }
     
    void nop()
    {
     
    }

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    PS D:\Users\pgradot\Documents\C\out\Debug> objdump.exe -d .\boucles.o
     
    .\boucles.o:     file format pe-i386
     
     
    Disassembly of section .text:
     
    00000000 <_withWhile>:
       0:   55                      push   %ebp
       1:   89 e5                   mov    %esp,%ebp
       3:   eb fe                   jmp    3 <_withWhile+0x3>
     
    00000005 <_withFor>:
       5:   55                      push   %ebp
       6:   89 e5                   mov    %esp,%ebp
       8:   eb fe                   jmp    8 <_withFor+0x3>
     
    0000000a <_nop>:
       a:   55                      push   %ebp
       b:   89 e5                   mov    %esp,%ebp
       d:   5d                      pop    %ebp
       e:   c3                      ret
       f:   90                      nop
    Il n'y a donc pas de différence en les deux boucles.

  3. #3
    Membre actif
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2011
    Messages : 74
    Par défaut
    Merci pour votre réponse
    J'ai bien apprécié votre réponse.
    et ceci valable pour n'importe quel compilateur ?
    Autre question : Pourquoi l'accès à une variable globale demande deux fois plus de temps que d’accéder à une variable locale?

  4. #4
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Merci pour votre réponse
    J'ai bien apprécié votre réponse.
    Ca faisait plusieurs fois que je voyais la question, j'ai décidé de vraiment regarder. C'était instructif pour moi. Content que ça vous serve aussi

    et ceci valable pour n'importe quel compilateur ?
    En théorie, non : le résultat n'est valable que pour ce compilateur. Comme c'est le portage de gcc pour Windows, ça doit aussi être valable pour gcc. En pratique, je pense que n'importe quel compilateur un minimum intelligent sera capable de produire le même résultat (et même devrait le produire).

    Autre question : Pourquoi l'accès à une variable globale demande deux fois plus de temps que d’accéder à une variable locale?
    Comment avez-vous constaté cela ?

  5. #5
    Membre actif
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2011
    Messages : 74
    Par défaut
    Citation Envoyé par Bktero Voir le message
    Comment avez-vous constaté cela ?
    Car elles se trouvent dans deux emplacements différents : la Variable globale dans la RAM et la Variable locale dans les registres de travail du CPU.

  6. #6
    Expert confirmé
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 226
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 226
    Par défaut
    Citation Envoyé par achrafkaran Voir le message
    Car elles se trouvent dans deux emplacements différents : la Variable globale dans la RAM et la Variable locale dans les registres de travail du CPU.
    Ce n'est pas possible que les variables local soit dans le registre (par info sur intel il n'y a que 4 registres pour les 'données') , mais je veux bien croire que pour une variable il l'a laisse dans un registre pour une optimisation particulière.

    Sinon en général il doit faire un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    mov ma_variable,%eax
    Mais les variables sont en RAM que ça soit locale ou général.

  7. #7
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 064
    Par défaut
    Bonsoir,

    Au niveau d'optimisation quelle est la différence entre : While(1){} et for(;; ){}?
    Alors avantage ( 1-1 ) pour chacun


    • Avec la boucle for, tu tapes moins de lettres
    • Avec la boucle while, c'est plus lisible




    Sans rire, avant de parler d'optimisation, on pourrait parler de code lisible et maintenable, d'un code concis, de votre temps de codage et tout ça avant de parler de rapidité à l'exécution, non?

    Si vous faites un code spaghetti, avec des goto partout, vous allez optimiser quoi? Si votre code est laissé à un codeur tierce et qu'il doit vous comprendre, ne gagnera-t-il pas plus de temps à refaire? (Perte de temps, d'argent, ...)

    L'optimisation (dans le sens où vous en parlez) est loin d'être la chose la plus importante, je dirais qu'elle doit être présente quand on a pas ou plus le choix. Est-ce votre cas?

    En même temps, si votre compilateur n'accepte pas l'une ou l'autre syntaxe, cette question ne se posera peut-être même pas

    Les boucles infinies, je rajouterais, ça peut être dangereux, il faut bien connaître les conditions d'arrêt de sa boucle et si on peut éviter et bien je dirais, on optimise!

    Question : Pourquoi ne pas comparer avec une boucle infinie utilisant goto ?

    Bonne continuation...

  8. #8
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Par défaut
    Bonjour,

    Citation Envoyé par achrafkaran Voir le message
    Au niveau d'optimisation quelle est la différence entre : While(1){} et for(;; ){}?
    Sauf cas tres tres tres exceptionnel, il n'y a aucune raison de se poser une telle question.

    Soit tu en es a des phases d'optimisation telles que tu en arrives ici, et dans ce cas tu sais que tu dois generer l'assembleur, et optimiser celui-ci, soit tu en a l'ecriture du programme, et ca ne sert a rien de chercher a optimiser cela.

    Enfin, si c'est pour l'information, c'est toujours interessant d'etre curieux.
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  9. #9
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Sauf cas tres tres tres exceptionnel, il n'y a aucune raison de se poser une telle question.
    +1000 !

    La différence sera au pire de quelques cycles et j'ose espérer que le contenu de la boucle sera bien plus coûteux, rendant négligeable la différence entre while et for

  10. #10
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par gangsoleil Voir le message
    Sauf cas tres tres tres exceptionnel, il n'y a aucune raison de se poser une telle question.


    Je pense même qu'on peut rajouter une floppée de "très très très très très" exceptionels..

Discussions similaires

  1. Boucle infinie (While)
    Par YoshK dans le forum ActionScript 3
    Réponses: 1
    Dernier message: 03/11/2010, 16h11
  2. [AC-2003] Boucles do while next for...
    Par isabelle b dans le forum VBA Access
    Réponses: 19
    Dernier message: 01/02/2010, 09h03
  3. [EXPRESSION REGULIERE][WHILE][\gsmi] boucle infini
    Par floanne dans le forum Langage
    Réponses: 8
    Dernier message: 27/07/2007, 17h40
  4. Boucle infinie for
    Par shnouf dans le forum Langage
    Réponses: 5
    Dernier message: 25/10/2006, 18h46
  5. boucle while et for
    Par Invité dans le forum Langage
    Réponses: 4
    Dernier message: 06/04/2006, 09h48

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