没有任何东西被抛出时的异常效率

时间:2011-02-16 18:37:36

标签: c# .net exception performance

我有一个假设的问题,即在没有抛出异常的情况下使用异常处理的效率后果。

首先来看看这个C#:

int simpleSimon, cautiousCarol, dangerousDave;

try
{
    simpleSimon = int.Parse("fail");
}
catch
{
    simpleSimon = 1;
}

try
{
    cautiousCarol = int.Parse("1");
}
catch
{
    cautiousCarol = 1;
}

dangerousDave = int.Parse("1");

我相信戴夫的代码将是最快/最有效的;虽然西蒙会因为抛出异常而受到很大的惩罚。

但卡罗尔怎么样?因为她抛出没有例外她会受到处罚吗?如果是这样,那么什么样的,有多大? (性能损失或额外的内存使用情况还是其他什么?)

2 个答案:

答案 0 :(得分:8)

Carol没有重大惩罚。如果需要,只会注册并执行某些跳转。

作为提示,请使用int.TryParse(...)来避免这种情况。

答案 1 :(得分:6)

这是一个JIT实现细节。 x86抖动必须在堆栈帧中设置16个字节,以帮助CLR在抛出异常时找到正确的catch块。这应该需要大约3纳秒。对于x64抖动根本不起作用,异常过滤在64位版本的Windows上实现不同(基于表而不是基于堆栈)。所需的额外内存大致相当(代码与表数据)。

对于这样的代码,这一切都不重要,将字符串转换为整数是I / O操作。首先获取数据的成本比任何解析都要容易3或4个数量级。如果您不信任数据源,您当然会使用TryParse()。处理异常 非常昂贵。