aboutsummaryrefslogtreecommitdiffhomepage
path: root/slide.saty
diff options
context:
space:
mode:
Diffstat (limited to 'slide.saty')
-rw-r--r--slide.saty170
1 files changed, 118 insertions, 52 deletions
diff --git a/slide.saty b/slide.saty
index c22ae8a..c04ac9f 100644
--- a/slide.saty
+++ b/slide.saty
@@ -40,13 +40,16 @@ document '<
+frame{自己紹介}<
+fig-center(vconcat [
- gap 75pt;
- hconcat [
- big-textbox{nsfisis (いまむら)};
- gap 20pt;
- include-image 50pt `assets/me.jpeg`;
- ];
- gap 20pt;
+ gap 30pt;
+ big-textbox{いまむら};
+ ]);
+ +fig-center(vconcat [
+ ex-big-textbox{nsfisis};
+ ]);
+ +fig-center(vconcat [
+ include-image 128pt `assets/me.jpeg`;
+ ]);
+ +fig-center(vconcat [
big-textbox{\@ デジタルサーカス株式会社};
]);
>
@@ -55,34 +58,33 @@ document '<
+frame{普通の PHP プログラム}<
+fig-center(vconcat [
- gap 75pt;
+ gap 30pt;
mid-textbox{PHP スクリプト} |> with-frame;
gap 30pt;
- mid-textbox{opcode (VM で実行)} |> with-frame;
+ hconcat [
+ mid-textbox{opcode} |> with-frame;
+ gap 20pt;
+ textbox{VM で実行} |> hvmargin 18pt;
+ ];
]);
>
+frame{普通の PHP プログラム}<
+fig-center(vconcat [
- gap 75pt;
+ gap 30pt;
mid-textbox{PHP スクリプト} |> with-frame;
gap 30pt;
- mid-textbox{opcode (VM で実行)} |> with-frame;
- gap 50pt;
- textbox{もっと速くしたい};
+ hconcat [
+ mid-textbox{opcode} |> with-frame;
+ gap 20pt;
+ textbox{VM で実行} |> hvmargin 18pt;
+ ];
]);
- >
-
- +frame{普通の PHP プログラム}<
+fig-center(vconcat [
- gap 75pt;
- mid-textbox{PHP スクリプト} |> with-frame;
- gap 30pt;
- mid-textbox{opcode (VM で実行)} |> with-frame;
- gap 50pt;
- textbox{もっと速くしたい};
+ gap 40pt;
+ mid-textbox{もっと速くしたい};
gap 20pt;
- textbox{機械語にして CPU で動かす};
+ mid-textbox{機械語にして CPU で動かす};
]);
>
@@ -101,14 +103,35 @@ document '<
}
>
+ +frame{普通の PHP プログラム}<
+ +fig-center(vconcat [
+ gap 30pt;
+ mid-textbox{PHP スクリプト} |> with-frame;
+ gap 30pt;
+ hconcat [
+ mid-textbox{opcode} |> with-frame;
+ gap 20pt;
+ textbox{VM で実行} |> hvmargin 18pt;
+ ];
+ ]);
+ >
+
+frame{PHP \+ JIT コンパイル}<
+fig-center(vconcat [
- gap 75pt;
+ gap 30pt;
mid-textbox{PHP スクリプト} |> with-frame;
gap 30pt;
- mid-textbox{opcode (VM で実行)} |> with-frame;
+ hconcat [
+ mid-textbox{opcode} |> with-frame;
+ gap 20pt;
+ textbox{VM で実行} |> hvmargin 18pt;
+ ];
gap 30pt;
- mid-textbox{機械語 (CPU で実行)} |> with-frame;
+ hconcat [
+ mid-textbox{機械語} |> with-frame;
+ gap 20pt;
+ textbox{CPU で実行} |> hvmargin 18pt;
+ ];
]);
>
@@ -125,12 +148,13 @@ document '<
+frame{Tracing JIT}<
+p{
- 何度も繰り返し実行される部分、何度も通る分岐などを特定し、
- そこだけピンポイントで JIT コンパイルする
+ コンパイルする前に実際に実行してみて、
+ 何度も繰り返し実行される部分・何度も通る分岐などを特定し、
+ そこだけピンポイントでコンパイルする
}
+p{}
+p{
- INI で \code(`opcache.jit=tracing`); (デフォルト) にするとこのモードになる
+ INI で \code(`opcache.jit=tracing`); にするとこのモードになる (デフォルトの挙動)
}
>
@@ -165,36 +189,54 @@ document '<
}
>
- +frame{普通の PHP プログラム}<
+ +frame{PHP 8.3 まで}<
+fig-center(vconcat [
- gap 75pt;
+ gap 20pt;
mid-textbox{PHP スクリプト} |> with-frame;
- gap 30pt;
- mid-textbox{opcode (VM で実行)} |> with-frame;
+ gap 20pt;
+ hconcat [
+ mid-textbox{opcode} |> with-frame;
+ gap 20pt;
+ textbox{VM で実行} |> hvmargin 18pt;
+ ];
+ gap 20pt;
+ hconcat [
+ mid-textbox{機械語} |> with-frame;
+ gap 20pt;
+ textbox{CPU で実行} |> hvmargin 18pt;
+ ];
]);
>
+frame{PHP 8.4 での変更}<
+fig-center(vconcat [
- gap 40pt;
+ gap 20pt;
mid-textbox{PHP スクリプト} |> with-frame;
- gap 30pt;
- mid-textbox{opcode (VM で実行)} |> with-frame;
- gap 30pt;
+ gap 20pt;
+ hconcat [
+ mid-textbox{opcode} |> with-frame;
+ gap 20pt;
+ textbox{VM で実行} |> hvmargin 18pt;
+ ];
+ gap 20pt;
mid-textbox{IR (中間表現)} |> with-frame;
- gap 30pt;
- mid-textbox{機械語 (CPU で実行)} |> with-frame;
+ gap 20pt;
+ hconcat [
+ mid-textbox{機械語} |> with-frame;
+ gap 20pt;
+ textbox{CPU で実行} |> hvmargin 18pt;
+ ];
]);
>
+frame{IR 導入のモチベーション}<
+listing{
- * opcode から直接の変換だと制限が大きい
- ** 最適化しづらい
- *** opcode の表現に制約を受ける
- *** 抽象度が足りない
- *** ソースコードをパースせずに実行するようなもの
- ** CPU アーキテクチャごとに別々の実装を抱える
+ * opcode から直接機械語に変換では最適化しづらい
+ ** opcode の表現に制約を受ける
+ ** 抽象度が足りない
+ ** ソースコードをパースせずに実行するようなもの
+ * CPU アーキテクチャごとに別々の実装を抱える
+ ** 2 アーキテクチャで計 2.7 万行
* PHP と密結合
** JIT と PHP 両方の知識が必要
** 誰もメンテナンスできない
@@ -213,14 +255,14 @@ document '<
+frame{実際どうなった?}<
+listing{
* 性能
- * 生成された機械語の速度: 0-5 \% 向上
- * Tracing JIT のコンパイルにかかる時間: ほぼ同等
+ ** 生成された機械語の速度: 0-5 \% 向上
+ ** Tracing JIT のコンパイルにかかる時間: ほぼ同等
* メンテナンス性
- * \code(`ext/opcache/jit`); の変更量
- ** 5.9万行追加、4.9万行削除
- * アーキテクチャごとのコード生成部
- ** x86: 1.1万行追加、1.6万行削除
- ** arm64: 0.65万行追加、1.1万行削除
+ ** \code(`ext/opcache/jit`); の変更量
+ *** 5.9万行追加、4.9万行削除
+ ** アーキテクチャごとのコード生成部
+ *** x86: 1.1万行追加、1.6万行削除
+ *** arm64: 0.65万行追加、1.1万行削除
}
>
@@ -247,4 +289,28 @@ document '<
]);
>
+ +frame{参考資料1}<
+ +listing{
+ * \link?:({PHP RFC: JIT})(`https://wiki.php.net/rfc/jit`);
+ * \link?:({PHP RFC: A new JIT implementation based on IR Framework})(`https://wiki.php.net/rfc/jit-ir`);
+ * \link?:({GitHub php/php-src: JIT for PHP based on DynAsm})(`https://github.com/php/php-src/pull/3792`);
+ * \link?:({GitHub php/php-src: Added JIT compiler for x86 and x86_64})(`https://github.com/php/php-src/commit/9a06876072b9ccb023d4a14426ccb587f10882f3`);
+ * \link?:({GitHub dstogov/ir})(`https://github.com/dstogov/ir`);
+ * \link?:({Slides by the author of PHP JIT and its IR})(`https://www.researchgate.net/publication/374470404_IR_JIT_Framework_a_base_for_the_next_generation_JIT_for_PHP`);
+ * \link?:({Nikic blog: PHP-7-Virtual-machine})(`https://www.npopov.com/2017/04/14/PHP-7-Virtual-machine.html`);
+ * \link?:({Nikic blog: How-opcache-works})(`https://www.npopov.com/2021/10/13/How-opcache-works.html`);
+ * \link?:({Nikic blog: The-opcache-optimizer})(`https://www.npopov.com/2022/05/22/The-opcache-optimizer.html`);
+ * \link?:({PHP Internals: Implementing a Range Operator into PHP})(`https://phpinternals.net/articles/implementing_a_range_operator_into_php#updating-the-compilation-stage`);
+ }
+ >
+
+ +frame{参考資料2}<
+ +listing{
+ * \link?:({Fedor Indutny's Blog: Sea of Nodes})(`https://darksi.de/d.sea-of-nodes/`);
+ * \link?:({GitHub SeaOfNodes/Simple})(`https://github.com/SeaOfNodes/Simple`);
+ * \link?:({LuaJIT DynAsm})(`https://luajit.org/dynasm.html`);
+ * \link?:({The Unofficial DynASM Documentation})(`https://corsix.github.io/dynasm-doc/`);
+ }
+ >
+
>