Partage
  • Partager sur Facebook
  • Partager sur Twitter

boucle for ou while

    25 avril 2019 à 10:40:31

    bonjour

    laquelle de ces 2 boucles et la plus optimisé niveau performance ?

    int i = 0;
    
    while(tab[i] != -1)
        printf("%d\n", tab[i++]);
    int i;
    
    for(i = 0 ; tab[i] != -1 ; i++)
        printf("%d\n", tab[i]);

    merci


    • Partager sur Facebook
    • Partager sur Twitter
      25 avril 2019 à 11:46:58

      Aucune, c'est la même chose.
      • Partager sur Facebook
      • Partager sur Twitter
        25 avril 2019 à 11:54:40

        Salut,

        C'est juste une question de sémantique, mais le while me semble plus adapté à ce qu'on cherche à faire ici. Après niveau performance, c'est le compilo qui gère, comme le dit Pouet_forever, de grande chances que ça revienne au même.

        • Partager sur Facebook
        • Partager sur Twitter

        Stringman | Jeux de plateforme : Nouvelle Démo. (màj : 20 Juillet 2019)

          25 avril 2019 à 12:03:56

          Aucune. La variable i n'a aucune raison de prolonger sa misérable existence au delà de la boucle, donc ça devrait être :

          for (int i = 0 ; tab[i] != -1 ; i++) {
              printf("%d\n", tab[i]);
          }
          

          La version avec for est plus adaptée parce qu'elle permet d'exprimer le caractère local de la variable, et de proposer une tournure idiomatique pour un parcours linéaire de tableau avec valeur sentinelle.

          Mais ce n'est pas une question de performances du code généré.

          ---


          Le code généré (compiler avec gcc -Os -S fichier.c pour voir) est EXACTEMENT LE MEME pour les deux versions, ainsi que pour une autre avec pointeur

          void baz(int tab[]) 
          {   
              for(int *p = tab; *p != -1 ; p++)
          	printf("%d\n", *p);
          }


          Le code assembleur :

          baz:
          .LFB2:
          	pushq	%rbp
          	pushq	%rbx
          	leaq	.LC0(%rip), %rbp
          	movq	%rdi, %rbx
          	subq	$8, %rsp
          .L13:
          	movl	(%rbx), %esi
          	cmpl	$-1, %esi
          	je	.L16
          	movq	%rbp, %rdi
          	xorl	%eax, %eax
          	addq	$4, %rbx
          	call	printf@PLT
          	jmp	.L13
          .L16:
          	popq	%rax
          	popq	%rbx
          	popq	%rbp
          	ret
          .LFE2:
          

          (en enlevant les directives)


          Pour la micro-optimisation, le compilateur est généralement plus fort que le programmeur moyen. Détecter et optimiser les parcours linéaires d'un tableau, les compilos savent faire ça les doigts dans le nez depuis un demi siècle.

          Déjà, si le débutant tracassé par l'optimisation pensait à cocher les bonnes options dans son IDE...

          ---

          A la limite, si on a beaucoup de traitements sur des tableaux avec des valeurs sentinelles -1, on écrirait

          POUR_TOUT_ELEMENT(element, tableau) {
              printf("%s\n", element);
          }
          

          avec la macro

          #define POUR_TOUT_ELEMENT(e, t) \
              for(int i=0, e=0; (e = t[i]) != -1; i++)
           

          Bah oui, c'est à ça que c'était prévu de servir, la boucle for et les macros...


          -
          Edité par michelbillaud 25 avril 2019 à 12:24:00

          • Partager sur Facebook
          • Partager sur Twitter
            25 avril 2019 à 12:36:13

            Comme disent les autres, le compilo gère ça à ta place. Toi en tant que programmeur C, tu dois juste te soucier de faire du code propre et maintenable.

            Ceci dit il y a quelques pratiques à avoir pour avoir un code plus performant - par exemple quand tu fais une multiplication de matrice, suivant si tu fais tes calculs par ligne ou par colonne tu n'auras pas la même performance. Mais c'est un sujet assez avancé - en tant que débutant c'est le moindre de tes soucis, et dans 90% des cas on s'en fiche.

            Sinon effectivement activer les flags d'optimisation ne peuvent pas faire de mal : -O2 ou -O3. Faut voir avec ton IDE comment activer ça.

            • Partager sur Facebook
            • Partager sur Twitter
              26 avril 2019 à 11:24:55

              Ils sont identique niveau performance

              Mais en lisibilité while est mieux

              • Partager sur Facebook
              • Partager sur Twitter
                17 mai 2019 à 9:44:27

                SessoKosga a écrit:

                Mais en lisibilité while est mieux

                C'est une question de ressenti personnel.

                Pour ma part, je préfère le for car tous les contrôles de la boucle sont réunis au même endroit et du coup je trouve le code plus lisible.

                • Partager sur Facebook
                • Partager sur Twitter

                boucle for ou while

                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                • Editeur
                • Markdown