【发布时间】:2017-10-29 06:40:25
【问题描述】:
我不喜欢过早的优化,但我在做一个简单的任务时很好奇 所以我加了一个秒表。 我不明白差异怎么会这么大。
每个 [richtextbox.text] 的字符串数组(7 个字符)。
数组长度:5500 个元素。
Foreach 已用时间:0.0015 秒
经过时间:9.757 秒
为:
if (chkLineBreaks.Checked)
{
for (int i = 0; i < txtInput.Lines.Length; i++)
{
outputStringBuilder.Append($@"'{txtInput.Lines[i]}',");
}
}
Foreach:
foreach (var line in txtInput.Lines)
{
outputStringBuilder.Append($@"'{line}',");
if (chkLineBreaks.Checked)
outputStringBuilder.AppendLine();
}
根据我的阅读,差异应该可以忽略不计,而 For 会稍微快一些。
更重要的是,foreach 在每次迭代中都有一个条件(除非它在循环之前被“提升”。
这是怎么回事?
编辑: 我已将 foreach 代码更改为:
int i = 0;
foreach (var line in txtInput.Lines)
{
outputStringBuilder.Append($@"'{txtInput.Lines[i]}',");
i++;
}
所以它现在也在做同样的事情。 它需要 4.625 秒.. 仍然是 FOR 时间的一半左右
我也知道我可以在循环之外提取数组,但这不是我在这里测试的:)
编辑#2: 这是该部分的全部代码:
Stopwatch sw = new Stopwatch();
sw.Start();
// for (int i = 0; i < txtInput.Lines.Length; i++)
// {
// outputStringBuilder.Append($@"'{txtInput.Lines[i]}',");
// }
int i = 0;
foreach (var line in txtInput.Lines)
{
outputStringBuilder.Append($@"'{txtInput.Lines[i]}',");
i++;
}
MessageBox.Show(sw.Elapsed.ToString());
【问题讨论】:
-
您可能还想尝试将
txtInput.Lines.Length保存到一个变量中,然后在 for 循环的条件部分中使用该变量。看看这对性能有何影响。 -
9 秒来自与 for/foreach 无关的东西。可能是一些与 UI 线程之间的编组问题。另请注意,这两个测试是不等价的,因为在 foreach 情况下,您还要检查 chkLineBreaks.Checked。
-
代码中的差异太多,无法得出任何真正的结论。如果您真的想要比较,请让两段代码完全相同,除了“for”和“foreach”。
-
请检查编辑
-
在内部,
foreach命令在给定值数组时执行for循环。如果使用得当,结果应该是相同的。
标签: c# arrays for-loop foreach