if (a < 901)
比 if (a <= 900)
--- 快吗?
与这个简单的示例不完全一样,但循环复杂代码的性能略有变化。我想这必须与生成的机器代码有关,以防万一。
原文由 Vinícius 发布,翻译遵循 CC BY-SA 4.0 许可协议
if (a < 901)
比 if (a <= 900)
--- 快吗?
与这个简单的示例不完全一样,但循环复杂代码的性能略有变化。我想这必须与生成的机器代码有关,以防万一。
原文由 Vinícius 发布,翻译遵循 CC BY-SA 4.0 许可协议
在 C 和 C++ 中,编译器的一个重要规则是“as-if”规则:如果执行 X 与执行 Y 具有完全相同的行为,那么编译器可以自由选择它使用哪一个。
在您的情况下,“a < 901”和“a <= 900”始终具有相同的结果,因此编译器可以自由编译任一版本。如果某个版本更快,无论出于何种原因,任何高质量的编译器都会为更快的版本生成代码。因此,除非您的编译器生成异常糟糕的代码,否则两个版本将以相同的速度运行。
现在,如果您遇到两种代码总是会产生相同结果的情况,但是很难为编译器证明,和/或编译器很难证明哪个版本更快,那么您可能会得到不同的代码以不同的速度运行。
PS 如果处理器支持单字节常量(更快)和多字节常量(更慢),原始示例可能以不同的速度运行,因此与 255(1 个字节)进行比较可能比与 256(2 个字节)进行比较更快。我希望编译器能做任何更快的事情。
原文由 gnasher729 发布,翻译遵循 CC BY-SA 4.0 许可协议
3 回答2k 阅读✓ 已解决
2 回答3.9k 阅读✓ 已解决
2 回答3.2k 阅读✓ 已解决
1 回答3.2k 阅读✓ 已解决
1 回答2.7k 阅读✓ 已解决
3 回答3.4k 阅读
1 回答1.6k 阅读✓ 已解决
不,在大多数架构上它不会更快。您没有指定,但在 x86 上,所有积分比较通常都将在两条机器指令中实现:
test
或cmp
指令,设置EFLAGS
Jcc
(jump) 指令,具体取决于比较类型(和代码布局):jne
- 如果不相等则跳转 –>ZF = 0
jz
- 如果为零(等于)则跳转 –>ZF = 1
jg
- 如果大于则跳转 –>ZF = 0 and SF = OF
示例(为简洁而编辑)使用
$ gcc -m32 -S -masm=intel test.c
编译编译为:
和
编译为:
所以两者之间的唯一区别是
jg
与jge
指令。两者将花费相同的时间。我想解决没有任何迹象表明不同的跳转指令需要相同的时间的评论。这个回答有点棘手,但我可以给出以下内容:在 Intel Instruction Set Reference 中,它们都被归类在一个通用指令下,
Jcc
(如果满足条件则跳转)。在 优化参考手册 的附录 C. 延迟和吞吐量中进行了相同的分组。Jcc
的值为:在
Jcc
上有以下脚注:因此,英特尔文档中的任何内容都没有将
Jcc
指令与其他指令区别对待。如果考虑用于实现指令的实际电路,可以假设在
EFLAGS
的不同位上会有简单的 AND/OR 门,以确定是否满足条件。因此,一条指令测试两位的时间没有理由比一条只测试一位的指令花费更多或更少的时间(忽略门传播延迟,它远小于时钟周期。)编辑:浮点
这也适用于 x87 浮点数:(与上面的代码几乎相同,但使用
double
而不是int
。)