SlideShare a Scribd company logo
3
Most read
6
Most read
8
Most read
Java 9 で
文字列結合の
処理が変わるぞ!
準備はいいか!?
@YujiSoftware
問題
• +演算子による文字列結合は最終的に
どのような処理になる?
private static String test(String str, int value) {
return "ABC” + str + value;
}
Java 8 までは
• コンパイル時に StringBuilder を使った処理に
なる
private static String test(String str, int value) {
return new StringBuilder()
.append("ABC")
.append(str)
.append(value)
.toString();
}
Java 9 では
• InvokeDynamic で、実行時に処理を作る
private static String test(String str, int value) {
return InvokeDynamic
#1:makeConcatWithConstants:
(II)Ljava/lang/String;
}
そして…
InvokeDynamic の結果!
• 「byte配列を生成し、そこに文字を詰める処
理」が出来上がる!
private static String test(String str, int value) {
int length = (文字列の長さを計算);
byte[] buf = new byte[length];
int index = buf.length;
index = StringConcatHelper.prepend(index, buf, coder, value);
index = StringConcatHelper.prepend(index, buf, coder, str);
index = StringConcatHelper.prepend(index, buf, coder, "ABC");
return new String(buf,coder);
}
+演算子による文字列結合で
StringBuilder は
使わなくなった!
どういうこと?
• JEP280 (Indy String Concatenation) の対応
– 再コンパイルなしで、文字列結合を最適な処理に
変更できるようにする
InvokeDynamic を使って、実行時に処理を作るように
変更する
– そのついでに、より最適化された処理を
作るようにしよう!(ストレッチゴール)
いくつかの案を試すことになった
実装された案
案(ストラテジー) 概要
BC_SB StringBuilderを使ったバイトコードを生成する(既存と同様)
BC_SB_SIZED StringBuilderを使ったバイトコードを生成する。
加えて、必要な配列のサイズを「推定」する。
BC_SB_SIZED_EXACT StringBuilderを使ったバイトコードを生成する。
加えて、必要な配列のサイズを「正確に計算」する。
MH_SB_SIZED MethodHandleベースのジェネレータを使って、最終的に
StringBuilder を呼び出す。
加えて、必要な配列のサイズを「推定」する。
MH_SB_SIZED_EXACT MethodHandleベースのジェネレータを使って、最終的に
StringBuilder を呼び出す。
加えて、必要な配列のサイズを「正確に計算」する。
MH_INLINE_SIZED_EXACT MethodHandleベースのジェネレータを使って、独自にbyte
配列を構築する。
必要な配列のサイズを「正確に計算」する。
※ 起動オプション –D:java.lang.invoke.stringConcat=(ストラテジー名) で変更可能
採用された案
• MH_INLINE_SIZED_EXACT が採用された
– 唯一、StringBuilder を使わない実装
• 特徴
– 各APIをMethodHandleでコールする処理を作る
– 文字列を格納する配列の長さを、最初に厳密に
計算する
• 足りなくなったら新しく配列を作り直す、という
StringBuilderの無駄を避ける
文字列結合の処理は
どうやって作られるのか
java.lang.invoke.StringConcatFactory
#makeConcatWithConstants の実装// Start building the combinator tree. The tree "starts" with (<parameters>)String, and "finishes"
// with the (int, byte[], byte)String in String helper. The combinators are assembled bottom-up,
// which makes the code arguably hard to read.
// Drop all remaining parameter types, leave only helper arguments:
MethodHandle mh;
mh = MethodHandles.dropArguments(NEW_STRING, 3, ptypes);
// Mix in prependers. This happens when (byte[], int, byte) = (storage, index, coder) is already
// known from the combinators below. We are assembling the string backwards, so "index" is the
// *ending* index.
for (RecipeElement el : recipe.getElements()) {
// Do the prepend, and put "new" index at index 1
mh = MethodHandles.dropArguments(mh, 2, int.class);
switch (el.getTag()) {
case TAG_CONST: {
Object cnst = el.getValue();
MethodHandle prepender = MethodHandles.insertArguments(prepender(cnst.getClass()), 3, cnst)
mh = MethodHandles.foldArguments(mh, 1, prepender,
2, 0, 3 // index, storage, coder
);
break;
}
case TAG_ARG: {
int pos = el.getArgPos();
MethodHandle prepender = prepender(ptypes[pos]);
mh = MethodHandles.foldArguments(mh, 1, prepender,
2, 0, 3, // index, storage, coder
4 + pos // selected argument
);
break;
さっぱり分からん
(´・ω・`)
作戦変更
• JIT Watch で、 makeConcatWithConstants
メソッドにより生成された処理を確認
• JIT Watchとは?
– ソースコードと、それをコンパイルしたバイトコード、さらに
実行時のアセンブラを並べて比較できるツール
– どのような処理が実行されたのかがひと目でわかる
生成された処理
0x000001df3b29f540: cmp $0xfa0a1f00,%r10d
0x000001df3b29f547: jg L002f
0x000001df3b29f54d: cmp $0xc4653600,%r10d
0x000001df3b29f554: jle L0050 ;*if_icmple {reexecute=0 rethrow=0 return_oop=0}
; - java.lang.Integer::stringSize@24 (line 542)
; - java.lang.StringConcatHelper::mixLen@2 (line 96)
; - java.lang.invoke.DirectMethodHandle$Holder::invokeStatic@11
; - java.lang.invoke.LambdaForm$BMH/400136488::reinvoke@48
; - java.lang.invoke.LambdaForm$MH/1879034789::linkToTargetMethod@6
; - Test::test@17 (line 15)
0x000001df3b29f55a: mov $0x8,%ecx
0x000001df3b29f55f: jmp L0003
L0002: mov $0x2,%ecx
L0003: inc %ecx ;*iinc {reexecute=0 rethrow=0 return_oop=0}
; - java.lang.Integer::stringSize@36 (line 541)
; - java.lang.StringConcatHelper::mixLen@2 (line 96)
; - java.lang.invoke.DirectMethodHandle$Holder::invokeStatic@11
; - java.lang.invoke.LambdaForm$BMH/400136488::reinvoke@48
; - java.lang.invoke.LambdaForm$MH/1879034789::linkToTargetMethod@6
; - Test::test@17 (line 15)
L0004: mov %ecx,%r8d
0x000001df3b29f56b: add $0x5,%r8d ;*iadd {reexecute=0 rethrow=0 return_oop=0}
時間がないので流れだけ
説明すると…
Phase 1. byte配列を作る
1. 結合する各文字列の長さを計算する
2. 合計分の長さのbyte配列を作成する
byte[] buf = new byte[10]
例:
“ABC” → 3
1357 → 5
obj → obj.toString().length() → 3
Phase 2. byte配列に文字列を詰める
3. 末尾の方から、byte配列に文字を詰めていく
– 末尾から処理する理由は不明
• メモリのアクセス効率がいい?
A B C 1 3 5 7 o b j
“A B C”
1 3 5 7
o b j
byte配列
Phase 3. 文字列にする
4. 作った配列を String にする
new String(buf, coder);
A B C 1 3 5 7 o b j
完成!
どのぐらい速くなったか
• 文字列にもよるが、1倍~3倍程度速くなる
• ただし、最初だけ少し遅い
– InvokeDynamic で処理を作る必要があるため
• 詳しくは、JEP280 の資料を参照
– http://cr.openjdk.java.net/~shade/8085796/notes
.txt
まとめ
• Java 9 で + 演算による文字列結合の処理が
変わった
– StringBuilder が使われなくなった
– パフォーマンスも向上した
• Java 9 を使う理由がまた一つ増えた!
• ぜひアップデートした知識を使って、Java を
アップデートしましょう!
Java 9 で
文字列結合の
処理が変わるぞ!
準備はいいか!?
@YujiSoftware
ちなみに
• 後日、詳細をブログにまとめる予定
• 地平線に行くで検索
– http://d.hatena.ne.jp/chiheisen/

More Related Content

PDF
Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)
NTT DATA Technology & Innovation
 
PDF
オブジェクト指向できていますか?
Moriharu Ohzu
 
PDF
Pythonによる黒魔術入門
大樹 小倉
 
PDF
PostgreSQLアンチパターン
Soudai Sone
 
PDF
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
Y Watanabe
 
PDF
ソーシャルゲームのためのデータベース設計
Yoshinori Matsunobu
 
PDF
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
shinjiigarashi
 
PDF
TRICK 2022 Results
mametter
 
Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)
NTT DATA Technology & Innovation
 
オブジェクト指向できていますか?
Moriharu Ohzu
 
Pythonによる黒魔術入門
大樹 小倉
 
PostgreSQLアンチパターン
Soudai Sone
 
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
Y Watanabe
 
ソーシャルゲームのためのデータベース設計
Yoshinori Matsunobu
 
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
shinjiigarashi
 
TRICK 2022 Results
mametter
 

What's hot (20)

PDF
イミュータブルデータモデル(世代編)
Yoshitaka Kawashima
 
PPTX
PostgreSQLモニタリングの基本とNTTデータが追加したモニタリング新機能(Open Source Conference 2021 Online F...
NTT DATA Technology & Innovation
 
PDF
ソーシャルゲーム案件におけるDB分割のPHP実装
infinite_loop
 
PDF
文字コードに起因する脆弱性とその対策(増補版)
Hiroshi Tokumaru
 
PPTX
PostgreSQLのロール管理とその注意点(Open Source Conference 2022 Online/Osaka 発表資料)
NTT DATA Technology & Innovation
 
PDF
開発速度が速い #とは(LayerX社内資料)
mosa siru
 
PDF
がんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とは
Jun-ichi Sakamoto
 
PDF
ドメイン駆動設計 基本を理解する
増田 亨
 
PDF
分散システムの限界について知ろう
Shingo Omura
 
PDF
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
Takuto Wada
 
PPTX
【修正版】Django + SQLAlchemy: シンプルWay
Takayuki Shimizukawa
 
PDF
これからのネイティブアプリにおけるOpenID Connectの活用
Masaru Kurahayashi
 
PDF
Where狙いのキー、order by狙いのキー
yoku0825
 
PDF
できる!並列・並行プログラミング
Preferred Networks
 
PDF
ドメイン駆動設計のための Spring の上手な使い方
増田 亨
 
PDF
新入社員のための大規模ゲーム開発入門 サーバサイド編
infinite_loop
 
PDF
雑なMySQLパフォーマンスチューニング
yoku0825
 
PDF
FPGAをロボット(ROS)で「やわらかく」使うには
Hideki Takase
 
PDF
目grep入門 +解説
murachue
 
PDF
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
Takuto Wada
 
イミュータブルデータモデル(世代編)
Yoshitaka Kawashima
 
PostgreSQLモニタリングの基本とNTTデータが追加したモニタリング新機能(Open Source Conference 2021 Online F...
NTT DATA Technology & Innovation
 
ソーシャルゲーム案件におけるDB分割のPHP実装
infinite_loop
 
文字コードに起因する脆弱性とその対策(増補版)
Hiroshi Tokumaru
 
PostgreSQLのロール管理とその注意点(Open Source Conference 2022 Online/Osaka 発表資料)
NTT DATA Technology & Innovation
 
開発速度が速い #とは(LayerX社内資料)
mosa siru
 
がんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とは
Jun-ichi Sakamoto
 
ドメイン駆動設計 基本を理解する
増田 亨
 
分散システムの限界について知ろう
Shingo Omura
 
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
Takuto Wada
 
【修正版】Django + SQLAlchemy: シンプルWay
Takayuki Shimizukawa
 
これからのネイティブアプリにおけるOpenID Connectの活用
Masaru Kurahayashi
 
Where狙いのキー、order by狙いのキー
yoku0825
 
できる!並列・並行プログラミング
Preferred Networks
 
ドメイン駆動設計のための Spring の上手な使い方
増田 亨
 
新入社員のための大規模ゲーム開発入門 サーバサイド編
infinite_loop
 
雑なMySQLパフォーマンスチューニング
yoku0825
 
FPGAをロボット(ROS)で「やわらかく」使うには
Hideki Takase
 
目grep入門 +解説
murachue
 
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
Takuto Wada
 
Ad

Viewers also liked (20)

PDF
Java SE 9の紹介: モジュール・システムを中心に
Taku Miyakawa
 
PDF
JJUG初心者のためのJava/JJUG講座
Yusuke Suzuki
 
PDF
劇的改善 Ci4時間から5分へ〜私がやった10のこと〜
aha_oretama
 
PDF
Java9を迎えた今こそ!Java本格(再)入門
Takuya Okada
 
PPTX
Dockerで始める Java EE アプリケーション開発 for JJUG CCC 2017
Kohei Saito
 
PDF
Selenide or Geb 〜あなたはその時どちらを使う〜
Youtarou TAKAHASHI
 
PDF
ユニットテストのアサーション 流れるようなインターフェースのAssertJを添えて 入門者仕立て
Ryosuke Uchitate
 
PDF
JVM上で動くPython処理系実装のススメ
Yoshiaki Shibutani
 
PPTX
サーバサイド Kotlin
Hiroki Ohtani
 
PDF
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
Koichiro Matsuoka
 
PPTX
マルチクラウドデータ連携Javaアプリケーションの作り方
CData Software Japan
 
PPTX
高速なソートアルゴリズムを書こう!!
masakazu matsubara
 
PDF
Another compilation method in java - AOT (Ahead of Time) compilation
Logico
 
PDF
Business Process Modeling in Goldman Sachs @ JJUG CCC Fall 2017
tty fky
 
PPTX
将来 自分で サービスを持ちたいエンジニアの葛藤
Yoshio Kajikuri
 
PPTX
Javaアプリケーションの モダナイゼーションアプローチ
CData Software Japan
 
PPTX
サンプルアプリケーションで学ぶApache Cassandraを使ったJavaアプリケーションの作り方
Yuki Morishita
 
PPTX
Java を今すぐダウンロードしてみたお話
YujiSoftware
 
PDF
Open Liberty: オープンソースになったWebSphere Liberty
Takakiyo Tanaka
 
PDF
CPUから見たG1GC
Kenji Kazumura
 
Java SE 9の紹介: モジュール・システムを中心に
Taku Miyakawa
 
JJUG初心者のためのJava/JJUG講座
Yusuke Suzuki
 
劇的改善 Ci4時間から5分へ〜私がやった10のこと〜
aha_oretama
 
Java9を迎えた今こそ!Java本格(再)入門
Takuya Okada
 
Dockerで始める Java EE アプリケーション開発 for JJUG CCC 2017
Kohei Saito
 
Selenide or Geb 〜あなたはその時どちらを使う〜
Youtarou TAKAHASHI
 
ユニットテストのアサーション 流れるようなインターフェースのAssertJを添えて 入門者仕立て
Ryosuke Uchitate
 
JVM上で動くPython処理系実装のススメ
Yoshiaki Shibutani
 
サーバサイド Kotlin
Hiroki Ohtani
 
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
Koichiro Matsuoka
 
マルチクラウドデータ連携Javaアプリケーションの作り方
CData Software Japan
 
高速なソートアルゴリズムを書こう!!
masakazu matsubara
 
Another compilation method in java - AOT (Ahead of Time) compilation
Logico
 
Business Process Modeling in Goldman Sachs @ JJUG CCC Fall 2017
tty fky
 
将来 自分で サービスを持ちたいエンジニアの葛藤
Yoshio Kajikuri
 
Javaアプリケーションの モダナイゼーションアプローチ
CData Software Japan
 
サンプルアプリケーションで学ぶApache Cassandraを使ったJavaアプリケーションの作り方
Yuki Morishita
 
Java を今すぐダウンロードしてみたお話
YujiSoftware
 
Open Liberty: オープンソースになったWebSphere Liberty
Takakiyo Tanaka
 
CPUから見たG1GC
Kenji Kazumura
 
Ad

Similar to JEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_ccc (20)

PPTX
Junit4
ichikaz3
 
PPTX
Enshu8
sudahiroshi
 
PDF
Java SE 7 InvokeDynamic in JRuby
Hiroshi Nakamura
 
PDF
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
normalian
 
PDF
PostgreSQL - C言語によるユーザ定義関数の作り方
Satoshi Nagayasu
 
KEY
Sencha ug3 siesta_share
久司 中村
 
PDF
Async design with Unity3D
Kouji Hosoda
 
PDF
Tokyor14 - R言語でユニットテスト
Yohei Sato
 
PDF
Javaセキュアコーディングセミナー東京第3回講義
JPCERT Coordination Center
 
PDF
Ajax 応用
Katsuyuki Seino
 
PPTX
T69 c++cli ネイティブライブラリラッピング入門
伸男 伊藤
 
PDF
Javaセキュアコーディングセミナー東京第2回演習の解説
JPCERT Coordination Center
 
PDF
Pfi Seminar 2010 1 7
Preferred Networks
 
PDF
appengine ja night #4 Transaction Puzzlers
Suguru ARAKAWA
 
PDF
20190625 OpenACC 講習会 第3部
NVIDIA Japan
 
PDF
Apache Torqueについて
tako pons
 
PDF
Unit testing JavaScript with JUnit/JavaFX
Shinya Mochida
 
PDF
Python physicalcomputing
Noboru Irieda
 
PDF
Implementation patterns
Tatsuya Maki
 
PDF
Javaセキュアコーディングセミナー東京第2回演習
JPCERT Coordination Center
 
Junit4
ichikaz3
 
Enshu8
sudahiroshi
 
Java SE 7 InvokeDynamic in JRuby
Hiroshi Nakamura
 
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
normalian
 
PostgreSQL - C言語によるユーザ定義関数の作り方
Satoshi Nagayasu
 
Sencha ug3 siesta_share
久司 中村
 
Async design with Unity3D
Kouji Hosoda
 
Tokyor14 - R言語でユニットテスト
Yohei Sato
 
Javaセキュアコーディングセミナー東京第3回講義
JPCERT Coordination Center
 
Ajax 応用
Katsuyuki Seino
 
T69 c++cli ネイティブライブラリラッピング入門
伸男 伊藤
 
Javaセキュアコーディングセミナー東京第2回演習の解説
JPCERT Coordination Center
 
Pfi Seminar 2010 1 7
Preferred Networks
 
appengine ja night #4 Transaction Puzzlers
Suguru ARAKAWA
 
20190625 OpenACC 講習会 第3部
NVIDIA Japan
 
Apache Torqueについて
tako pons
 
Unit testing JavaScript with JUnit/JavaFX
Shinya Mochida
 
Python physicalcomputing
Noboru Irieda
 
Implementation patterns
Tatsuya Maki
 
Javaセキュアコーディングセミナー東京第2回演習
JPCERT Coordination Center
 

More from YujiSoftware (8)

PPTX
ラムダのコンパイル結果を5分で説明するよ​
YujiSoftware
 
PPTX
Javaはどれだけ速いのか
YujiSoftware
 
PPTX
Java をクラッシュさせて遊んでみよう!
YujiSoftware
 
PPTX
技術書を読むと眠くなる!これを解決するために取った10の対策
YujiSoftware
 
PPTX
JVM言語を使ってみようの歌
YujiSoftware
 
PPTX
AtCoderで始めるテスト駆動開発
YujiSoftware
 
PPTX
Javaでマサカリ投げてみた
YujiSoftware
 
PPTX
ジャバのはなし、JAVAのはなし、Javaのはなし
YujiSoftware
 
ラムダのコンパイル結果を5分で説明するよ​
YujiSoftware
 
Javaはどれだけ速いのか
YujiSoftware
 
Java をクラッシュさせて遊んでみよう!
YujiSoftware
 
技術書を読むと眠くなる!これを解決するために取った10の対策
YujiSoftware
 
JVM言語を使ってみようの歌
YujiSoftware
 
AtCoderで始めるテスト駆動開発
YujiSoftware
 
Javaでマサカリ投げてみた
YujiSoftware
 
ジャバのはなし、JAVAのはなし、Javaのはなし
YujiSoftware
 

Recently uploaded (11)

PDF
MahiroYoshida_セリフに着目したキャラクタロール推定に関する基礎検討_sigcc12th2025
Matsushita Laboratory
 
PDF
TaketoFujikawa_ComicComputing12th_inKumamoto
Matsushita Laboratory
 
PDF
LoRaWAN ウェザーステーションキット v3 -WSC3-L 日本語ユーザーマニュアル
CRI Japan, Inc.
 
PPTX
2025_7_25_吉祥寺_設計ナイト_ADR運用におけるデータ利活用の考え方.pptx
ssuserfcafd1
 
PPTX
baserCMS『カスタムコンテンツ』徹底活用術〜あなただけの管理画面を自由自在に〜
Ryuji Egashira
 
PDF
【学会聴講報告】CVPR2025からみるVision最先端トレンド / CVPR2025 report
Sony - Neural Network Libraries
 
PDF
20250726_Devinで変えるエンプラシステム開発の未来
Masaki Yamakawa
 
PDF
第三世代 ウェザーステーションキット v3 ー WSC3-L 日本語カタログ
CRI Japan, Inc.
 
PDF
VMUG Japan book vsan 20250515 CPU/Memory vSAN
Kazuhiro Sota
 
PDF
20250729_Devin-for-Enterprise
Masaki Yamakawa
 
PDF
20250730_QiitaBash_LT登壇資料_PDC_Kurashina.pdf
pdckurashina
 
MahiroYoshida_セリフに着目したキャラクタロール推定に関する基礎検討_sigcc12th2025
Matsushita Laboratory
 
TaketoFujikawa_ComicComputing12th_inKumamoto
Matsushita Laboratory
 
LoRaWAN ウェザーステーションキット v3 -WSC3-L 日本語ユーザーマニュアル
CRI Japan, Inc.
 
2025_7_25_吉祥寺_設計ナイト_ADR運用におけるデータ利活用の考え方.pptx
ssuserfcafd1
 
baserCMS『カスタムコンテンツ』徹底活用術〜あなただけの管理画面を自由自在に〜
Ryuji Egashira
 
【学会聴講報告】CVPR2025からみるVision最先端トレンド / CVPR2025 report
Sony - Neural Network Libraries
 
20250726_Devinで変えるエンプラシステム開発の未来
Masaki Yamakawa
 
第三世代 ウェザーステーションキット v3 ー WSC3-L 日本語カタログ
CRI Japan, Inc.
 
VMUG Japan book vsan 20250515 CPU/Memory vSAN
Kazuhiro Sota
 
20250729_Devin-for-Enterprise
Masaki Yamakawa
 
20250730_QiitaBash_LT登壇資料_PDC_Kurashina.pdf
pdckurashina
 

JEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_ccc