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

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 74
    Points : 44
    Points
    44
    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
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    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 du Club
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2011
    Messages : 74
    Points : 44
    Points
    44
    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
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    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 du Club
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2011
    Messages : 74
    Points : 44
    Points
    44
    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 éminent sénior
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    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 214
    Points : 10 140
    Points
    10 140
    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
    Membre expérimenté

    Homme Profil pro
    Collégien
    Inscrit en
    Juillet 2010
    Messages
    545
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Afghanistan

    Informations professionnelles :
    Activité : Collégien

    Informations forums :
    Inscription : Juillet 2010
    Messages : 545
    Points : 1 431
    Points
    1 431
    Par défaut
    Bonjour,

    Plus on accédè à une variable plus la probabilité qu'elle soit dans la mémoire cache augmente. (Il y a un facteur d’accélération entre 10 et 100 entre un accès en cache et un accès en RAM).

    Généralement quand on active le options d'optimisation le compilo va essayer d'utiliser un maximum de registres pour effectuer les traitement sur la dites variables (facteur d’accélération entre 1 et 3 entre registre et cache L1).

  8. #8
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 360
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 360
    Points : 20 377
    Points
    20 377
    Par défaut
    Citation Envoyé par Kannagi Voir le message
    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.
    EAX c'est le registre accumulateur ; il sert exclusivement à effectuer des opérations arithmétiques ou bien à passer des paramètres à l'instruction INT pour l'appel d'interruptions

    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.
    oui mais pour charger la variable locale dans les registres de travail du CPU il faut qu'elle soit chargée de quelque part donc de la RAM.
    Tu ne peux pas placer constammer une valeur dans EBX,ECX par exemple sinon la valeur va être écrasée au fonctionnement du CPU

  9. #9
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 812
    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 : 3 812
    Points : 7 097
    Points
    7 097
    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...
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  10. #10
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 149
    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 149
    Points : 28 116
    Points
    28 116
    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

  11. #11
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    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

  12. #12
    Expert éminent sénior

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    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..
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

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