在设置变量之前检查变量是否最佳?
Is it optimal to check a variable before setting it?
if(foo) bar |= foo;
是否比 bar |= foo;
更优化?
读取存储在变量中的数据是否比写入它更快(忽略特定于硬件的限制)所以在执行某些操作之前检查它实际上值得吗?
理论上:
这取决于您使用的处理器 运行(比较的速度与大量的位操作相比)。它还取决于 foo
为 0 的频率。如果永远不会,那么您将一无所获(实际上会减慢速度)
现实中:
除非您需要在压力过大的硬件(考虑实时嵌入式)上执行此操作 1 亿次,否则没有任何区别。
Is if(foo) bar |= foo;
more optimal than just bar |= foo;
?
不,很可能更糟。您添加的 if
在编译后的程序中创建了一个 branch,与单个无分支指令相比,这会降低性能。
在 if(foo) bar |= foo;
中,您 充其量 仅执行 1 或 2 条指令(取决于体系结构):比较和分支。最坏的 2 或 3 条指令(同样取决于架构):比较、分支和按位或。相反,在 bar |= foo
中,您总是只执行一条指令。当然,编译器可以对代码进行一定程度的优化,但是这里使用if
基本没用。当然,在某些体系结构中,比较指令的成本可能低于按位或的成本,但比较和条件分支的组合几乎肯定会超过单个按位或的成本。
Is reading data somehow faster than writing (ignoring hardware-specific conditions) so it is actually worth to check it before performing some specific operation on that variable?
问题不是真正的读取或写入数据(对于该单个操作,数据很可能位于 CPU 寄存器中),而是执行 2/3 条指令而不是 1 条指令,同时还执行分支。分支会进一步降低性能,因为在使用分支预测器的现代 CPU 中,它可以(为简单起见)导致 CPU 缓存被清除,因此需要再次重新读取代码。参见 Why is processing a sorted array faster than processing an unsorted array?
只有当评估 cond
加上分支的成本明显低于有条件执行的 statements;
的成本时,做类似 if (cond) { statements; }
的事情才有用。对于一个简单的数学指令,几乎从来没有这种情况。
if(foo) bar |= foo;
是否比 bar |= foo;
更优化?
读取存储在变量中的数据是否比写入它更快(忽略特定于硬件的限制)所以在执行某些操作之前检查它实际上值得吗?
理论上:
这取决于您使用的处理器 运行(比较的速度与大量的位操作相比)。它还取决于 foo
为 0 的频率。如果永远不会,那么您将一无所获(实际上会减慢速度)
现实中:
除非您需要在压力过大的硬件(考虑实时嵌入式)上执行此操作 1 亿次,否则没有任何区别。
Is
if(foo) bar |= foo;
more optimal than justbar |= foo;
?
不,很可能更糟。您添加的 if
在编译后的程序中创建了一个 branch,与单个无分支指令相比,这会降低性能。
在 if(foo) bar |= foo;
中,您 充其量 仅执行 1 或 2 条指令(取决于体系结构):比较和分支。最坏的 2 或 3 条指令(同样取决于架构):比较、分支和按位或。相反,在 bar |= foo
中,您总是只执行一条指令。当然,编译器可以对代码进行一定程度的优化,但是这里使用if
基本没用。当然,在某些体系结构中,比较指令的成本可能低于按位或的成本,但比较和条件分支的组合几乎肯定会超过单个按位或的成本。
Is reading data somehow faster than writing (ignoring hardware-specific conditions) so it is actually worth to check it before performing some specific operation on that variable?
问题不是真正的读取或写入数据(对于该单个操作,数据很可能位于 CPU 寄存器中),而是执行 2/3 条指令而不是 1 条指令,同时还执行分支。分支会进一步降低性能,因为在使用分支预测器的现代 CPU 中,它可以(为简单起见)导致 CPU 缓存被清除,因此需要再次重新读取代码。参见 Why is processing a sorted array faster than processing an unsorted array?
只有当评估 cond
加上分支的成本明显低于有条件执行的 statements;
的成本时,做类似 if (cond) { statements; }
的事情才有用。对于一个简单的数学指令,几乎从来没有这种情况。