c# - 为什么 List<T>.ForEach 比标准 foreach 快?

标签 c# .net list foreach benchmarking

考虑一下:

必要条件:

//The alphabet from a-z
List<char> letterRange = Enumerable.Range('a', 'z' - 'a' + 1)
.Select(i => (Char)i).ToList(); //97 - 122 + 1 = 26 letters/iterations

标准 foreach:

foreach (var range in letterRange)
{
    Console.Write(range + ",");
}
Console.Write("\n");

内置 foreach:

letterRange.ForEach(range => Console.Write(range + ",")); //delegate(char range) works as well
Console.Write("\n");

我试过将它们相互计时,内置的 foreach 最多快 2 倍,这看起来很多。

我用谷歌搜索了一下,但似乎找不到任何答案。

此外,关于:In .NET, which loop runs faster, 'for' or 'foreach'?

for (int i = 0; i < letterRange.Count; i++)
{
    Console.Write(letterRange[i] + ",");
}
Console.Write("\n");

据我所知,执行速度并不比标准 foreach 快。

最佳答案

我认为您的基准有缺陷。 Console.Write 是一项 I/O 绑定(bind)任务,它是基准测试中最耗时的部分。这是一个微基准,应该非常小心地进行以获得准确的结果。

这是一个基准:http://diditwith.net/PermaLink,guid,506c0888-8c5f-40e5-9d39-a09e2ebf3a55.aspx (看起来不错,但我自己还没有验证过)。 截至 2015 年 8 月 14 日,该链接似乎已断开

关于c# - 为什么 List<T>.ForEach 比标准 foreach 快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/744085/

相关文章:

c# - 在 UWP 后台任务中显示信息

python - 矩阵的for循环定义?

c# - 如何在没有 Linq 的情况下从列表中获取一些对象?

python - 将两个列表组合在字典中 - python

c# - 列表列表<>?

c# - System.Windows.Forms.ToolStrip 高度或自动调整大小

c# - 在处置 SqlCommand 之前处置 SqlConnection

c# - 这是否意味着一个对象如果没有实现 IDisposable 就不需要手动清除?

.net - 从 CLI 工具访问 Sitecore API

.net - 是否可以通过 OData 流式传输实体?