聞こえないJavaエンジニアが適当に書き連ねていく

つらつらとメモしたり日頃の溜まっている想いを吐き出す場所です。

正式版Java9で文字列の結合の速度を確認する #Java9 #String

これは何?

2017/9/21にJava9が正式にリリースされました。 Java9ではStringのあれこれが変わったと聞いていますが、そんなことはどうでもいいのです。
維持屋にとっては、バージョンアップ後のパフォーマンスがどうなるのか、が重要なのです!!(極論)

前提

これと同じプログラムを使ってテストしました。 qiita.com

@YujiSoftware さんのブログで、VMオプションについて記載されていたのでそれについても試しています。

d.hatena.ne.jp

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

結果全文 https://github.com/suzukitadashi/jmhTest/blob/master/jmhTest/MyBenchmarkStringLineHankakuJava8Result_20170923.txt

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

結果全文 https://github.com/suzukitadashi/jmhTest/blob/master/jmhTest/MyBenchmarkStringLineHankakuJava9Result.txt

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

結果全文 https://github.com/suzukitadashi/jmhTest/blob/master/jmhTest/MyBenchmarkStringLineHankakuJava9Result_20170923.txt

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

結果全文 https://github.com/suzukitadashi/jmhTest/blob/master/jmhTest/MyBenchmarkStringLineHankakuJava9Result_20170923_withOption.txt

半角数字

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

結果全文

https://github.com/suzukitadashi/jmhTest/blob/master/jmhTest/MyBenchmarkStringLineNumberJava8Result_20170923.txt

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

結果全文

https://github.com/suzukitadashi/jmhTest/blob/master/jmhTest/MyBenchmarkStringLineNumberJava8Result.txt

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

結果全文

https://github.com/suzukitadashi/jmhTest/blob/master/jmhTest/MyBenchmarkStringLineNumberJava9Result_20170923.txt

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

結果全文

https://github.com/suzukitadashi/jmhTest/blob/master/jmhTest/MyBenchmarkStringLineNumberJava9Result_20170923_withOption.txt

全角文字

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

結果全文 https://github.com/suzukitadashi/jmhTest/blob/master/jmhTest/MyBenchmarkStringLineZenkakuJava8Result_20170923.txt

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

結果全文 https://github.com/suzukitadashi/jmhTest/blob/master/jmhTest/MyBenchmarkStringLineZenkakuJava9Result.txt

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

結果全文

https://github.com/suzukitadashi/jmhTest/blob/master/jmhTest/MyBenchmarkStringLineZenkakuJava9Result_20170923.txt

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

結果全文

https://github.com/suzukitadashi/jmhTest/blob/master/jmhTest/MyBenchmarkStringLineZenkakuJava9Result_20170923_withOption.txt

まとめ

  • 数値でない場合の結合速度は爆速になるどころか、遅くなっている。

    • @YujiSoftware さんのブログを読む限りでは、半角英字は速くなってもいいはずなのだが…テストプログラムの書き方の問題であろうか?
  • VMオプションを付けると、StringBuilderもStringと同等のパフォーマンスになることがある模様。

    • Java9に挙げた結果、パフォーマンスが遅くなって困るときはVMオプションの付与を検討してもいいかも。[要検証]

お願い

  • 違う結果が出たよ、というのがありましたらテスト方法含めてどこかにまとめたうえで教えてください。勉強しに行きます。