没有抛出异常时的异常效率

10

我有一个关于在没有抛出异常的情况下使用异常处理的效率影响的假设性问题。

首先看一下这个 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");

我相信 Dave 的代码将是最快/最有效的;而 Simon 抛出异常会导致很大的惩罚。

但 Carol 呢?既然她不会抛出异常,那么她会受到惩罚吗?如果是,那么是什么样的惩罚以及有多大?(性能惩罚、额外内存使用或其他任何东西?)


1
可能是 C# 中 'try' 的性能成本 的重复问题。 - R. Martinho Fernandes
2个回答

8

对于 Carol 没有明显的惩罚。只有在需要时才会记录和执行特定的跳转。

提示:使用 int.TryParse(...) 可以避免这种情况。


6
这是JIT实现的细节。x86 JIT必须在堆栈帧中设置16字节以帮助CLR在异常被抛出时找到正确的catch块。这应该只需要大约3纳秒时间,对于x64 JIT来说没有任何工作量,64位版本的Windows上实现异常过滤的方式不同(基于表而不是基于堆栈)。所需的额外内存大约相当(代码与表数据)。
像这样的代码不应该有任何影响,将字符串转换为整数是一个I/O操作。首先获取数据的成本比任何解析操作都要高3到4个数量级。如果您不信任数据源,则当然会使用TryParse()。处理异常是非常昂贵的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接