From d5726e9939b51fce1c5533d73975d59a8b9f7fe1 Mon Sep 17 00:00:00 2001 From: nsfisis Date: Fri, 12 Apr 2024 03:29:33 +0900 Subject: update slides --- slide.saty | 131 +++++++++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 92 insertions(+), 39 deletions(-) (limited to 'slide.saty') diff --git a/slide.saty b/slide.saty index 0b579ea..c22ae8a 100644 --- a/slide.saty +++ b/slide.saty @@ -14,6 +14,10 @@ let mid-textbox ?:size-opt it = let size = Option.from 24pt size-opt in FigBox.textbox?:(set-font-size size) it +let with-frame figbox = figbox + |> FigBox.hvmargin 16pt + |> FigBox.frame 2pt Color.black + open FigBox in @@ -52,29 +56,59 @@ document '< +frame{普通の PHP プログラム}< +fig-center(vconcat [ gap 75pt; - big-textbox{PHP スクリプト}; + mid-textbox{PHP スクリプト} |> with-frame; gap 30pt; - big-textbox{opcode (VM で実行)}; + mid-textbox{opcode (VM で実行)} |> with-frame; + ]); + > + + +frame{普通の PHP プログラム}< + +fig-center(vconcat [ + gap 75pt; + mid-textbox{PHP スクリプト} |> with-frame; + gap 30pt; + mid-textbox{opcode (VM で実行)} |> with-frame; + gap 50pt; + textbox{もっと速くしたい}; + ]); + > + + +frame{普通の PHP プログラム}< + +fig-center(vconcat [ + gap 75pt; + mid-textbox{PHP スクリプト} |> with-frame; + gap 30pt; + mid-textbox{opcode (VM で実行)} |> with-frame; + gap 50pt; + textbox{もっと速くしたい}; + gap 20pt; + textbox{機械語にして CPU で動かす}; ]); > +frame{JIT コンパイルとは}< +listing{ - * Just In Time (ちょうど間に合って) - * 広義: 実行時にコンパイルする - * 狭義: 実行時に機械語へコンパイルする + * Just In Time: ちょうど間に合って + * 実行時に機械語へコンパイルする * PHP 8.0 で導入 + * 他言語での事例 + ** LuaJIT + ** V8 TurboFan、Sparkplug、Maglev + ** CRuby MJIT、YJIT、RJIT + ** HotSpotVM + ** GraalVM + ** など } > +frame{PHP \+ JIT コンパイル}< +fig-center(vconcat [ gap 75pt; - big-textbox{PHP スクリプト}; + mid-textbox{PHP スクリプト} |> with-frame; gap 30pt; - big-textbox{opcode (VM で実行)}; + mid-textbox{opcode (VM で実行)} |> with-frame; gap 30pt; - big-textbox{機械語 (CPU で実行)}; + mid-textbox{機械語 (CPU で実行)} |> with-frame; ]); > @@ -85,7 +119,7 @@ document '< ** コンパイルすればするほど速くなるわけではない * すべての情報が事前に確定しない ** 動的言語。変数が未定義かも、型が想定と違うかも - ** \code(`$a`); + \code(`$b`); が常に int と int の足し算とは限らない + ** \code(`$a`); + \code(`$b`); が常に \code(`int`); と \code(`int`); の足し算とは限らない } > @@ -105,32 +139,51 @@ document '< * コンパイルに時間を割けない ** 繰り返し実行される箇所だけコンパイルする ** これまで何度も実行されたのだから、これからも何度も実行されるはず + ** 関数 \code(`f()`); が 1000 回、関数 \code(`g()`); が 1回実行されたなら、\code(`f()`); だけコンパイルする * すべての情報が事前に確定しない ** 実際の実行パターンを元に、そのケースに最適化させた機械語を生成する - ** \code(`$a`); + \code(`$b`); が int と int だったときに限定した機械語を生成し、 + ** \code(`$a`); + \code(`$b`); が \code(`int`); と \code(`int`); だったときに限定した機械語を生成し、 想定と違っていれば従来の opcode を VM で動かす + ** \code(`int`); と \code(`int`); の組み合わせで 1000回、\code(`null`); と \code(`null`); の組み合わせで 1回実行されたなら、\code(`int`); と \code(`int`); に合わせてコンパイルする } > +frame{PHP 8.4 での変更}< + +p{} +p{ PHP 8.4 では、JIT コンパイルの仕組みに大きな変更が入る } > +frame{PHP 8.4 での変更}< + +p{} + +p{ + PHP 8.4 では、JIT コンパイルの仕組みに大きな変更が入る + } +p{ IR (Intermediate Representation、中間表現) の導入 } + > + + +frame{普通の PHP プログラム}< + +fig-center(vconcat [ + gap 75pt; + mid-textbox{PHP スクリプト} |> with-frame; + gap 30pt; + mid-textbox{opcode (VM で実行)} |> with-frame; + ]); + > + + +frame{PHP 8.4 での変更}< +fig-center(vconcat [ gap 40pt; - mid-textbox{PHP スクリプト}; + mid-textbox{PHP スクリプト} |> with-frame; gap 30pt; - mid-textbox{opcode (VM で実行)}; + mid-textbox{opcode (VM で実行)} |> with-frame; gap 30pt; - mid-textbox{IR (中間表現)}; + mid-textbox{IR (中間表現)} |> with-frame; gap 30pt; - mid-textbox{機械語 (CPU で実行)}; + mid-textbox{機械語 (CPU で実行)} |> with-frame; ]); > @@ -139,8 +192,11 @@ document '< * opcode から直接の変換だと制限が大きい ** 最適化しづらい *** opcode の表現に制約を受ける + *** 抽象度が足りない + *** ソースコードをパースせずに実行するようなもの ** CPU アーキテクチャごとに別々の実装を抱える * PHP と密結合 + ** JIT と PHP 両方の知識が必要 ** 誰もメンテナンスできない } > @@ -148,49 +204,46 @@ document '< +frame{IR の特徴}< +listing{ * より強力な最適化 + ** 最適化しやすい表現に ** SSA \+ CFG から Sea-of-Nodes へ * PHP に依存しない } > - +frame{実際どうなった?}< - +p{ - TODO: ベンチマークのスクリーンショットを引用 - } - > - +frame{実際どうなった?}< +listing{ - * 生成された機械語の速度: 0-5 % 向上 - * Tracing JIT のコンパイルにかかる時間: ほぼ同等 - * Function JIT のコンパイルにかかる時間: 4倍ほど遅い + * 性能 + * 生成された機械語の速度: 0-5 \% 向上 + * Tracing JIT のコンパイルにかかる時間: ほぼ同等 + * メンテナンス性 + * \code(`ext/opcache/jit`); の変更量 + ** 5.9万行追加、4.9万行削除 + * アーキテクチャごとのコード生成部 + ** x86: 1.1万行追加、1.6万行削除 + ** arm64: 0.65万行追加、1.1万行削除 } > - +frame{実際どうなった?}< - +p{ - 8.3.4 と master を比較 - } - +listing{ - * \code(`ext/opcache/jit`); の変更量 - ** 5.9万行追加、4.9万行削除 - * アーキテクチャごとのコード生成部 - ** x86: 1.1万行追加、1.6万行削除 - ** arm64: 0.65万行追加、1.1万行削除 - } + +frame{知った気になるまとめ}< > - +frame{知った気になる}< + +frame{知った気になるまとめ}< + +fig-center(vconcat [ + gap 60pt; + big-textbox{8.4 で変わる JIT}; + ]); > - +frame{知った気になる}< + +frame{知った気になるまとめ}< +fig-center(vconcat [ gap 60pt; big-textbox{8.4 で変わる JIT}; - gap 30pt; - mid-textbox{opcode と機械語の間に中間表現 (IR) が導入され、}; + ]); + +fig-center(vconcat [ + gap 40pt; + mid-textbox{opcode から直接機械語を生成するのではなく、}; gap 10pt; - mid-textbox{より最適化がかけられるように}; + mid-textbox{中間表現 (IR) を挟むようになった}; ]); > -- cgit v1.2.3-70-g09d2