当前 CPU 上哪个成本更高:算术运算还是条件?

Pet*_*lák 5 cpu performance arithmetic-expressions conditional-statements

20 到 30 年前,除法等算术运算是 CPU 成本最高的运算之一。在一段重复调用的代码中节省一个除法是显着的性能提升。但是今天的 CPU 具有快速的算术运算,并且由于它们大量使用指令流水线,条件可能会破坏高效执行。如果我想优化代码以提高速度,我应该更喜欢算术运算而不是条件运算吗?

示例 1

假设我们要实现模运算n。什么会表现得更好:

int c = a + b;
result = (c >= n) ? (c - n) : c;
Run Code Online (Sandbox Code Playgroud)

或者

result = (a + b) % n;
Run Code Online (Sandbox Code Playgroud)

?

示例 2

假设我们正在将 24 位有符号数转换为 32 位。什么会表现得更好:

int32_t x = ...;
result = (x & 0x800000) ? (x | 0xff000000) : x;
Run Code Online (Sandbox Code Playgroud)

或者

result = (x << 8) >> 8;
Run Code Online (Sandbox Code Playgroud)

?

fdr*_*ger 3

所有容易实现的目标都已经被编译器的作者和硬件构建者采摘和腌制了。如果你是那种需要问这样的问题的人,你不太可能能够手动优化任何东西。

虽然 20 年前,相对有能力的程序员可以通过汇编来进行一些优化,但现在它是专家的领域,专门研究目标体系结构;此外,优化不仅需要了解程序,还需要了解它将处理的数据。一切都归结为启发法、不同条件下的测试等。

简单的性能问题不再有简单的答案。

  • 仅适用于非常低级的事情。用较低复杂度替换算法仍然是一种非常理想的优化,而编译器还无法为您做到这一点。有条件有效的优化是程序员必须参与的另一个棘手问题,无论是手动优化还是手动标记前提条件。 (2认同)
  • @BenVoigt:是的,你是对的,但是 - 根据问题 - 这些观点是无关紧要的。问题的答案是:“不可能告诉,不知道确切的CPU,结果将如何在代码、编译器、月相等中使用”。即使是最简单的提升也可以改变结果。 (2认同)