首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++优化if性能

C++优化if性能
EN

Stack Overflow用户
提问于 2014-04-10 22:37:30
回答 6查看 629关注 0票数 4

请考虑以下两种情况:

代码语言:javascript
复制
if( error ==0 )
{
    // DO success stuff
}
else
{
    // DO error handling stuff
}

而这个:

代码语言:javascript
复制
if( error != 0 )
{
    // DO error handling stuff
}
else
{
    // DO success stuff
}

其中一个会执行另一个,因为我知道大多数时候我都会进入成功代码路径。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2014-04-10 22:44:48

与其担心这可能只是在最罕见的情况下才是性能问题,不如问问自己哪个更易读。对于错误检查,可以使用保护条款,这样可以避免过多的缩进/括号:

代码语言:javascript
复制
if( error != 0 )
{
    // DO error handling stuff
    return;
}

// DO success stuff

如果您知道一条路径比另一条路径更有可能,并且您确信这确实对性能至关重要,则可以让编译器知道(例如GCC):

代码语言:javascript
复制
if( _builtin_expect (error == 0, 1) )
{
    // DO success stuff
}
else
{
    // DO error handling stuff
}

当然,这会使代码更难读--如果真的需要的话只能使用它。

票数 3
EN

Stack Overflow用户

发布于 2014-04-10 22:56:37

那得看情况。

当代码只运行一次时,一开始使用更有可能的代码将在统计上更快--当且仅当分支预测的cpu实现不是多行之间的“共享计数器”(例如,每16条语句共享相同)。但是,大多数代码并不是这样运行的。它将运行多个,12,1万亿次(例如,在will循环中)。

多次运行

没有人会比别人表现得更好。其原因是分支预测。每次程序运行if语句时,cpu都会计数该语句为真的次数。这样,它现在可以高精度地预测下一次,如果代码再次运行。如果您要测试您的代码10亿次,您将看到,如果您的部分或其他部分被执行,它将是无关紧要的。CPU将为它认为最有可能发生的情况进行优化。

这是一个简化的解释,因为CPU分支预测是足够聪明的,当一些代码总是翻转:真、假、真、假、真、假甚至是真、真、假、假、真、真、假.

你可以在维基百科关于分支预测的文章上学到很多东西

票数 2
EN

Stack Overflow用户

发布于 2014-04-10 22:54:50

Gcc的默认行为是对if语句的真实情况进行优化。在此基础上,它将选择使用jejne

如果您知道并希望精确控制哪个调用路径更有可能,请使用下面的宏查找控件。

代码语言:javascript
复制
#define likely(x)       __builtin_expect((x),1)
#define unlikely(x)     __builtin_expect((x),0)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23000342

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档