在与Microsoft员工进行代码审查期间,我们在try{}块中遇到了大量代码.她和IT代表建议这可能会影响代码的性能.事实上,他们建议大多数代码应该在try/catch块之外,并且只应该检查重要的部分.微软员工补充说,即将发布的白皮书警告不要使用不正确的try/catch块.
我环顾四周,发现它可以影响优化,但它似乎只适用于范围之间共享变量.
我不是在询问代码的可维护性,甚至不是在处理正确的异常(有问题的代码需要重新分解,毫无疑问).我也没有提到使用流量控制的异常,这在大多数情况下显然是错误的.这些都是重要的问题(有些更重要),但不是重点.
如果不抛出异常,try/catch块如何影响性能?
我问了一个关于异常的问题,我对那些说投掷很慢的人非常恼火.我过去问例外幕后是如何工作的,我知道在正常的代码路径有没有额外的指令(作为接受的答案说的),但我不完全相信投掷比较贵然后检查返回值.考虑以下:
{
int ret = func();
if (ret == 1)
return;
if (ret == 2)
return;
doSomething();
}
Run Code Online (Sandbox Code Playgroud)
VS
{
try{
func();
doSomething();
}
catch (SpecificException1 e)
{
}
catch (SpecificException2 e)
{
}
}
Run Code Online (Sandbox Code Playgroud)
据我所知,除了ifs从正常的代码路径移出到异常路径和额外的跳转或两个到达异常代码路径之外没有区别.额外的一两跳不会听起来像是if在你的主要代码路径中减少了几个s.那些异常实际上是慢的吗?或者这是旧编译器的神话还是旧问题?
(我在谈论一般的异常.具体来说,编译语言中的异常,如C++和D;虽然C#也在我的脑海中.)