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的代码将是最快/最有效的; 虽然西蒙会因为抛出异常而受到巨额罚款.
但卡罗尔怎么样?因为她抛出没有例外她会受到处罚吗?如果是这样,那么什么样的,有多大?(性能损失或额外的内存使用或其他什么?)
这是一个JIT实现细节.x86抖动必须在堆栈帧中设置16个字节,以帮助CLR在抛出异常时找到正确的catch块.这应该需要大约3纳秒.对于x64抖动根本不起作用,异常过滤在64位版本的Windows上实现不同(基于表而不是基于堆栈).所需的额外内存大致相当(代码与表数据).
对于像这样的代码,这一切都不重要,将字符串转换为整数是I/O操作.首先获取数据的成本比任何解析都要容易3或4个数量级.如果您不信任数据源,您当然会使用TryParse().处理的例外是相当昂贵的.