【发布时间】:2010-12-18 18:40:09
【问题描述】:
我问了一个关于exceptions 的问题,我对有人说投掷速度很慢感到非常恼火。我过去问过How exceptions work behind the scenes,我知道在正常的代码路径中没有额外的指令(正如公认的答案所说),但我并不完全相信投掷比检查返回值更昂贵。考虑以下几点:
{
int ret = func();
if (ret == 1)
return;
if (ret == 2)
return;
doSomething();
}
对
{
try{
func();
doSomething();
}
catch (SpecificException1 e)
{
}
catch (SpecificException2 e)
{
}
}
据我所知,除了 ifs 被移出正常代码路径进入异常路径和额外的一两次跳转到异常代码路径之外,没有什么区别。当它减少你的主要和更经常运行的代码路径中的几个ifs 时,额外的一两次跳转听起来并不多。那么异常真的很慢吗?或者这是一个神话或旧编译器的旧问题?
(我说的是一般性的异常。具体来说,是 C++ 和 D 等编译语言中的异常;尽管 C# 也在我的脑海中。)
【问题讨论】:
-
我不愿意将此作为答案发布,但它可能不是额外的跳跃,但我敢打赌与捕获当前正在执行的堆栈帧有关,这会导致速度变慢。你用过“new System.Diagnostics.StackTrace()”吗?很慢。
-
Juliet:糟糕的是,有人添加了 C# 标签并破坏了人们认为我在问的问题。但我认为你的权利。但这就是 C# 的情况,希望更多的人会阅读这个关于 C++ 的问答
-
@Juliet - 您无需捕获堆栈跟踪即可展开异常堆栈。此外,StackTrace() 中的大部分时间都是符号查找。
-
问题不在于构建它所需的对象创建时间和反射吗?测试一个简单的值肯定比测试一个(可能)大的异常对象更好吗?使用异常而不是简单的 if 语句对我来说很糟糕。 +1 提出问题,而不仅仅是接受教条:)
标签: language-agnostic exception exception-handling