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)
谢谢.
foreach循环本身与时差无关.
什么是GetOptions方法返回?我的猜测是它没有返回一个选项集合,而是一个能够获得选项的枚举器.这意味着在您开始迭代它们之前,实际上不会完成获取选项.
在第一种情况下,您在开始迭代选项之前开始计时,这意味着获取选项的时间包含在时间中.
在第二种情况下,您在开始迭代选项后开始计时,这意味着获取选项的时间不包括在时间中.
因此,您看到它的时差不是由于foreach循环本身,而是获取选项所需的时间.
您可以通过将选项读入集合来确保立即获取选项:
var options = GetOptions(From, Value, SelectedValue).ToList();
Run Code Online (Sandbox Code Playgroud)
现在测量性能,你会发现差别很小.
| 归档时间: |
|
| 查看次数: |
1511 次 |
| 最近记录: |