aboutsummaryrefslogtreecommitdiffhomepage
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
parent507e19f4e36f80f13355a758829c0235bad10531 (diff)
downloadphpcon-odawara-2024-slides-d5726e9939b51fce1c5533d73975d59a8b9f7fe1.tar.gz
phpcon-odawara-2024-slides-d5726e9939b51fce1c5533d73975d59a8b9f7fe1.tar.zst
phpcon-odawara-2024-slides-d5726e9939b51fce1c5533d73975d59a8b9f7fe1.zip
update slides
-rw-r--r--README.md19
-rw-r--r--slide.pdfbin98490 -> 106254 bytes
-rw-r--r--slide.saty131
3 files changed, 111 insertions, 39 deletions
diff --git a/README.md b/README.md
index 769cf8b..962bff1 100644
--- a/README.md
+++ b/README.md
@@ -1 +1,20 @@
https://fortee.jp/phpconodawara-2024/proposal/bc9669f6-6583-489c-aa6a-1b68abf7c291
+
+
+
+# 参考資料
+
+* https://wiki.php.net/rfc/jit
+* https://wiki.php.net/rfc/jit-ir
+* https://github.com/php/php-src/pull/3792
+* https://github.com/php/php-src/commit/9a06876072b9ccb023d4a14426ccb587f10882f3
+* https://github.com/dstogov/ir
+* https://www.researchgate.net/publication/374470404_IR_JIT_Framework_a_base_for_the_next_generation_JIT_for_PHP
+* https://www.npopov.com/2017/04/14/PHP-7-Virtual-machine.html
+* https://www.npopov.com/2021/10/13/How-opcache-works.html
+* https://www.npopov.com/2022/05/22/The-opcache-optimizer.html
+* https://phpinternals.net/articles/implementing_a_range_operator_into_php#updating-the-compilation-stage
+* https://darksi.de/d.sea-of-nodes/
+* https://github.com/SeaOfNodes/Simple
+* https://luajit.org/dynasm.html
+* https://corsix.github.io/dynasm-doc/
diff --git a/slide.pdf b/slide.pdf
index 33c1826..a7300b0 100644
--- a/slide.pdf
+++ b/slide.pdf
Binary files differ
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) を挟むようになった};
]);
>