为啥我的 foreach 比我的 for 循环快? [复制]
Posted
技术标签:
【中文标题】为啥我的 foreach 比我的 for 循环快? [复制]【英文标题】:Why is my foreach faster than my for loop? [duplicate]为什么我的 foreach 比我的 for 循环快? [复制] 【发布时间】:2015-11-27 18:32:07 【问题描述】:int[] testArray = new int[200000000];
Stopwatch st2 = new Stopwatch();
st2.Start();
for (var j = 0; j < testArray.Length; j++)
st2.Stop();
Console.WriteLine("Total milliseconds - FOR LOOP: 0", st2.Elapsed.TotalSeconds);
Stopwatch st = new Stopwatch();
st.Start();
foreach (var arr in testArray)
st.Stop();
Console.WriteLine("Total milliseconds - FOREACH LOOP: 0", st.Elapsed.TotalSeconds);
结果:
为:0,7046522 秒 foreach: 0,05508682 秒
为什么我的 foreach 更快?我认为我的 for 循环会比 foreach 更快
【问题讨论】:
我得到了 foreach 大约 0.6 秒的结果 - 与 for-result(0.7 秒)差别不大 我无法复制这些结果。我在发布版本中得到Total milliseconds - FOR LOOP: 0.1187888 Total milliseconds - FOREACH LOOP: 0.2583282
。
阅读如何正确地对 JITed 代码进行基准测试。这不是一个有效的基准。
@MatthewWatson - 我得到的结果与你非常相似。
在两个循环中进行一些操作,以便进行更明智的测试
【参考方案1】:
原因在article中有详细解释。它说
在微基准测试中,引入额外的局部变量 foreach 循环会影响性能。但是,如果那些本地 变量在循环体中被重复使用多次,它们可能导致 性能提升。
因此:如果数组必须 每次迭代只能访问一次。
您可以通过在循环中包含一些操作并再次运行它来实现这一点。
【讨论】:
以上是关于为啥我的 foreach 比我的 for 循环快? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
当我使用 for 循环时,为啥我的代码没有在 forEach 中等待? [复制]