使用StopWatch和foreach循环的C#*Strange*问题

Alo*_*kin 2 c# performance foreach loops stopwatch

我有这个代码:

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>");
Run Code Online (Sandbox Code Playgroud)

它写入:
00:00:00.0004255在第一次尝试(不在调试中)
00:00:00.0004260在第二次尝试和
00:00:00.0004281在第三次尝试.

现在,如果我更改代码,那么度量将 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>");
}
Run Code Online (Sandbox Code Playgroud)

...我在
[00:00:00.0000014,00:00:00.0000011] = 00:00:00.0000025第一次尝试(不在调试中),
[00:00:00.0000016,00:00:00.0000011] = 00:第二次尝试00:00.0000027,第三次尝试
[00:00:00.0000013,00:00:00.0000011] = 00:00:00.0000024

?!
根据第一个结果,这完全是胡说八道......我听说foreach循环很慢,但从未想到它是如此缓慢......是吗?

options有2个选项.这里的option类,如果需要的话:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

谢谢.

Guf*_*ffa 7

foreach循环本身与时差无关.

什么是GetOptions方法返回?我的猜测是它没有返回一个选项集合,而是一个能够获得选项的枚举器.这意味着在您开始迭代它们之前,实际上不会完成获取选项.

在第一种情况下,您在开始迭代选项之前开始计时,这意味着获取选项的时间包含在时​​间中.

在第二种情况下,您开始迭代选项开始计时,这意味着获取选项的时间包括在时间中.

因此,您看到它的时差不是由于foreach循环本身,而是获取选项所需的时间.

您可以通过将选项读入集合来确保立即获取选项:

var options = GetOptions(From, Value, SelectedValue).ToList();
Run Code Online (Sandbox Code Playgroud)

现在测量性能,你会发现差别很小.