gpt4 book ai didi

c# - Foreach 将集合强制转换为 IEnumerable 的工作比不强制转换慢?

转载 作者:太空狗 更新时间:2023-10-29 18:35:09 26 4
gpt4 key购买 nike

今天发现一个不太明白的地方。我得到了 following code在 LinqPad(版本 5)中:

void Main()
{
const int size = 5000000;
List<Thing> things = Enumerable.Range(1, 5000000).Select(x => new Thing {Id = x}).ToList();

var sw1 = Stopwatch.StartNew();
foreach (var t in things)
if(t.Id == size) break;
sw1.ElapsedMilliseconds.Dump();

var sw2 = Stopwatch.StartNew();
IEnumerable<Thing> ienThings = things;
foreach (var t in ienThings)
if (t.Id == size) break;
sw2.ElapsedMilliseconds.Dump();

}

class Thing
{
public long Id { get; set; }
}

看起来第二个循环花费的时间是第一个循环的两倍。为什么这个简单的转换会造成这样的效果?我敢肯定,幕后发生了一些我不知何故遗漏的简单事情。

最佳答案

这是由于 callcallvirt 使用的指令不同造成的。

call        System.Collections.Generic.List<UserQuery+Thing>+Enumerator.get_Current
call System.Collections.Generic.List<UserQuery+Thing>+Enumerator.MoveNext

对比

callvirt    System.Collections.Generic.IEnumerator<UserQuery+Thing>.get_Current
callvirt System.Collections.IEnumerator.MoveNext

callvirt 指令执行空检查,这就是它较慢的原因。

关于c# - Foreach 将集合强制转换为 IEnumerable 的工作比不强制转换慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33015670/

26 4 0