web-dev-qa-db-ja.com

OpenとOracleJDKの間でRaspberryPiのパフォーマンスにこのような違いがあるのはなぜですか?

私のラズベリーでは、両方のJVMでCaffeineMarkやSciMarkなどのパフォーマンステストを行いました。違いは非常に小さいと聞いていますが、パフォーマンスには大きな違いがあります。また、浮動小数点数を使用して計算しようとしましたが、どちらもハードフロートabiをサポートしているはずですが、OracleJDKのスコアは高くなりました。

私が使う Linux raspberrypi 3.18.11-v7+OSとして。

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

1200000まで0.1ステップ:

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コンパイラを使用しようとしましたが、結果に違いはありませんでした。

16
Laobiz

OpenJDK Zero VMはインタプリタのみのJVMです。アーキテクチャ固有のアセンブリコードがないため移植が簡単ですが、アーキテクチャがないためパフォーマンスが高くありません。特定のアセンブリコード。

OracleJDKは、プラットフォームの浮動小数点ABI(RP1ではソフトフロート、RP2ではハードフロート)を利用します。 ARMアーキテクチャに固有の、かなりの量のアセンブリコードがあると想像できます。そのため、スコアが高くなります。

LLVMに基づくSharkという名前のJITコンパイラがOpenJDKZero VMの早い段階で導入されました。システムのOpenJDKがSharkでビルドされたかどうかはわかりませんが、おそらくそうでした。妥協点を提供します。アセンブリコードがない場合と効率的なネイティブコードを実行している場合の間。Sharkが有効になっていない場合は、Sharkを有効にしてIcedTeaをビルドすると、パフォーマンスが向上します。Sharkが有効になっている場合は、OpenJDKがそれほど多くを消費しない理由です。

17
m4ktub

2018年4月の更新。

RaspbianStretchを使用してRaspberryPi3でJava Whetstoneオフラインベンチマークを実行します。ソースコードはファイルRaspberry_Pi_Benchmarks/Java/source code/Whetstone-off-line/whetstc.Javaにあります ここ

結論として、openjdk-9-jreはopenjdk-8-jre(テスト済みバージョン1.8.0_162)よりも高速であり、openjdk-8-jre(テスト済みバージョン1.8.0_65)よりも高速です。 Oracle-Java8-jdkで古いカーネルを使用したことにも注意してください。

openjdk-9-jdkRaspbianリポジトリから:

$ Java -version
openjdk version "9-Raspbian"
OpenJDK Runtime Environment (build 9-Raspbian+0-9b181-4bpo9rpt1)
OpenJDK Server VM (build 9-Raspbian+0-9b181-4bpo9rpt1, mixed mode)

$ Java whetstc 
   Whetstone Benchmark Java Version, apr. 26 2018, 23:15:40

                                                     1 Pass
Test                  Result       MFLOPS     MOPS  millisecs

N1 floating point  -1,124750137    333,22             0,0576
N2 floating point  -1,131330490    293,19             0,4584
N3 if then else     1,000000000             185,95    0,5566
N4 fixed point     12,000000000             412,95    0,7628
N5 sin,cos etc.     0,499110132              22,40    3,7140
N6 floating point   0,999999821    212,70             2,5360
N7 assignments      3,000000000             105,66    1,7490
N8 exp,sqrt etc.    0,825148463              16,70    2,2280

MWIPS                              829,02            12,0624

Operating System    Linux, Arch. arm, Version 4.14.34-v7+
Java Vendor         Oracle Corporation, Version  9-Raspbian
CPU null

openjdk-8-jdkRaspbianリポジトリから:

$ Java -version
openjdk version "1.8.0_162"
OpenJDK Runtime Environment (build 1.8.0_162-8u162-b12-1~deb9u1-b12)
OpenJDK Client VM (build 25.162-b12, mixed mode)

$ Java whetstc
   Whetstone Benchmark Java Version, Apr 27 2018, 13:13:26

                                                     1 Pass
Test                  Result       MFLOPS     MOPS  millisecs

N1 floating point  -1.124750137    181.82             0.1056
N2 floating point  -1.131330490    175.92             0.7640
N3 if then else     1.000000000              88.61    1.1680
N4 fixed point     12.000000000             389.85    0.8080
N5 sin,cos etc.     0.499110132               9.35    8.8980
N6 floating point   0.999999821     76.27             7.0720
N7 assignments      3.000000000             275.82    0.6700
N8 exp,sqrt etc.    0.825148463               7.15    5.2060

MWIPS                              405.00            24.6916

Operating System    Linux, Arch. arm, Version 4.14.34-v7+
Java Vendor         Oracle Corporation, Version  1.8.0_162
CPU null

Oracle-Java8-jdkfrom Raspbian repos:

$ Java -version
Java version "1.8.0_65"
Java(TM) SE Runtime Environment (build 1.8.0_65-b17)
Java HotSpot(TM) Client VM (build 25.65-b01, mixed mode)`

$ Java whetstc
   Whetstone Benchmark Java Version, Nov 15 2017, 11:16:37

                                                     1 Pass
Test                  Result       MFLOPS     MOPS  millisecs

N1 floating point  -1.124750137     91.52             0.2098
N2 floating point  -1.131330490     89.01             1.5100
N3 if then else     1.000000000              44.27    2.3380
N4 fixed point     12.000000000             229.76    1.3710
N5 sin,cos etc.     0.499110103               3.01   27.6400
N6 floating point   0.999999821     44.95            12.0000
N7 assignments      3.000000000             137.09    1.3480
N8 exp,sqrt etc.    0.751108646               0.58   63.9100

MWIPS                               90.64           110.3268

Operating System    Linux, Arch. arm, Version 4.9.35-v7+
Java Vendor         Oracle Corporation, Version  1.8.0_65
CPU null
9
Anton Stolbunov