在没有命中时,C ++中的try catch是否会影响性能

时间:2016-07-13 17:49:15

标签: c++ try-catch

我有代码,其中函数中有try catch并且函数被命中。 100次以上。代码每次都会提前返回,而不会实际触及try catch。这是否会影响Visual Studio的性能。我看到了性能影响。

我的代码是:

void foo(int a) {
 if (a > value) {
    return;
 }
 try {
    possibleErrorFunction();
 } catch {
 }
}

我把它改为:

void foo(int a) {
if (a > value) {
    return;
}
bar();
}

void bar() {
try {
    possibleErrorFunction();
} catch {
}
}

第二个代码似乎快了大约10秒。对此有任何可以解释的解释吗?

2 个答案:

答案 0 :(得分:1)

异常机制实现中使用了两个主要策略。一个是所谓的“基于帧”或“动态”,另一个是“基于表格”。其他方案是这两者的变体。您可以阅读有关他们的更多信息here

实质上,“基于帧”的动态实现确实在运行时在try块的每个条目上花费资源。如果不抛出异常但是它使用了更多的内存,那么“基于表”的机制不涉及任何额外的工作。

我不是100%肯定,但据我所知,微软编译器直到VS2008使用“基于帧”的方法,并从VS2010开始实现“基于表格”的方法。 (也许有一些编译器开关可以控制它 - 我不知道,因为我个人不希望在现有代码或第三方库强制之前不使用异常)。我想你可以在编译器文档中找到这些信息。

您还可以从c ++源代码生成汇编代码,以查看try块的内容

答案 1 :(得分:0)

所有上述评论似乎都趋向于有用的一两点。额外的设备总是会占用更多的CPU周期,从而贬低性能(我不相信这个编辑框被标记为“贬义”)。需要在许多实例上进行许多迭代。

相关问题