2018年5月17日(木)に開催されたJava Day Tokyo 2018に行ってきました。 基調講演は途中から参加で、用事があった夕方頃までセッションを聞きました。
で、気になった点をメモ書き。パート2。
[JSE-2] Project Valhalla
以下の2点の話し。
Project Valhallaには「VarHandles」があるけど、今回は対象外。
JJUG CCC 2018 Spring で話す予定。
プロジェクト名の由来
「Valhalla == Value Types」が似ているから、だそうですw
オブジェクトとプリミティブ
オブジェクト
- ヒープで格納される
- ヘッダがある
- ポインタ参照
- ミュータブル
- Monitor がある
プリミティブ
- どこでも格納できる
- ヘッダがない
- 値を直接渡す
- イミュータブル
- Monitor がない
オブジェクトの配列の場合、
配列の要素の中にヘッダを含めたオブジェクトが格納される。
オブジェクト ⇨ 参照の利用 ⇨キャッシュ・参照のミス ⇨ パフォーマンスの問題。
これは非効率。
そこで、Value Types。
Value Types
Value Typeの特徴として、 プリミティブと違ってクラスのような構成を持ち、 プリミティブのパフォーマンスを出す。
また、「だいたいint
のような動きをするだろう」みたいな、
大雑把なルールで動く。
オブジェクトとプリミティブの要素を持つ感じ。
ジェネリクスの特殊化 (Generic Specialization)
Value Typesがオブジェクトの要素を持つとなると、ジェネリクスはどうなるのか?
構想としてはValue Typesをジェネリクスでも使えるようにしたい。
ArrayList<int>
みたいなことをやりたい!
java.util.stream.IntStream
java.util.stream.FloatStream
- etc・・・
作る方もツライ!
Customer<T>
、ToIntFunction<T>
は作りにくいよう。
ジェネリクスの問題として、プリミティブの親クラスって何?
これはまだ解決していない。
最後に
Project Valhalla の目的としてパフォーマンス改善が挙げられるが、 それだけではなく、使いやすくなることも目的がある。