这个问题与在.NET中抛出异常的代价无关。在不久前的一些实验中,我看到了一个方法性能上的显著变化,如果它在某个执行路径中包含了一个抛出语句,而没有实际使用它。JIT是否以某种方式包装了任何可能在额外代码中抛出异常的方法?
发布于 2011-12-21 18:09:52
是的,有区别。x86和x64抖动优化器将永远不会内联具有抛出语句的方法。这种差异很难量化,因为额外的优化在内联之后是可能的,但通常每次调用只有几纳秒。
.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()方法本身是内联的,并且只有负值才会采用非最优的代码路径。
https://stackoverflow.com/questions/8593378
复制相似问题