我有代码,其中函数中有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秒。对此有任何可以解释的解释吗?
答案 0 :(得分:1)
异常机制实现中使用了两个主要策略。一个是所谓的“基于帧”或“动态”,另一个是“基于表格”。其他方案是这两者的变体。您可以阅读有关他们的更多信息here
实质上,“基于帧”的动态实现确实在运行时在try
块的每个条目上花费资源。如果不抛出异常但是它使用了更多的内存,那么“基于表”的机制不涉及任何额外的工作。
我不是100%肯定,但据我所知,微软编译器直到VS2008使用“基于帧”的方法,并从VS2010开始实现“基于表格”的方法。 (也许有一些编译器开关可以控制它 - 我不知道,因为我个人不希望在现有代码或第三方库强制之前不使用异常)。我想你可以在编译器文档中找到这些信息。
您还可以从c ++源代码生成汇编代码,以查看try
块的内容
答案 1 :(得分:0)
所有上述评论似乎都趋向于有用的一两点。额外的设备总是会占用更多的CPU周期,从而贬低性能(我不相信这个编辑框被标记为“贬义”)。需要在许多实例上进行许多迭代。