【发布时间】:2011-01-03 23:58:15
【问题描述】:
正如我们都知道和喜爱的那样,每次整数溢出时,.NET 都会引发 IntegerOverflow 异常。我认为这是一件非常好的事情。
但我想知道他们是如何做到这么快的。 x86 不会捕获整数溢出,如果其他架构允许这样做,我会感到惊讶。我为 x86 找到的最佳解决方案是在每个算术运算之后放置一条“INTO”指令。但我认为这会导致明显的放缓。
如果可以证明操作不会溢出,他们可以在编译器中进行一些静态检查以避免这种情况。但是当编译器无法确定操作的结果时,性能关键的内部循环呢?
我尝试查看 Mono 源代码,但找不到他们进行这些检查的位置。
那么有没有人知道他们到底在做什么?我真的很想知道。
附带说明:有没有办法查看 .NET JITC 发出的 x86 代码?
【问题讨论】:
-
“每次整数溢出”:仅当使用 IL 指令的检查形式时,例如
add.ovf而不是add。使用未经检查的指令——这是 C# 至少默认生成的,除非你使用 checked 关键字——溢出只会以我们从 C 中“了解和喜爱”的方式滚动。 -
附注... NGEN 将生成本机图像机器码... msdn.microsoft.com/en-us/library/6t9t5wcf%28VS.80%29.aspx
-
这不是一个很大的惩罚。如果溢出异常很少见,处理器将开始快速正确预测这些分支,您几乎不会遇到任何减速(假设您担心循环中的性能)。
-
我想我听过一个演讲,演讲者说检查是 .NET 的默认设置。可能是我记错了。
-
是的。 .Net 也没有强制要求,这完全取决于语言(而不是 JIT)编译器。在 VB.Net 中是默认值,在 c# 中不是。