我不喜歡過早的優化,但我很好奇,而做一個簡單的任務 所以我添加了一個秒錶。 我不明白差異如何如此之大。比在某些情況下,Foreach快得多嗎?
每個字符串數組(7個字符)[richtextbox.text]。
排列長度:5500個元素。
的foreach執行時間:0.0015秒
對於執行時間:9.757秒
爲:
if (chkLineBreaks.Checked)
{
for (int i = 0; i < txtInput.Lines.Length; i++)
{
outputStringBuilder.Append([email protected]"'{txtInput.Lines[i]}',");
}
}
的foreach:
foreach (var line in txtInput.Lines)
{
outputStringBuilder.Append([email protected]"'{line}',");
if (chkLineBreaks.Checked)
outputStringBuilder.AppendLine();
}
從我讀過的差異應該可以忽略不計,而且會稍微快一點。
更有甚者,在foreach在每次迭代的條件(除非它被「吊」起來循環之前
這到底是怎麼回事
編輯:? 我已經改變了的foreach代碼:
int i = 0;
foreach (var line in txtInput.Lines)
{
outputStringBuilder.Append([email protected]"'{txtInput.Lines[i]}',");
i++;
}
所以現在正在做同樣的事情 它正在4.625秒 ..仍有約一半的時間用於
而且我知道,我可以提取外循環數組,但是這不是我測試在這裏:)
編輯#2: 這是該節的整個代碼:
Stopwatch sw = new Stopwatch();
sw.Start();
// for (int i = 0; i < txtInput.Lines.Length; i++)
// {
// outputStringBuilder.Append([email protected]"'{txtInput.Lines[i]}',");
// }
int i = 0;
foreach (var line in txtInput.Lines)
{
outputStringBuilder.Append([email protected]"'{txtInput.Lines[i]}',");
i++;
}
MessageBox.Show(sw.Elapsed.ToString());
你可能也想嘗試保存'txtInput.Lines.Length'給一個變量,然後使用該變量的條件部分的for循環。看看這是如何影響性能的。 –
9秒來自某些與for/foreach無關的東西。可能是一些UI線程編組問題。還要注意這兩個測試不相同,因爲在foreach的情況下,你還要檢查chkLineBreaks.Checked。 –
代碼中有太多的差異來得出任何真正的結論。如果你真的想要比較,除了'for'和'foreach'之外,這兩段代碼完全一樣。 – jdweng