我偶然发现两个等效增量语法之间存在奇怪的持续时间差异。
if(seed != state) ++i;
此符号每1048576次迭代测量2.25 ms
i += (seed != state);
和每1048576次迭代2.80 ms。
第二种符号不应该比第一种快一点吗? 值得一提的是,种子==状态很少发生(在2 ^ 32-1次中)。
感谢您的回答。
编辑: 我使用gcc C编译器测试了同样的东西,第一个比第二个稍快,但第二个与C ++编译器的速度相同。
答案 0 :(得分:3)
if
版本会产生条件分支指令。另一个只是将bool提升为int并添加它。
编辑:
我倾向于使用第一个,因为从技术上讲,标准要求转换 (int)true
才能产生1
;它只需要导致"不是零。"虽然在实践中,我从未见过bool
到int
的转化,但1
没有使用true
。
答案 1 :(得分:2)
您永远不知道编译器为优化代码所做的工作。分支预测实际上会使第一个更快。第二个取决于实际执行的比较,并且如果为真,则将结果添加到i
为1(这取决于您的CPU,但很可能)将引入一个"虚拟" 1载入寄存器。
答案 2 :(得分:0)
第一个可能因为分支预测而有条件地不执行添加。第二个是添加每个周期,因为没有跳过添加的选项可用。比较的结果将始终添加到i。
我认为你会发现第一个没有执行添加每个循环,但只是偶尔在分支预测失败时。
答案 3 :(得分:0)
使用if
语句,编译器可以将增量转换为有条件执行的语句(至少对于支持有条件执行语句的处理器)。
第二个例子总是执行1或0的加法。
这是微优化,实际上取决于处理器及其支持系统(缓存,分支预测等)。例如,第二个例子可能更快,因为没有决策跳转。第一个示例在具有分支预测的处理器上可能更快。在可以将代码片段放入指令缓存的处理器中,两者之间的差异可以忽略不计(并且不需要获取其他指令)。
我很惊讶代码执行是以毫秒为单位的。对于这些示例,大多数现代处理器应该以纳秒为单位执行。