首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在.NET中拥有但不抛出异常的成本

在.NET中拥有但不抛出异常的成本
EN

Stack Overflow用户
提问于 2011-12-21 16:51:50
回答 1查看 118关注 0票数 2

这个问题与在.NET中抛出异常的代价无关。在不久前的一些实验中,我看到了一个方法性能上的显著变化,如果它在某个执行路径中包含了一个抛出语句,而没有实际使用它。JIT是否以某种方式包装了任何可能在额外代码中抛出异常的方法?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-12-21 18:09:52

是的,有区别。x86和x64抖动优化器将永远不会内联具有抛出语句的方法。这种差异很难量化,因为额外的优化在内联之后是可能的,但通常每次调用只有几纳秒。

.NET框架代码中常用的一种优化策略是将抛出异常的语句放在帮助器方法中,以便公共代码路径仍然是内联的。例如,在Math.Abs()方法中可见:

代码语言:javascript
复制
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()方法本身是内联的,并且只有负值才会采用非最优的代码路径。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8593378

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档