请考虑以下两种情况:
if( error ==0 )
{
// DO success stuff
}
else
{
// DO error handling stuff
}而这个:
if( error != 0 )
{
// DO error handling stuff
}
else
{
// DO success stuff
}其中一个会执行另一个,因为我知道大多数时候我都会进入成功代码路径。
发布于 2014-04-10 22:44:48
与其担心这可能只是在最罕见的情况下才是性能问题,不如问问自己哪个更易读。对于错误检查,可以使用保护条款,这样可以避免过多的缩进/括号:
if( error != 0 )
{
// DO error handling stuff
return;
}
// DO success stuff如果您知道一条路径比另一条路径更有可能,并且您确信这确实对性能至关重要,则可以让编译器知道(例如GCC):
if( _builtin_expect (error == 0, 1) )
{
// DO success stuff
}
else
{
// DO error handling stuff
}当然,这会使代码更难读--如果真的需要的话只能使用它。
发布于 2014-04-10 22:56:37
那得看情况。
当代码只运行一次时,一开始使用更有可能的代码将在统计上更快--当且仅当分支预测的cpu实现不是多行之间的“共享计数器”(例如,每16条语句共享相同)。但是,大多数代码并不是这样运行的。它将运行多个,12,1万亿次(例如,在will循环中)。
多次运行
没有人会比别人表现得更好。其原因是分支预测。每次程序运行if语句时,cpu都会计数该语句为真的次数。这样,它现在可以高精度地预测下一次,如果代码再次运行。如果您要测试您的代码10亿次,您将看到,如果您的部分或其他部分被执行,它将是无关紧要的。CPU将为它认为最有可能发生的情况进行优化。
这是一个简化的解释,因为CPU分支预测是足够聪明的,当一些代码总是翻转:真、假、真、假、真、假甚至是真、真、假、假、真、真、假.
你可以在维基百科关于分支预测的文章上学到很多东西
发布于 2014-04-10 22:54:50
Gcc的默认行为是对if语句的真实情况进行优化。在此基础上,它将选择使用je或jne。
如果您知道并希望精确控制哪个调用路径更有可能,请使用下面的宏查找控件。
#define likely(x) __builtin_expect((x),1)
#define unlikely(x) __builtin_expect((x),0)https://stackoverflow.com/questions/23000342
复制相似问题