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

Buh*_*ica 10 .net c# performance exception

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

首先来看看这个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");
Run Code Online (Sandbox Code Playgroud)

我相信Dave的代码将是最快/最有效的; 虽然西蒙会因为抛出异常而受到巨额罚款.

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

Dan*_*ite 8

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

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


Han*_*ant 6

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

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