C#LINQ与foreach迭代器块的性能

asm*_*smo 9 linq foreach select iterator

1)这些生成相同的字节代码吗?

2)如果没有,在某些情况下使用一个是否有任何收益?

// LINQ select statement
return from item in collection
    select item.Property;

// foreach in an iterator block
foreach (item in collection)
    yield return item.Property;
Run Code Online (Sandbox Code Playgroud)

mmi*_*mix 8

  1. 它们不会生成相同的代码,但归结为相同的东西,你得到一个对象实现IEnumerable<typeof(Property)>.不同之处在于linq从其库中提供了迭代器(在这种情况下最有可能通过使用WhereSelectArrayIteratorWhereSelectListIterator),而在第二个示例中,您自己生成一个解析集合的迭代器块.迭代器块方法总是通过编译器魔术的方式编译为一个单独的类实现IEnumerable<typeof(yield)>,当您调用迭代器块方法时,它实际上没有看到,而是隐式实例化.

  2. 性能方面,对于可索引的集合,#1应该稍微(但只是略微)更快,因为当您遍历结果时,IEnumerable您将直接从foreach进入优化的linq迭代器中的集合检索.在示例#2中,您从foreach进入迭代器块的foreach并从那里进入集合检索,您的性能主要取决于编译器在优化yield逻辑方面的智能程度.在任何情况下,我都会想到,对于任何复杂的收集机制,检索成本都会使这种差异边缘化.

恕我直言,我总是选择#1,如果没有别的东西,它可以让我不必为了迭代而编写一个单独的方法.