C ++ - 使用和不使用if语句的奇怪时间测量

时间:2015-02-10 22:37:45

标签: c++ if-statement increment performance-testing

我偶然发现两个等效增量语法之间存在奇怪的持续时间差异。

if(seed != state) ++i;

此符号每1048576次迭代测量2.25 ms

i += (seed != state);

和每1048576次迭代2.80 ms。

第二种符号不应该比第一种快一点吗? 值得一提的是,种子==状态很少发生(在2 ^ 32-1次中)。

感谢您的回答。

编辑: 我使用gcc C编译器测试了同样的东西,第一个比第二个稍快,但第二个与C ++编译器的速度相同。

4 个答案:

答案 0 :(得分:3)

if版本会产生条件分支指令。另一个只是将bool提升为int并添加它。

编辑:

我倾向于使用第一个,因为从技术上讲,标准要求转换(int)true才能产生1;它只需要导致"不是零。"虽然在实践中,我从未见过boolint的转化,但1没有使用true

答案 1 :(得分:2)

您永远不知道编译器为优化代码所做的工作。分支预测实际上会使第一个更快。第二个取决于实际执行的比较,并且如果为真,则将结果添加到i为1(这取决于您的CPU,但很可能)将引入一个"虚拟" 1载入寄存器。

答案 2 :(得分:0)

第一个可能因为分支预测而有条件地不执行添加。第二个是添加每个周期,因为没有跳过添加的选项可用。比较的结果将始终添加到i。

我认为你会发现第一个没有执行添加每个循环,但只是偶尔在分支预测失败时。

答案 3 :(得分:0)

使用if语句,编译器可以将增量转换为有条件执行的语句(至少对于支持有条件执行语句的处理器)。

第二个例子总是执行1或0的加法。

这是微优化,实际上取决于处理器及其支持系统(缓存,分支预测等)。例如,第二个例子可能更快,因为没有决策跳转。第一个示例在具有分支预测的处理器上可能更快。在可以将代码片段放入指令缓存的处理器中,两者之间的差异可以忽略不计(并且不需要获取其他指令)。

我很惊讶代码执行是以毫秒为单位的。对于这些示例,大多数现代处理器应该以纳秒为单位执行。