正式版Java9で文字列の結合の速度を確認する #Java9 #String
これは何?
2017/9/21にJava9が正式にリリースされました。 Java9ではStringのあれこれが変わったと聞いていますが、そんなことはどうでもいいのです。
維持屋にとっては、バージョンアップ後のパフォーマンスがどうなるのか、が重要なのです!!(極論)
前提
これと同じプログラムを使ってテストしました。 qiita.com
@YujiSoftware さんのブログで、VMオプションについて記載されていたのでそれについても試しています。
githubのソースの場所はこちら。 github.com
jmhの起動方法などはこちらにまとめています。 https://github.com/suzukitadashi/jmhTest/blob/master/jmhTest/command.txt
テストした端末のスペックなどは以下の通りです。
- Windows10 64bit
- Intel® Core™ i7-2820QM CPU @ 2.30GHz
- メモリは8GM
結果
注釈
- スマホからだと見づらいので、パソコンにするか、横にして画面を広げるか、などをお勧めします。
- Scoreの数字が大きいほど、パフォーマンスがいいと言えます。
半角英字
VM version: JDK 1.8.0_144, VM 25.144-b01
Benchmark Mode Cnt Score Error Units StringLineHankaku.call1StringLine thrpt 10 141.099 ± 1.144 ops/s StringLineHankaku.call2StringConcat thrpt 10 35.888 ± 0.221 ops/s StringLineHankaku.call3StringBuffer thrpt 10 97.689 ± 0.812 ops/s StringLineHankaku.call4StringBuilder thrpt 10 98.916 ± 3.052 ops/s
VM version: JDK 9-ea, VM 9-ea+134(Early Access版)
Benchmark Mode Cnt Score Error Units StringLineHankaku.call1StringLine thrpt 10 90.187 ± 2.961 ops/s StringLineHankaku.call2StringConcat thrpt 10 46.822 ± 3.277 ops/s StringLineHankaku.call3StringBuffer thrpt 10 68.937 ± 2.796 ops/s StringLineHankaku.call4StringBuilder thrpt 10 78.742 ± 2.665 ops/s
VM version: JDK 9, VM 9+181
VM options: なし
Benchmark Mode Cnt Score Error Units StringLineHankaku.call1StringLine thrpt 10 92.795 ± 2.711 ops/s StringLineHankaku.call2StringConcat thrpt 10 27.106 ± 17.205 ops/s StringLineHankaku.call3StringBuffer thrpt 10 53.108 ± 21.248 ops/s StringLineHankaku.call4StringBuilder thrpt 10 62.540 ± 21.275 ops/s
VM options: -XX:-CompactStrings -DCompactStringEnabled=false
Benchmark Mode Cnt Score Error Units StringLineHankaku.call1StringLine thrpt 10 108.819 ± 4.212 ops/s StringLineHankaku.call2StringConcat thrpt 10 50.795 ± 0.952 ops/s StringLineHankaku.call3StringBuffer thrpt 10 56.127 ± 0.568 ops/s StringLineHankaku.call4StringBuilder thrpt 10 104.129 ± 1.707 ops/s
半角数字
VM version: JDK 1.8.0_144, VM 25.144-b01
Benchmark Mode Cnt Score Error Units StringLineNumber.call1StringLine thrpt 10 112.127 ± 34.207 ops/s StringLineNumber.call2StringConcat thrpt 10 71.693 ± 0.270 ops/s StringLineNumber.call3StringBuffer thrpt 10 103.061 ± 1.590 ops/s StringLineNumber.call4StringBuilder thrpt 10 88.149 ± 35.149 ops/s
結果全文
VM version: JDK 9-ea, VM 9-ea+134(Early Access版)
Benchmark Mode Cnt Score Error Units StringLineNumber.call1StringLine thrpt 10 245.689 ± 13.801 ops/s StringLineNumber.call2StringConcat thrpt 10 132.742 ± 9.051 ops/s StringLineNumber.call3StringBuffer thrpt 10 49.300 ± 1.349 ops/s StringLineNumber.call4StringBuilder thrpt 10 52.594 ± 2.545 ops/s
結果全文
VM version: JDK 9, VM 9+181
VM options: なし
Benchmark Mode Cnt Score Error Units StringLineNumber.call1StringLine thrpt 10 187.399 ± 111.698 ops/s StringLineNumber.call2StringConcat thrpt 10 103.961 ± 50.983 ops/s StringLineNumber.call3StringBuffer thrpt 10 33.543 ± 21.675 ops/s StringLineNumber.call4StringBuilder thrpt 10 51.688 ± 0.346 ops/s
結果全文
VM options: -XX:-CompactStrings -DCompactStringEnabled=false
Benchmark Mode Cnt Score Error Units StringLineNumber.call1StringLine thrpt 10 238.952 ± 12.086 ops/s StringLineNumber.call2StringConcat thrpt 10 107.838 ± 3.610 ops/s StringLineNumber.call3StringBuffer thrpt 10 101.667 ± 97.174 ops/s StringLineNumber.call4StringBuilder thrpt 10 177.984 ± 3.698 ops/s
結果全文
全角文字
VM version: JDK 1.8.0_144, VM 25.144-b01
Benchmark Mode Cnt Score Error Units StringLineZenkaku.call1StringLine thrpt 10 141.133 ± 1.504 ops/s StringLineZenkaku.call2StringConcat thrpt 10 36.212 ± 0.202 ops/s StringLineZenkaku.call3StringBuffer thrpt 10 97.025 ± 2.155 ops/s StringLineZenkaku.call4StringBuilder thrpt 10 99.454 ± 1.509 ops/s
VM version: JDK 9-ea, VM 9-ea+134(Early Access版)
Benchmark Mode Cnt Score Error Units StringLineZenkaku.call1StringLine thrpt 10 92.686 ± 0.299 ops/s StringLineZenkaku.call2StringConcat thrpt 10 49.554 ± 0.684 ops/s StringLineZenkaku.call3StringBuffer thrpt 10 56.950 ± 6.474 ops/s StringLineZenkaku.call4StringBuilder thrpt 10 69.917 ± 0.210 ops/s
VM version: JDK 9, VM 9+181
VM options: なし
Benchmark Mode Cnt Score Error Units StringLineZenkaku.call1StringLine thrpt 10 93.176 ± 1.204 ops/s StringLineZenkaku.call2StringConcat thrpt 10 48.488 ± 0.728 ops/s StringLineZenkaku.call3StringBuffer thrpt 10 55.984 ± 6.048 ops/s StringLineZenkaku.call4StringBuilder thrpt 10 63.517 ± 0.586 ops/s
結果全文
VM options: -XX:-CompactStrings -DCompactStringEnabled=false
Benchmark Mode Cnt Score Error Units StringLineZenkaku.call1StringLine thrpt 10 109.511 ± 1.972 ops/s StringLineZenkaku.call2StringConcat thrpt 10 50.061 ± 2.419 ops/s StringLineZenkaku.call3StringBuffer thrpt 10 55.549 ± 0.624 ops/s StringLineZenkaku.call4StringBuilder thrpt 10 104.124 ± 1.103 ops/s
結果全文
まとめ
数値でない場合の結合速度は爆速になるどころか、遅くなっている。
- @YujiSoftware さんのブログを読む限りでは、半角英字は速くなってもいいはずなのだが…テストプログラムの書き方の問題であろうか?
VMオプションを付けると、StringBuilderもStringと同等のパフォーマンスになることがある模様。
- Java9に挙げた結果、パフォーマンスが遅くなって困るときはVMオプションの付与を検討してもいいかも。[要検証]
お願い
- 違う結果が出たよ、というのがありましたらテスト方法含めてどこかにまとめたうえで教えてください。勉強しに行きます。