这个问题不是关于在.NET中抛出异常的成本。在一段时间的实验中,我看到方法性能发生了重大变化,如果在其中一个执行路径中包含一个throw语句,而实际上并没有使用它。 JIT是否会以某种方式包装任何可能在某些额外代码中引发异常的方法?
答案 0 :(得分:5)
是的,有区别。 x86和x64抖动优化器永远不会内联具有 throw 语句的方法。这种差异很难量化,因为内联后可以进行额外的优化,但每次调用通常需要几纳秒。
.NET框架代码中常用的优化策略是将抛出异常的语句放在辅助方法中,以便仍然内联公共代码路径。在Math.Abs()方法中可见,例如:
public static int Abs(int value)
{
if (value >= 0) return value;
return AbsHelper(value);
}
private static int AbsHelper(int value)
{
if (value == int.MaxValue) throw new OverflowException(...);
return -value;
}
这确保了Abs()方法本身内联,只有负值采用非最佳代码路径。