我想知道两者之间是否存在性能差异
检查值是否大于/小于另一个值
for(int x = 0; x < y; x++); // for y > x
和
检查某个值是否与另一个值不相等
for(int x = 0; x != y; x++); // for y > x
为什么?
另外:如果我与零相比,会有什么进一步的区别?
如果答案还考虑了代码上的分组视图,那将是很好的。
编辑:正如大多数人所指出的那样,性能上的差异当然可以忽略不计,但我对cpu级别的差异感兴趣。哪个操作比较复杂?
对我来说,学习/理解这项技术更具问题。
我删除了Java
标签,我偶然添加了,因为这个问题通常不仅仅基于Java,对不起。
你仍然应该做更清晰,更安全和更容易理解的事情。这些微调讨论通常是浪费你的时间,因为
注意:生成的机器也可以随处理器或JVM一起更改,因此在大多数情况下,即使您非常熟悉汇编代码,查看这个也不是很有用。
更重要的是软件的可维护性。
性能绝对可以忽略不计。这里有一些代码来证明它:
public class OpporatorPerformance {
static long y = 300000000L;
public static void main(String[] args) {
System.out.println("Test One: " + testOne());
System.out.println("Test Two: " + testTwo());
System.out.println("Test One: " + testOne());
System.out.println("Test Two: " + testTwo());
System.out.println("Test One: " + testOne());
System.out.println("Test Two: " + testTwo());
System.out.println("Test One: " + testOne());
System.out.println("Test Two: " + testTwo());
}
public static long testOne() {
Date newDate = new Date();
int z = 0;
for(int x = 0; x < y; x++){ // for y > x
z = x;
}
return new Date().getTime() - newDate.getTime();
}
public static long testTwo() {
Date newDate = new Date();
int z = 0;
for(int x = 0; x != y; x++){ // for y > x
z = x;
}
return new Date().getTime() - newDate.getTime();
}
}
结果:
Test One: 342
Test Two: 332
Test One: 340
Test Two: 340
Test One: 415
Test Two: 325
Test One: 393
Test Two: 329
很少有性能损失,但第一个更可靠,因为它将处理两个特殊情况
其他人似乎从测量的角度回答,但是从机器级别你会对算术逻辑单元(ALU)感兴趣,它在“普通计算机”上处理肮脏的位。 How does less than and greater than work on a logical level in binary?似乎有一个非常好的细节,以获取完整的细节。
从纯粹的逻辑层面来看,简单的答案是,更容易判断某些东西是否不是告诉某些东西是否与某些东西相关,但这可能已在您的标准个人计算机或服务器中进行了优化,因此您将会只能看到小型个人构建中的实际收益,例如无人机或其他微技术的车载计算机。
现在6年后,在收到这个问题的偶然通知后,我想补充一些我在计算机科学研究中获得的见解。
将上述陈述放入一个小程序并编译它......
public class Comp {
public static void main(String[] args) {
int y = 42;
for(int x = 0; x < y; x++) {
// stop if x >= y
}
for(int x = 0; x != y; x++) {
// stop if x == y
}
}
}
...我们得到以下字节码:
public static void main(java.lang.String[]);
Code:
// y = 42
0: bipush 42
2: istore_1
// first for-loop
3: iconst_0
4: istore_2
5: iload_2
6: iload_1
7: if_icmpge 16 // jump out of loop if x => y
10: iinc 2, 1
13: goto 5
// second for-loop
16: iconst_0
17: istore_2
18: iload_2
19: iload_1
20: if_icmpeq 29 // jump out of loop if x == y
23: iinc 2, 1
26: goto 18
29: return
我们可以看到,在字节码级别上,两者都以相同的方式处理,并使用单个字节码指令进行比较。
如前所述,字节码如何转换为汇编程序/机器代码取决于JVM。但通常这种条件跳转可以转换为一些汇编代码,如下所示:
; condition of first loop
CMP eax, ebx
JGE label ; jump if eax > ebx
; condition of second loop
CMP eax, ebx
JE label ; jump if eax == ebx
在硬件级别上,JGE和JE具有相同的复杂性。
总而言之:关于性能,x < y
和x != y
理论上在硬件级别上都是相同的,并且一个本身不比另一个更快或更慢。
想知道如果嵌套每个测试,结果相同吗?
for(int x = 0; x < y; x++)
{
for(int x2 = 0; x2 < y; x2++) {}
}
for(int x = 0; x != y; x++)
{
for(int x2 = 0; x2 != y; x2++) {}
}