Java 条件运算符速度与 Hotspot VM 版本

标签 java performance jvm jvm-hotspot

请考虑以下 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/

相关文章:

python - 偶数异或子数组的数量

java - 内在函数和内联对 Lambda 性能的影响?

java - 通过 JVM 参数设置 log4j 属性文件 - 为什么顺序很重要?

java - 有符号整数类型的签名存储在哪里? ( java 语)

java - java中动态定义集合或对象类型变量

java - 如何在 Eclipse 中使用外部 .class 文件?

java - 需要 int 但有问题并发现零字节

java - Spring 3 bean 未正确连接

python - 我将如何改善/使其运行更快?

javascript - Web 浏览器中触发事件的最大速率是多少?