当 >= 是 运行 时,Java 是否隐式检查 > 和 ==?
Does Java implicitly check > and == when >= is run?
当我在代码中使用“>=”时,Java 会自动检查“==”和“>”吗?
我问这个问题的原因是因为在这样的 for 循环中:
for(int i = 0; i<N; i++){
if(a > b) //do something
else if(a == b) //do something different
}
这样做效率更高
for(int i = 0; i<N; i++){
if(a >= b){
if(a > b) //do something
else // do the thing you would do for a == b
}
}
if a>=b 不分别检查 a==b 和 a>b。
这是因为在第二个 for 循环中你检查条件 1 或 2 次,而对于第一个 for 循环你总是检查条件 2 次。
我知道时差可以忽略不计,但我只是好奇。
Java虚拟机has separate instructions if_icmpeq
(equal), if_icmpge
(greater or equal), and if_icmpgt
(greater than) for the two cases. Whether it will be more efficient in fact depends on the CPU architecture; the x86 does have a single JGE
(jump if greater or equal)指令。
正如前面的答案所示,这取决于系统架构,但一般来说,大于或等于的一般评估是用 "or" 分隔的两个条件。
即使我们假设比较不会分别执行这两个条件,您的推理仍然是错误的。
如果我们在现实中有 "a>b"
对于第一个循环,我们将比较 1 个条件“>”。
对于第二个循环,我们将比较 2 次,一次用于第一个 "non divisible >= " 条件,一次用于 ">"
所以这两个循环是等价的,最好根据你想要的可见性和你需要的实用性来选择。但是两者在平均比较上是一样的。
在最基本的层面上,比较只是一个减法,然后是对结果的测试。 CPU 在算术运算后设置标志:溢出和零与比较相关。如果结果为负,则设置溢出 (ov),如果操作数相等,则设置零 (z)。因此 1 < 2
将转换为 (1 - 2)
,从而导致 ov:1 和 z:0。
可以在单个操作中测试所需的标志值组合:
- 小于:ov:1 和 z:0
- 小于或等于:ov:1 或 z:1
- 等于:z:1
- 大于或等于:ov:0 或 z:1
- 更大:ov:0 和 z:0
因此,通过良好的 JVM 实现,您会发现 >
和 >=
之间没有可检测到的性能差异
当我在代码中使用“>=”时,Java 会自动检查“==”和“>”吗?
我问这个问题的原因是因为在这样的 for 循环中:
for(int i = 0; i<N; i++){
if(a > b) //do something
else if(a == b) //do something different
}
这样做效率更高
for(int i = 0; i<N; i++){
if(a >= b){
if(a > b) //do something
else // do the thing you would do for a == b
}
}
if a>=b 不分别检查 a==b 和 a>b。
这是因为在第二个 for 循环中你检查条件 1 或 2 次,而对于第一个 for 循环你总是检查条件 2 次。
我知道时差可以忽略不计,但我只是好奇。
Java虚拟机has separate instructions if_icmpeq
(equal), if_icmpge
(greater or equal), and if_icmpgt
(greater than) for the two cases. Whether it will be more efficient in fact depends on the CPU architecture; the x86 does have a single JGE
(jump if greater or equal)指令。
正如前面的答案所示,这取决于系统架构,但一般来说,大于或等于的一般评估是用 "or" 分隔的两个条件。
即使我们假设比较不会分别执行这两个条件,您的推理仍然是错误的。
如果我们在现实中有 "a>b"
对于第一个循环,我们将比较 1 个条件“>”。
对于第二个循环,我们将比较 2 次,一次用于第一个 "non divisible >= " 条件,一次用于 ">"
所以这两个循环是等价的,最好根据你想要的可见性和你需要的实用性来选择。但是两者在平均比较上是一样的。
在最基本的层面上,比较只是一个减法,然后是对结果的测试。 CPU 在算术运算后设置标志:溢出和零与比较相关。如果结果为负,则设置溢出 (ov),如果操作数相等,则设置零 (z)。因此 1 < 2
将转换为 (1 - 2)
,从而导致 ov:1 和 z:0。
可以在单个操作中测试所需的标志值组合:
- 小于:ov:1 和 z:0
- 小于或等于:ov:1 或 z:1
- 等于:z:1
- 大于或等于:ov:0 或 z:1
- 更大:ov:0 和 z:0
因此,通过良好的 JVM 实现,您会发现 >
和 >=