aboutsummaryrefslogtreecommitdiffhomepage
path: root/slide.saty
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2024-04-12 03:29:33 +0900
committernsfisis <nsfisis@gmail.com>2024-04-12 03:29:33 +0900
commitd5726e9939b51fce1c5533d73975d59a8b9f7fe1 (patch)
treec46f55ed474eeef631ebba2ec33c67dc4350b01e /slide.saty
parent507e19f4e36f80f13355a758829c0235bad10531 (diff)
downloadphpcon-odawara-2024-slides-d5726e9939b51fce1c5533d73975d59a8b9f7fe1.tar.gz
phpcon-odawara-2024-slides-d5726e9939b51fce1c5533d73975d59a8b9f7fe1.tar.zst
phpcon-odawara-2024-slides-d5726e9939b51fce1c5533d73975d59a8b9f7fe1.zip
update slides
Diffstat (limited to 'slide.saty')
-rw-r--r--slide.saty131
1 files changed, 92 insertions, 39 deletions
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) を挟むようになった};
]);
>