if(foo) bar |= foo;
是否比bar |= foo;
更优?
读取存储在变量中的数据是否比写入它(忽略特定硬件的限制)更快,因此在执行某些操作之前实际上值得检查它?
if(foo) bar |= foo;
是否比bar |= foo;
更优?
不,很可能更糟。您添加的if
在编译后的程序中创建了一个分支,与单个无分支指令相比,它会降低性能。
在if(foo) bar |= foo;
中,您最多只执行1或2个指令(取决于体系结构):比较和分支。最坏的情况是2或3条指令(同样取决于体系结构):比较、分支和位或。相反,在bar |= foo
中,您总是只执行一条指令。当然,编译器可以在一定程度上优化代码,但是在这里使用if
基本上是无用的。当然,在某些体系结构中,比较指令的成本可能低于按位或的成本,但比较和条件分支的组合几乎肯定会比单个按位或的成本要高。
读取数据是否比写入数据更快(忽略特定硬件条件),因此在对该变量执行某些特定操作之前实际上值得检查一下?
问题不是真正的读取或写入数据(无论如何,这很可能是在CPU寄存器中对于单个操作),而是执行2/3指令而不是1,同时也分支。分支进一步降低了性能,因为在使用分支预测器的现代CPU中,它可能(简单地说)导致CPU缓存被清除,因此需要第二次重新读取代码。参见为什么处理一个已排序的数组比处理一个未排序的数组快?
执行if (cond) { statements; }
这样的操作只有在计算cond
加上分支的成本明显低于有条件执行statements;
的成本时才有用。对于一个简单的数学指令,这几乎从来不会发生。
理论上:
这取决于你正在运行的处理器(比较有多快vs位操作有多大)。它还取决于foo
为0的频率。如果没有,那么你什么也得不到(实际上会减慢速度)
在现实:
除非你需要在压力大的硬件上执行1亿次这样的操作(比如实时嵌入式),否则没有什么区别。