Meetup #55
1. case 式の最適化
https://github.com/sisshiki1969/monoruby/pull/25
code:Ruby
case a
when 0 then 10
when 1, 2 then 20
else "それ以外"
end
case 式のセマンティクス
code:Ruby
_cond = a
if 0 === _cond
10
elsif 1 === _cond || 2 === _cond
20
else
"それ以外"
end
when 節の条件式の全てが整数リテラルだった場合、全ての === 演算を一つのテーブルジャンプに変換することで高速するバイトコード命令 BcIr::OptCaseを導入
JITコード生成
ベンチマーク
2. ジャンプテーブル生成のためにmonoasmに機能追加
テーブルを生成する時点では各when節に対応するJITコードのアドレスが確定していない
テーブル生成時には一時的なラベルを入れておき、最後に実アドレスに解決する
monoasmのコード生成
3. optcarrotベンチマーク
code:txt
ruby 3.3.0dev (2023-11-12 master 60e19a0b5f) x86_64-linux
fps: 33.21387005513675
checksum: 59662
fps: 136.87378364324678
checksum: 59662
ruby 3.3.0dev (2023-11-12 master 60e19a0b5f) +YJIT x86_64-linux
fps: 128.5410928541599
checksum: 59662
fps: 144.76967201860384
checksum: 59662
monoruby 0.2.0
fps: 32.56933242806056
checksum: 59662
fps: 168.4222061645558
checksum: 59662
with --opt
fps: 129.46837809560575
checksum: 59662
fps: 463.4967232481382
checksum: 59662
| | 3.3.0dev| 3.3.0 --yjit| monoruby| monoruby --no-jit|
|:--------------------|----------:|------------:|-----------:|-----------------:|
|optcarrot | 33.2 | 128.5 | 168.4 | 32.6 |
|optcarrot --opt | 136.9 | 144.8 | 463.5 | 168.4 |