假设我们想要实现模n
的运算。什么会更好:
int c = a + b;
result = (c >= n) ? (c - n) : c;
或
result = (a + b) % n;
假设我们将24位有符号数转换为32位。什么会更好:
int32_t x = ...;
result = (x & 0x800000) ? (x | 0xff000000) : x;
或
result = (x << 8) >> 8;
答案 0 :(得分:2)
如果您想优化速度,您应该告诉编译器优化速度。现代编译器通常在这方面优于你。
由于这个原因,我有时会惊讶地试图将汇编代码与原始资源联系起来。
优化可读性的源代码,让编译器尽其所能。
答案 1 :(得分:2)
我希望在示例#1中,第一个会表现得更好。编译器可能会应用一些比特错误的技巧来避免分支。但是你正在利用知识,编译器推断它的可能性极小:即总和总是在[0:2*n-2]
范围内,所以一次减法就足够了。
例如#2,第二种方式在现代CPU上更快,更容易遵循。任何一个版本都应该有明智的评论。 (看到编译器将第一个版本转换为第二个版本,我不会感到惊讶。)
答案 2 :(得分:1)
编译器和构建硬件的人的作者已经挑选了所有低调的水果。如果您是那种需要提出此类问题的人,您不太可能手动优化任何事情。
虽然20年前有一个相对称职的程序员可以通过下降到集会来进行一些优化,但现在它是专家领域,专门研究目标架构;此外,优化不仅需要了解程序,还需要知道它将处理的数据。一切都归结为启发式,不同条件下的测试等。
简单的表现问题不再有简单的答案。