请考虑以下 java 源代码:
package com.stackoverflow;
公共(public)类 CondSpeed {
私有(private)静态最终长 COUNT = 1000000000;
私有(private)静态最终长OUTER_COUNT = 15;
私有(private)静态长 notEqOperator = 0L;
私有(private)静态长notOperator = 0L;
私有(private)静态长等于False = 0L;
公共(public)CondSpeed(){
极好的();
}
公共(public)静态无效主(字符串[] args){
for(int outCount = 0;outCount < OUTER_COUNT;outCount++){
notEqOperator += testNotEaualsOperator();
equalsFalse += testEqualFalse();
notOperator += testNotOperator();
}
长avrForNotEqOperator = (notEqOperator/OUTER_COUNT);
长 avrForEqualsFalse = (equalsFalse/OUTER_COUNT);
长avrForNotOperator = (notOperator/OUTER_COUNT);
System.out.println("不等于运算符的 Avr: "+avrForNotEqOperator);
System.out.println("Avr 等于\"false\"运算符: "+avrForEqualsFalse);
System.out.println("Not 运算符的 Avr: "+avrForNotOperator);
}
私有(private)静态长 testEqualFalse(){
现在很长= System.currentTimeMillis();
for(long i = 0;i < COUNT;i++){
boolean 值 truFalse = returnTrueOrFalse();
如果(真假==假){
//没做什么...
}
}
return (System.currentTimeMillis() - 现在);
}
私有(private)静态长 testNotOperator(){
现在很长= System.currentTimeMillis();
for(long i = 0;i < COUNT;i++){
boolean 值 truFalse = returnTrueOrFalse();
如果(!trueFalse){
//没做什么...
}
}
return (System.currentTimeMillis() - 现在);
}
私有(private)静态长 testNotEaualsOperator(){
现在很长= System.currentTimeMillis();
for(long i = 0;i < COUNT;i++){
boolean 值 truFalse = returnTrueOrFalse();
如果(真假!=真){
//没做什么...
}
}
return (System.currentTimeMillis() - 现在);
}
私有(private)静态 boolean 值 isFalse;
私有(private)静态 boolean returnTrueOrFalse(){
如果(是假){
是假=假;
}
别的{
是假=真;
}
返回值为False;
}
}
正如您所看到的,这是针对 3 个版本的 if(false) 条件的测试。
- 我感兴趣的是为什么不同条件语句中的结果首先不同。 ((我知道这显然是编译器将 .java 解释为字节码的方式。))还有比这更多的吗?
- 其次。查看不同 Hotspot VM 的差异。见底部。这是因为虚拟机在各个版本上的更新/改进吗?或者还有更多的事情吗?
- 这是测试此类内容的最佳方法吗?
---结果 Mac OS X---
JavaVM HotSpot 1.6.0
不等于运算符的 Avr:1937
Avr 等于“false”运算符:1937
非运算符 Avr:1941
JavaVM HotSpot 1.5.0
不等于运算符的 Avr:5023
等于“false”运算符的 Avr:5035
非运算符的 Avr:5067
JavaVM HotSpot 1.4.2
不等于运算符的 Avr:3993
Avr 等于“false”运算符:4015
非运算符的 Avr:4009
JavaVM HotSpot 1.4.0
不等于运算符的 Avr:3961
等于“false”运算符的 Avr:3960
非运算符的 Avr:3961
谢谢。
最佳答案
!、!= 和 == 之间的差异看起来像随机噪声 - 您真的希望它们达到完全相同的毫秒数吗?
然而,JVM 版本的改进几乎肯定是真实的,尽管它可能非常特定于特定的代码段,即某些落在需要正确处理的复杂性阈值内的问题。即使稍有不同也可能不会显示相同的结果。
为了改进测试,请计算 standard deviation每个测试运行的结果,看看它们是否有统计上的差异(或者只是打印出所有 10 个结果并观察它们)。
关于Java 条件运算符速度与 Hotspot VM 版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1382930/