加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 07:16:54 所属栏目:百科 来源:网络整理
导读:我有代码,其中函数中有try catch,函数被命中. 100次.代码每次都会提前返回,而不会实际触及try catch.这是否会影响Visual Studio的性能.我看到了性能影响. 我的代码是: void foo(int a) { if (a value) { return; } try { possibleErrorFunction(); } 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秒.对此有任何可以解释的解释吗?

解决方法

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

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

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

您还可以从c源生成汇编代码,以查看try块的运行情况

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读