我有一个假设的问题,即在没有抛出异常的情况下使用异常处理的效率后果。
首先来看看这个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");
我相信戴夫的代码将是最快/最有效的;虽然西蒙会因为抛出异常而受到很大的惩罚。
但卡罗尔怎么样?因为她抛出没有例外她会受到处罚吗?如果是这样,那么什么样的,有多大? (性能损失或额外的内存使用情况还是其他什么?)
答案 0 :(得分:8)
Carol
没有重大惩罚。如果需要,只会注册并执行某些跳转。
作为提示,请使用int.TryParse(...)
来避免这种情况。
答案 1 :(得分:6)
这是一个JIT实现细节。 x86抖动必须在堆栈帧中设置16个字节,以帮助CLR在抛出异常时找到正确的catch块。这应该需要大约3纳秒。对于x64抖动根本不起作用,异常过滤在64位版本的Windows上实现不同(基于表而不是基于堆栈)。所需的额外内存大致相当(代码与表数据)。
对于这样的代码,这一切都不重要,将字符串转换为整数是I / O操作。首先获取数据的成本比任何解析都要容易3或4个数量级。如果您不信任数据源,您当然会使用TryParse()。处理异常 非常昂贵。