C语言 在设置变量之前检查变量是否最佳?



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亿次这样的操作(比如实时嵌入式),否则没有什么区别。

最新更新