消除边界检查的 foreach 循环有什么特殊情况?
消除边界检查的 foreach/for 循环有什么特殊情况? 另外,它是哪个边界检查?
What is the special case with the foreach/for loop that eliminates bounds checking? Also which bounds checking is it?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
标准
循环允许 JIT 安全地删除数组边界检查(索引是否在 [0..length-1] 范围内)。
数组上的
foreach
循环相当于标准for
遍历数组。编辑:
正如罗伯特·杰普森指出的:
谢谢! 我自己也不知道。
The standard
loop is the one that allows the JIT to safely remove array bounds checks (whether the index is within [0..length-1])
The
foreach
loop over arrays is equivalent to that standardfor
loop over arrays.EDIT:
As Robert Jeppesen points out:
Thanks! Didn't know that myself.
SealedSun 是对的。 不要像 C++ 中那样进行优化。 JIT 非常聪明,可以为您做正确的事情。 您始终可以用不同的方式对循环进行编码,然后检查 IL 代码。
现在,如果按照 C++ 中的方式优化代码,您将得到以下结果:
顺便说一句 - 这与 foreach 语句相同:
不要尝试在没有数字的情况下优化代码。 正如您所看到的,如果您不妨碍 JIT,它将为您做很多事情。 在优化之前使用分析器。 总是。
SealedSun is right. Don't optimize the way you would in C++. JIT is quite smart to do the right thing for you. You can always code the loop in different ways and then inspect the IL code.
Now if optimize the code the way you would in C++ you get the following:
By the way - here is the same with foreach statement:
Don't try to optimize your code without numbers. As you can see JIT will do a lot for your if you don't stand in its way. Use profiler before you optimize. ALWAYS.
有关详细信息,请参阅:
http://codebetter.com /blogs/david.hayden/archive/2005/02/27/56104.aspx
基本上,如果你有一个 for 循环,并且你显式引用 IList.Count 或 Array.Length,JIT 会捕捉到这一点,并跳过边界检查。 它比预先计算列表长度更快。
我相信,列表或数组上的 foreach 会在内部执行相同的操作。
See this for details:
http://codebetter.com/blogs/david.hayden/archive/2005/02/27/56104.aspx
Basically, if you have a for loop, and you explicitly refer to IList.Count or Array.Length, the JIT will catch that, and skip the bounds checking. It makes it faster than precomputing the list length.
foreach on a list or array will do the same thing internally, I believe.
foreach 循环使用枚举器,它是处理循环的类或结构。 枚举器有一个
Current
属性,用于返回集合中的当前项。 这消除了使用索引来访问集合中的项目,因此不需要获取项目的额外步骤,包括边界检查。A foreach loop uses an enumerator, which is a class or structure that handles the looping. The enumerator has a
Current
property that returns the current item from the collection. That elliminates the use of an index to access the item in the collection, so the extra step to get the item, including bounds checking, is not needed.什么? 我不确定是否有可能消除 C# 中的边界检查。 如果您想要非托管代码,请使用:
例如 - 它不检查边界,并且会严重死掉。 :-)
What? I'm not sure if it is even possible to eliminate bounds checking in c#. If you want unmanaged code, then use:
for example - it doesn't check bounds, and dies terribly. :-)