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 ?
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 ?
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>
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");
}
}
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 ?
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.
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.
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 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.
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 dewhile
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.9 votes
Il est probablement préférable que vous ne sachiez pas. Si vous utilisez la connaissance d'une possible optimisation prématurée pour influencer votre programmation, en choisissant un code légèrement plus rapide que la conception la plus lisible avant même de savoir si vous avez besoin de cette vitesse, vous échouez.
0 votes
En C : vous pouvez également comparer leur sortie asm :
gcc -S mycsource.c