前に「Javaでの文字列連結では、できるだけ+演算子を使おう!」で書いたことが、Java 9で実現されるということを今更ながら知りました。
「Java9で文字列の結合の速度を確認する」(@deaf_tadashi さん) に載っているJava 9のjavapコードを拝見しますと…
おお、文字列を+で連結するコードが、invokedynamic経由で次のメソッドを呼び出すバイトコードに変換されています!
java.lang.invoke.StringConcatFactory#makeConcatWithConstants(MethodHandles.Lookup, String, MethodType, String, Object... constants)
invokedynamic呼び出しになるとどうなるかというと、一度Java 9でコンパイルすれば、常にそのmakeConcatWithConstants
メソッドを呼び出す「お約束」になります。
以降は、Javaコア側でmakeConcatWithConstants
メソッドを最適化すれば、アプリ側のJavaソースを再コンパイルしなくても、そのまま、+連結の処理も最適化されることになります。
ちなみに、OpenJDKのJDK 9(64bit)のソースを見たければ、Mercurialをインストールし、hg clone http://hg.openjdk.java.net/jdk9/jdk9/jdk jdk9-jdk
などと叩きます(複製に時間がかかりますが)。
以上、「Javaでの文字列連結では、できるだけ+演算子を使おう!(第二弾)」でした。