Why is Enumerable.Range faster than a direct yield loop?(为什么 Enumerable.Range 比直接 yield 循环快?)
问题描述
下面的代码是检查执行相同解决方案的三种不同方法的性能.
The code below is checking performance of three different ways to do same solution.
结果是:
for 循环"比其他两种解决方案更快并不奇怪,因为 Enumerable.Aggregate 需要更多的方法调用.然而,让我感到惊讶的是,Enumerable.Range"比自制的 IEnumerable"要快.我认为 Enumerable.Range 会比简单的 GetIntRange 方法有更多的开销.
It is not surprising that the "for loop" is faster than the other two solutions, because Enumerable.Aggregate takes more method invocations. However, it really surprises me that "Enumerable.Range" is faster than the "self-made IEnumerable". I thought that Enumerable.Range would have more overhead than the simple GetIntRange method.
这可能是什么原因?
推荐答案
为什么Enumerable.Range
比你自制的GetIntRange
慢?事实上,如果 Enumerable.Range
被定义为
Why should Enumerable.Range
be any slower than your self-made GetIntRange
? In fact, if Enumerable.Range
were defined as
那么它应该和你自制的GetIntRange
一样快.这实际上是 Enumerable.Range
的参考实现,没有编译器或程序员的任何技巧.
then it should be exactly as fast as your self-made GetIntRange
. This is in fact the reference implementation for Enumerable.Range
, absent any tricks on the part of the compiler or programmer.
您可能希望将您的 GetIntRange
和 System.Linq.Enumerable.Range
与以下实现进行比较(当然,正如 Rob 指出的那样,在发布模式下编译).此实现可能会针对编译器从迭代器块生成的内容进行轻微优化.
You may want to compare your GetIntRange
and System.Linq.Enumerable.Range
with the following implementation (of course, compile in release mode, as Rob points out). This implementation may be slightly optimized with respect to what a compiler would generate from an iterator block.
这篇关于为什么 Enumerable.Range 比直接 yield 循环快?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!