当前CPU的代价是什么:算术运算还是条件运算?

时间:2013-02-09 15:47:53

标签: performance cpu conditional-statements arithmetic-expressions

20-30年前,像分区这样的算术运算是CPU成本最高的运算之一。将一个分区保存在一段重复调用的代码中是一个显着的性能提升。但是今天CPU具有快速算术运算,并且由于它们大量使用instruction pipelining,因此条件可能会中断高效执行。如果我想优化代码以提高速度,我是否应该选择算术运算来支持条件?

示例1

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

int c = a + b;
result = (c >= n) ? (c - n) : c;

result = (a + b) % n;

示例2

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

int32_t x = ...;
result = (x & 0x800000) ? (x | 0xff000000) : x;

result = (x << 8) >> 8;

3 个答案:

答案 0 :(得分:2)

如果您想优化速度,您应该告诉编译器优化速度。现代编译器通常在这方面优于你。

由于这个原因,我有时会惊讶地试图将汇编代码与原始资源联系起来。

优化可读性的源代码,让编译器尽其所能。

答案 1 :(得分:2)

我希望在示例#1中,第一个会表现得更好。编译器可能会应用一些比特错误的技巧来避免分支。但是你正在利用知识,编译器推断它的可能性极小:即总和总是在[0:2*n-2]范围内,所以一次减法就足够了。

例如#2,第二种方式在现代CPU上更快,更容易遵循。任何一个版本都应该有明智的评论。 (看到编译器将第一个版本转换为第二个版本,我不会感到惊讶。)

答案 2 :(得分:1)

编译器和构建硬件的人的作者已经挑选了所有低调的水果。如果您是那种需要提出此类问题的人,您不太可能手动优化任何事情。

虽然20年前有一个相对称职的程序员可以通过下降到集会来进行一些优化,但现在它是专家领域,专门研究目标架构;此外,优化不仅需要了解程序,还需要知道它将处理的数据。一切都归结为启发式,不同条件下的测试等。

简单的表现问题不再有简单的答案。