Can*_*hiu 4 c# linq performance
我使用(ElementAt,Count)和(foreach)作为Linq查询的结果迭代IEnumerable.令我惊讶的是,性能差异是25-30倍!这是为什么?
IEnumerable<double> result =
... simple Linq query that joins two tables
... returns about 600 items
double total = 0;
// Method 1: iterate with Count and ElementAt
for( int i = 0; i < result.Count(); i++ )
{
total += result.ElementAt(i);
}
// Method 2: iterate with foreach
foreach( double value in result )
{
total += value;
}
Run Code Online (Sandbox Code Playgroud)
ros*_*dia 10
该ElementAt()方法是O(n),除非表示的实际具体类IEnumerable优化它.这意味着每次调用它时,它都必须遍历整个Enumerable以找到元素n.更不用说因为你i < result.Count()在for循环的条件部分,它必须每次循环遍历整个枚举以获得该计数.
第二种方式,你只需要循环result一次.
因为每次调用它都会ElementAt迭代IEnumerable.IEnumerables未编入索引,因此ElementAt必须使用GetEnumerator().
为什么不呢
total = result.Sum();
Run Code Online (Sandbox Code Playgroud)