2017年末において、Oracle JDK と OpenJDKに性能差はあるのか？

過去も、Oracle　JDKとOpenJDKを比較する記事は多々ありました。
当時も、両者はだいたい一緒だし「将来的に両者の差分はなくなる」とした[資料(PDF)](http://ossipedia.ipa.go.jp/nfs/pdf_pub/1007/208/671/671.pdf)もありました。
また、CPU アーキテクチャの違い、つまりIntelとARM上での性能差を示す[こんな記事](https://blogs.oracle.com/jtc/comparing-linuxarm-jvms-revisited)が過去にはありました。
そして、2017年も末、[様々な動き](https://blogs.oracle.com/java-platform-group/faster-and-easier-use-and-redistribution-of-java-se)がOracle JDK とOpenJDKにあります。

さて、今日においても　Oracle JDK とOpenJDKに、性能の差はあるのでしょうか?

検証してみます。コードは[こちら](https://github.com/ukiuni/easyrest/tree/measure)です。
Spring BootによるRest API アプリケーションで、テストコードでデータを1000回CRUD（作成して、参照して、変更して、削除）しています。
Oracle OpenJDKそれぞれ5回、系10回ぐらい計測してみます。
使用するJDKのバージョンは1.8.0_152、
Oracleは[こちら](http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html)から、OpenJDKは[こちら](https://zulu.org/download/)から入手します。

# Mac
手始めにMacで実行します。

```
MacBook Pro (Retina, 13-inch, Late 2012)
プロセッサ 2.9 GHz Intel Core i7
メモリ　8 GB 1600 MHz DDR3
```

ログの抜粋です。
Azul Systems, Inc. がOpenJDKです。
totalで、全件完了までにかかった時間、avrが一回のCRUDにかかった時間の平均です。マルチスレッドで実行しているので、平均＊1000≠全件完了までにかかった時間 となります。

```
# summary  :Oracle Corporation 1.8.0_152, total :  13093, avr :50.50707070707071
# summary  :Azul Systems, Inc. 1.8.0_152, total :  13219, avr :51.61749745676501
# summary  :Oracle Corporation 1.8.0_152, total :  14221, avr :55.51567239635996
# summary  :Azul Systems, Inc. 1.8.0_152, total :  14199, avr :55.383756345177666
# summary  :Oracle Corporation 1.8.0_152, total :  14041, avr :54.699195171026155
# summary  :Azul Systems, Inc. 1.8.0_152, total :  13726, avr :53.41538461538462
# summary  :Oracle Corporation 1.8.0_152, total :  14385, avr :56.066869300911854
# summary  :Azul Systems, Inc. 1.8.0_152, total :  12657, avr :49.50912778904665
# summary  :Oracle Corporation 1.8.0_152, total :  14370, avr :55.76200204290092
# summary  :Azul Systems, Inc. 1.8.0_152, total :  14021, avr :54.15415821501014
```

おお、有意差は見当たりませんね。

# Linux x64
上記Macの上にVirtual BoxでCentOSを起動し、CPU　2,Mem　2048で動作させました。

```
# summary  :Oracle Corporation 1.8.0_152, total :  27041, avr :53.996
# summary  :Azul Systems, Inc. 1.8.0_152, total :  28390, avr :56.06406406406406
# summary  :Oracle Corporation 1.8.0_152, total :  27767, avr :54.964
# summary  :Azul Systems, Inc. 1.8.0_152, total :  27635, avr :54.878
# summary  :Oracle Corporation 1.8.0_152, total :  30113, avr :59.563
# summary  :Azul Systems, Inc. 1.8.0_152, total :  26138, avr :51.66466466466466
# summary  :Oracle Corporation 1.8.0_152, total :  28239, avr :55.88
# summary  :Azul Systems, Inc. 1.8.0_152, total :  27637, avr :55.074
# summary  :Oracle Corporation 1.8.0_152, total :  28477, avr :56.231
# summary  :Azul Systems, Inc. 1.8.0_152, total :  27685, avr :54.856
```

同じく有意差は見つかりません。


# Windows x64
Mac上のWindows 10 で同様に動かしてみました。

```
# summary  :Oracle Corporation 1.8.0_152, total :  88932, avr :170.171
# summary  :Azul Systems, Inc. 1.8.0_152, total : 104348, avr :207.67
# summary  :Oracle Corporation 1.8.0_152, total :  89635, avr :179.223
# summary  :Azul Systems, Inc. 1.8.0_152, total :  92882, avr :179.815
# summary  :Oracle Corporation 1.8.0_152, total :  84967, avr :165.057
# summary  :Azul Systems, Inc. 1.8.0_152, total :  96394, avr :191.677
# summary  :Oracle Corporation 1.8.0_152, total :  87724, avr :174.424
# summary  :Azul Systems, Inc. 1.8.0_152, total :  83325, avr :164.012
# summary  :Oracle Corporation 1.8.0_152, total :  89018, avr :169.627
# summary  :Azul Systems, Inc. 1.8.0_152, total :  87105, avr :170.365
```

有意差はないように見えます。

# Linux ARM 32
Raspberry Pi2 B上で動作させました。

```
# summary  :Oracle Corporation 1.8.0_152, total :  87153, avr :345.167
# summary  :Azul Systems, Inc. 1.8.0_152, total :  98166, avr :389.905
# summary  :Oracle Corporation 1.8.0_152, total :  86835, avr :345.236
# summary  :Azul Systems, Inc. 1.8.0_152, total : 101888, avr :405.66166166166164
# summary  :Oracle Corporation 1.8.0_152, total :  85945, avr :342.2522522522523
# summary  :Azul Systems, Inc. 1.8.0_152, total :  97561, avr :385.345
# summary  :Oracle Corporation 1.8.0_152, total :  87837, avr :345.8416833667335
# summary  :Azul Systems, Inc. 1.8.0_152, total :  97551, avr :385.878
# summary  :Oracle Corporation 1.8.0_152, total :  86338, avr :343.878
# summary  :Azul Systems, Inc. 1.8.0_152, total :  96303, avr :383.2995991983968
```

おお！差異がありますね!おおよそ10％ほどOracke JDKの方が早い！


# Linux ARM 64
[PINE64](https://www.pine64.org/?page_id=1194) というARMのシングルボードコンピュータ上で試してみました。

```
# summary  :Oracle Corporation 1.8.0_152, total : 125477, avr :500.5605605605606
# summary  :Azul Systems, Inc. 1.8.0_152, total :  67825, avr :267.8199195171026
# summary  :Oracle Corporation 1.8.0_152, total : 123450, avr :492.10854271356783
# summary  :Azul Systems, Inc. 1.8.0_152, total :  69810, avr :275.91691691691693
# summary  :Oracle Corporation 1.8.0_152, total : 129602, avr :517.0773092369478
# summary  :Azul Systems, Inc. 1.8.0_152, total :  67636, avr :265.72754793138245
# summary  :Oracle Corporation 1.8.0_152, total : 125981, avr :501.3711133400201
# summary  :Azul Systems, Inc. 1.8.0_152, total :  71870, avr :283.9637826961771
# summary  :Oracle Corporation 1.8.0_152, total : 127799, avr :507.6098294884654
# summary  :Azul Systems, Inc. 1.8.0_152, total :  69773, avr :275.34375
```

おおおおおお！相当の差異があります！OpenJDKの方が40%ほど早い！すごいですね。

# まとめ

2017年末現在において、Intel上のMac,Linux,Windowsにおいて、優位な性能差は見られませんでした。
しかしながら、ARM上においては差異が認められ、とくに64bit上ではOpenJDKの方が40%も性能がよい、という結果が出ました。
これから、省電力性にまさるARMがサーバ用途で使われていくことは大いに考えられます。その際にOpenJDKを使っていれば、サーバの台数を大幅に削ることができ、費用面で優位になることが考えられます。更には各環境用のJDKには性能差異がないので、開発でもOpenJDKを使うことが可能ではないでしょうか？
どうでしょう？この際、開発環境と本番環境、すべてのJavaランタイムをOpenJDKで併せてみては！