Cas*_*erT 2 .net c# foreach benchmarking list
考虑一下:
必要的:
//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
Run Code Online (Sandbox Code Playgroud)
标准foreach:
foreach (var range in letterRange)
{
Console.Write(range + ",");
}
Console.Write("\n");
Run Code Online (Sandbox Code Playgroud)
内置的foreach:
letterRange.ForEach(range => Console.Write(range + ",")); //delegate(char range) works as well
Console.Write("\n");
Run Code Online (Sandbox Code Playgroud)
我已经尝试过将它们相互对准,并且内置的foreach速度提高了2倍,这似乎很多.
我用Google搜索过,但我似乎无法找到任何答案.
另外,关于:在.NET中,哪个循环运行得更快,'for'或'foreach'?
for (int i = 0; i < letterRange.Count; i++)
{
Console.Write(letterRange[i] + ",");
}
Console.Write("\n");
Run Code Online (Sandbox Code Playgroud)
据我所知,不执行比标准foreach更快.
Meh*_*ari 17
我认为你的基准是有缺陷的.Console.Write
是一个I/O绑定任务,它是您的基准测试中最耗时的部分.这是一个微观基准,应该非常仔细地进行,以获得准确的结果.
这是一个基准:http://diditwith.net/PermaLink,guid,506c0888-8c5f-40e5-9d39-a09e2ebf3a55.aspx(看起来不错,但我自己没有验证过).截至2015年8月14日,该链接似乎已被破坏
Joh*_*lla 10
当您输入foreach循环时,您将枚举每个项目.该枚举每次迭代会导致两次方法调用:一次调用IEnumerator<T>.MoveNext()
,另一次调用IEnumerator<T>.Current
.这是两条call
IL指令.
List<T>.ForEach
更快,因为它每次迭代只有一个方法调用 - 无论你提供的Action<T>
代理是什么.这是一条callvirt
IL指令.这明显快于两条call
指令.
正如其他人指出的那样,IO绑定指令Console.WriteLine()
会污染您的基准测试.做一些可以完全局限于记忆的事情,比如将序列的元素添加到一起.
归档时间: |
|
查看次数: |
3806 次 |
最近记录: |