45 votes

Quelle boucle est la plus rapide, while ou for ?

Vous pouvez obtenir le même résultat avec des boucles for et while :

Tandis que :

$i = 0;
while ($i <= 10){
  print $i."\n";
  $i++;
};

Pour :

for ($i = 0; $i <= 10; $i++){
  print $i."\n";
}

Mais lequel est le plus rapide ?

8 votes

Mesurez-les si vous le souhaitez (mais ils sont probablement égaux).

4 votes

Je vous parie qu'ils génèrent exactement le même code d'octets.

6 votes

for dans la plupart des langues est un sucre syntaxique pour un équivalent de while qui est à son tour un sucre syntaxique pour un ensemble d'étiquettes et d'informations. gotos dans l'assemblage ou l'IL. Compte tenu d'une mise en œuvre efficace de la spécification du langage, ils seront à peu près égaux. Certains langages incluent des "commentaires" internes donnant des indications aux décompilateurs/réflecteurs sur l'aspect du code original, ce qui aura un effet négligeable sur les performances. Je pense que vous constaterez que les plus grandes différences de temps d'exécution sont inhérentes à la programmation du système d'exploitation.

28voto

Mehrdad Afshari Points 204872

Cela dépend clairement de l'implémentation particulière de l'interprète/compilateur du langage spécifique.

Cela dit, en théorie, toute mise en œuvre sensée est susceptible de pouvoir mettre en œuvre l'une en termes de l'autre si elle est plus rapide, de sorte que la différence devrait être négligeable au maximum.

Bien sûr, j'ai supposé que <code>while</code> y <code>for</code> se comportent comme en C et dans les langages similaires. Vous pourriez créer un langage avec une sémantique complètement différente pour les éléments suivants <code>while</code> y <code>for</code>

14voto

Shane Points 1227

En C#, la fonction Pour la boucle est légèrement plus rapide.

Pour la boucle, la moyenne se situe entre 2,95 et 3,02 ms.

La boucle de While a une durée moyenne de 3,05 à 3,37 ms.

Une petite application console rapide à prouver :

 class Program
    {
        static void Main(string[] args)
        {
            int max = 1000000000;
            Stopwatch stopWatch = new Stopwatch();

            if (args.Length == 1 && args[0].ToString() == "While")
            {
                Console.WriteLine("While Loop: ");
                stopWatch.Start();
                WhileLoop(max);
                stopWatch.Stop();
                DisplayElapsedTime(stopWatch.Elapsed);
            }
            else
            {
                Console.WriteLine("For Loop: ");
                stopWatch.Start();
                ForLoop(max);
                stopWatch.Stop();
                DisplayElapsedTime(stopWatch.Elapsed);
            }
        }

        private static void WhileLoop(int max)
        {
            int i = 0;
            while (i <= max)
            {
                //Console.WriteLine(i);
                i++;
            };
        }

        private static void ForLoop(int max)
        {
            for (int i = 0; i <= max; i++)
            {
                //Console.WriteLine(i);
            }
        }

        private static void DisplayElapsedTime(TimeSpan ts)
        {
            // Format and display the TimeSpan value.
            string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}",
                ts.Hours, ts.Minutes, ts.Seconds,
                ts.Milliseconds / 10);
            Console.WriteLine(elapsedTime, "RunTime");
        }
    }

1 votes

Il est possible que lorsque le compilateur exécute la boucle while, il exécute également d'autres tâches en arrière-plan, ce qui prend un peu plus de temps. Comment vous êtes-vous assuré de cela ?

0 votes

Je ne l'ai pas fait. Il ne s'agissait pas d'une expérience en chambre blanche. J'ai effectué ce même processus à de nombreuses reprises et les résultats ont toujours été similaires. Cela m'indique donc que la probabilité qu'une tâche de fond affecte aléatoirement les temps uniquement pour la boucle While est minime.

2 votes

Ce qui est le plus rapide dépend de l'objet de l'itération. Voici une comparaison de blog qui évalue les itérations sur plusieurs types d'objets, tels que les DataRows et les objets personnalisés, en incluant également les performances de la construction de la boucle While et pas seulement celles des constructions for et foreach.

12voto

Anthony Points 101

Je trouve que la boucle la plus rapide est une boucle while inversée, par exemple

var i = myArray.length;
while(i--){
  // Do something
}

5voto

Aillyn Points 5955

Comme d'autres l'ont dit, tout compilateur digne de ce nom génère un code pratiquement identique. Toute différence de performance est négligeable - vous faites de la micro-optimisation.

La vraie question est de savoir ce qui est le plus lisible. Et c'est la for (au moins pour l'IMHO).

3voto

nmichaels Points 21955

S'il s'agissait d'un programme en C, je ne dirais rien. Le compilateur produira exactement le même code. Comme ce n'est pas le cas, je dis qu'il faut le mesurer. En réalité, il ne s'agit pas de savoir quelle construction de boucle est la plus rapide, puisque le gain de temps est minuscule. Il s'agit de savoir quelle construction de boucle est plus facile à maintenir. Dans le cas que vous avez montré, une boucle for est plus appropriée parce que c'est ce que les autres programmeurs (y compris les futurs vous, je l'espère) s'attendront à y voir.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X