在我的树莓派上,我进行了一些性能测试,如CaffeineMark和SciMark,使用两种不同的JVM。尽管我听说它们之间的差异很小,但它们之间存在着巨大的性能差异。我还尝试了使用浮点数进行计算,尽管两者都应支持硬浮点ABI,但Oracle JDK得分更高。
我使用的操作系统是Linux raspberrypi 3.18.11-v7+
。
OpenJDK:
java version "1.7.0_79"
OpenJDK Runtime Environment (IcedTea 2.5.5) (7u79-2.5.5-1~deb7u1+rpi1)
OpenJDK Zero VM (build 24.79-b02, mixed mode)
OracleJDK:
java version "1.7.0_40"
Java(TM) SE Runtime Environment (build 1.7.0_40-b43)
Java HotSpot(TM) Client VM (build 24.0-b56, mixed mode)
SciMark results:
OpenJDK OracleJDK
Composite Score 14.280735577363213 || 32.24948180361924
FFT (1024) 9.482866845055302 || 26.447121360843663
SOR (100x100) 27.14938943220646 || 59.68022533004399
Monte Carlo 3.6298604956147384 || 10.561671865446971
Sparse matmult 15.603809523809524 || 26.64931580928407
LU (100x100) 15.53775159013005 || 37.90907465247749
我使用了一个以0.1步长计算到600000的程序,试图测试JVM处理浮点数的性能。
OpenJDK: 257ms
OracleJDK: 151ms
以0.1步长计算到1200000:
OpenJDK: 457ms
OracleJDK: 263ms
public class Testing {
/**
* @param args
*/
public static long Test()
{
float counter=0.0f;
long startTime = System.currentTimeMillis();
while (counter <= 1_200_000.0f)
{
counter += 0.1f;
}
return System.currentTimeMillis() - startTime;
}
public static void main(String[] args){
System.out.println(Test());
}
}
我尝试了 SlipperySeal 提到的改进,并将测试放在循环中。我还尝试使用 c2 编译器,但结果并没有不同。