HAVING的成本但不在.NET中的方法中抛出异常

时间:2011-12-21 16:51:51

标签: .net performance exception

这个问题不是关于在.NET中抛出异常的成本。在一段时间的实验中,我看到方法性能发生了重大变化,如果在其中一个执行路径中包含一个throw语句,而实际上并没有使用它。 JIT是否会以某种方式包装任何可能在某些额外代码中引发异常的方法?

1 个答案:

答案 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()方法本身内联,只有负值采用非最佳代码路径。