Yur*_*rik 2 .net performance exception
这个问题不是关于在.NET中抛出异常的成本.在一段时间的实验中,我看到方法性能发生了重大变化,如果它在一个执行路径中的某处包含一个throw语句,而实际上并没有使用它.JIT是否以某种方式包装任何可能在某些额外代码中抛出异常的方法?
是的,有区别.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;
}
Run Code Online (Sandbox Code Playgroud)
这确保了Abs()方法本身内联,只有负值采用非最佳代码路径.
| 归档时间: |
|
| 查看次数: |
114 次 |
| 最近记录: |