为啥我的 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 中等待? [复制]

为啥 strchr 比我的 simd 代码快两倍

为啥 mySQL 查询,左连接“明显”比我的内连接快

为啥 utorrents Magnet to Torrent 文件的获取比我的 python 脚本快?

为啥 for-each 循环适用于数组? (爪哇)

为啥我的 forEach 循环没有编辑我的数组? [复制]