オブジェクトのインライン化 (スタックへの割当て)
オブジェクトをスタック上の変数で実現してしまう最適化:
class Hoge {
val value: int
}
val hoge = new Hoge(123);
↓ スタック割付け最適化
val hoge
のvalue: int = 123; // hoge.value
の読み書きはこれを使う
リスト等のイテレーターの最適化 等で無意識にかなりの恩恵を受けている。
11
⼊れ⼦オブジェクトのインライン化 (Scalar replacement)
同様に、オブジェクトの中のオブジェクトを展開する最適化もある:
class SomethingId {
val raw: int
}
class MyObject {
private val id: SomethingId
}
↓ インライン化
class MyObject {
private val id
のraw: int // SomethingId#raw
の読み書きはこれを使う
}
Value object (プリミティブ型のラッパー)やタプル的な型( RGB
や Vector2D
など)で恩恵を
受けていることがあったりする。 13
ラムダ式のクロージャーに起因するキャプチャー
function something() {
val x = 123;
function lambda() {
x = 456;
}
}
ラムダ式は外側の変数を読み書きする事ができる (モダンな⾔語なら)。
上記の例における x
変数は something
関数のローカル変数だが、
もし lambda
インスタンスが escape するならば、 x
も something
関数のスコープを超
えて参照される (キャプチャー)。なので x
がメモリ上に配置される。
escape しないと断定できると、変数をスタック上に置いたままにできるのでかなり⾼速にな
る。
17