J'ai le code:C# * Problème étrange * avec StopWatch et une boucle foreach
var options = GetOptions(From, Value, SelectedValue);
var stopWatch = System.Diagnostics.Stopwatch.StartNew();
foreach (Option option in options)
{
stringBuilder.Append("<option");
stringBuilder.Append(" value=\"");
stringBuilder.Append(option.Value);
stringBuilder.Append("\"");
if (option.Selected)
stringBuilder.Append(" selected=\"selected\"");
stringBuilder.Append('>');
stringBuilder.Append(option.Text);
stringBuilder.Append("</option>");
}
HttpContext.Current.Response.Write("<b>" + stopWatch.Elapsed.ToString() + "</b><br>");
Il écrit:
00: 00: 00,0004255 dans le premier essai (pas debug)
00 : 00: 00.0004260 dans le deuxième essai et
00: 00: 00.0004281 dans le troisième essai.
Maintenant, si je change le code de sorte que la mesure sera l'intérieur la boucle foreach:
var options = GetOptions(From, Value, SelectedValue);
foreach (Option option in options)
{
var stopWatch = System.Diagnostics.Stopwatch.StartNew();
stringBuilder.Append("<option");
stringBuilder.Append(" value=\"");
stringBuilder.Append(option.Value);
stringBuilder.Append("\"");
if (option.Selected)
stringBuilder.Append(" selected=\"selected\"");
stringBuilder.Append('>');
stringBuilder.Append(option.Text);
stringBuilder.Append("</option>");
HttpContext.Current.Response.Write("<b>" + stopWatch.Elapsed.ToString() + "</b><br>");
}
... Je reçois
[00: 00: 00,0000014, 00: 00: 00,0000011] = 00: 00: 00.0000025 dans le premier essai (pas dans le débogage),
[00: 00: 00.0000016, 00: 00: 00.0000011] = 00: 00: 00.0000027 dans le deuxième essai et
[00: 00: 00.0000013 , 00: 00: 00.0000011] = 00: 00: 00.0000024 dans le troisième essai.
?!
Il est complètement insensé selon les premiers résultats ... J'ai entendu dire que la boucle foreach
est lente, mais n'a jamais imaginé que c'est donc lente ... Est-ce que c'est?
options
a 2 options. est ici la classe option
, si elle est nécessaire:
public class Option
{
public Option(string text, string value, bool selected)
{
Text = text;
Value = value;
Selected = selected;
}
public string Text
{
get;
set;
}
public string Value
{
get;
set;
}
public bool Selected
{
get;
set;
}
}
Merci.
Eh bien, quelle est la question? Est-ce "pourquoi cas 2 horloges plus rapide que le cas 1?" Ou est-ce "pourquoi" chaque boucle est si lente? " –
pourquoi cas 2 horloges plus rapides que le cas 1 –
@Alon: Je vois, donc vous demandez pourquoi l'itération à travers une boucle foreach (à l'exclusion des opérations dans la boucle) est si lente? Oui? –