SlideShare a Scribd company logo
1 of 55
Download to read offline
OPcache の最適化器の今
内山 雄司 (@y__uti)
Japan PHP Conference 2017
自己紹介
内山 雄司 (@y__uti)
◦ http://y-uti.hatenablog.jp/ (phpusers-ja)
仕事
◦ 受託開発の会社 (株式会社ピコラボ) でプログラマをしています
興味
◦ プログラミング言語処理系
◦ 機械学習
2017-10-08 JAPAN PHP CONFERENCE 2017 2
ベンチマークテスト
0.0
0.5
1.0
1.5
2.0
2.5
3.0
5.5.38 5.6.31 7.0.24 7.1.10 7.2.0RC3
実行時間[秒]
PHP バージョン
Zend/bench.php の実行時間 (各 5 回の実行の平均)
OPcache 無効 OPcache 有効
2017-10-08 JAPAN PHP CONFERENCE 2017 3
Core i5-3337U
CentOS 7 (VM 上の Guest OS)
ベンチマークテスト
0.0
0.5
1.0
1.5
2.0
2.5
3.0
5.5.38 5.6.31 7.0.24 7.1.10 7.2.0RC3
実行時間[秒]
PHP バージョン
Zend/bench.php の実行時間 (各 5 回の実行の平均)
OPcache 無効 OPcache 有効
2017-10-08 JAPAN PHP CONFERENCE 2017 4
Core i5-3337U
CentOS 7 (VM 上の Guest OS)
PHP 7 で高速化
ベンチマークテスト
0.0
0.5
1.0
1.5
2.0
2.5
3.0
5.5.38 5.6.31 7.0.24 7.1.10 7.2.0RC3
実行時間[秒]
PHP バージョン
Zend/bench.php の実行時間 (各 5 回の実行の平均)
OPcache 無効 OPcache 有効
2017-10-08 JAPAN PHP CONFERENCE 2017 5
Core i5-3337U
CentOS 7 (VM 上の Guest OS)
OPcache 有効時
PHP 7.1 以降も速度向上
発表の流れ
ベンチマーク結果の紹介
PHP のプログラム実行と OPcache
OPcache の最適化器の変遷
◦ PHP 5.5 ~ 7.0
◦ PHP 7.1
◦ PHP 7.2
2017-10-08 JAPAN PHP CONFERENCE 2017 6
PHP プログラムの実行方式
バイトコードインタプリタ方式
2017-10-08 JAPAN PHP CONFERENCE 2017 7
PHP ファイルをコンパイルする
インタプリタで実行する
プログラム実行の様子
プログラムをバイトコード命令列にコンパイルして逐次実行
2017-10-08 JAPAN PHP CONFERENCE 2017 8
function test()
{
if (1 + 2 > 0) {
if (false) {
echo "A";
} else {
echo "B";
}
} else {
echo "C";
}
}
# op return operands
----------------------------------
0 ADD ~0 1, 2
1 IS_SMALLER ~1 0, ~0
2 JMPZ ~1, ->8
3 JMPZ <bool>, ->6
4 ECHO 'A'
5 JMP ->7
6 ECHO 'B'
7 JMP ->9
8 ECHO 'C'
9 RETURN null
 ソースコード  コンパイル結果
プログラム実行の様子
プログラムをバイトコード命令列にコンパイルして逐次実行
2017-10-08 JAPAN PHP CONFERENCE 2017 9
function test()
{
if (1 + 2 > 0) {
if (false) {
echo "A";
} else {
echo "B";
}
} else {
echo "C";
}
}
# op return operands
----------------------------------
0 ADD ~0 1, 2
1 IS_SMALLER ~1 0, ~0
2 JMPZ ~1, ->8
3 JMPZ <bool>, ->6
4 ECHO 'A'
5 JMP ->7
6 ECHO 'B'
7 JMP ->9
8 ECHO 'C'
9 RETURN null
 ソースコード  コンパイル結果
プログラム実行の様子
プログラムをバイトコード命令列にコンパイルして逐次実行
2017-10-08 JAPAN PHP CONFERENCE 2017 10
function test()
{
if (1 + 2 > 0) {
if (false) {
echo "A";
} else {
echo "B";
}
} else {
echo "C";
}
}
# op return operands
----------------------------------
0 ADD ~0 1, 2
1 IS_SMALLER ~1 0, ~0
2 JMPZ ~1, ->8
3 JMPZ <bool>, ->6
4 ECHO 'A'
5 JMP ->7
6 ECHO 'B'
7 JMP ->9
8 ECHO 'C'
9 RETURN null
 ソースコード  コンパイル結果
プログラム実行の様子
プログラムをバイトコード命令列にコンパイルして逐次実行
2017-10-08 JAPAN PHP CONFERENCE 2017 11
function test()
{
if (1 + 2 > 0) {
if (false) {
echo "A";
} else {
echo "B";
}
} else {
echo "C";
}
}
# op return operands
----------------------------------
0 ADD ~0 1, 2
1 IS_SMALLER ~1 0, ~0
2 JMPZ ~1, ->8
3 JMPZ <bool>, ->6
4 ECHO 'A'
5 JMP ->7
6 ECHO 'B'
7 JMP ->9
8 ECHO 'C'
9 RETURN null
 ソースコード  コンパイル結果
プログラム実行の様子
プログラムをバイトコード命令列にコンパイルして逐次実行
2017-10-08 JAPAN PHP CONFERENCE 2017 12
function test()
{
if (1 + 2 > 0) {
if (false) {
echo "A";
} else {
echo "B";
}
} else {
echo "C";
}
}
# op return operands
----------------------------------
0 ADD ~0 1, 2
1 IS_SMALLER ~1 0, ~0
2 JMPZ ~1, ->8
3 JMPZ <bool>, ->6
4 ECHO 'A'
5 JMP ->7
6 ECHO 'B'
7 JMP ->9
8 ECHO 'C'
9 RETURN null
 ソースコード  コンパイル結果
プログラム実行の様子
プログラムをバイトコード命令列にコンパイルして逐次実行
2017-10-08 JAPAN PHP CONFERENCE 2017 13
function test()
{
if (1 + 2 > 0) {
if (false) {
echo "A";
} else {
echo "B";
}
} else {
echo "C";
}
}
# op return operands
----------------------------------
0 ADD ~0 1, 2
1 IS_SMALLER ~1 0, ~0
2 JMPZ ~1, ->8
3 JMPZ <bool>, ->6
4 ECHO 'A'
5 JMP ->7
6 ECHO 'B'
7 JMP ->9
8 ECHO 'C'
9 RETURN null
 ソースコード  コンパイル結果
プログラム実行の様子
プログラムをバイトコード命令列にコンパイルして逐次実行
2017-10-08 JAPAN PHP CONFERENCE 2017 14
function test()
{
if (1 + 2 > 0) {
if (false) {
echo "A";
} else {
echo "B";
}
} else {
echo "C";
}
}
# op return operands
----------------------------------
0 ADD ~0 1, 2
1 IS_SMALLER ~1 0, ~0
2 JMPZ ~1, ->8
3 JMPZ <bool>, ->6
4 ECHO 'A'
5 JMP ->7
6 ECHO 'B'
7 JMP ->9
8 ECHO 'C'
9 RETURN null
 ソースコード  コンパイル結果
プログラム実行の様子
プログラムをバイトコード命令列にコンパイルして逐次実行
2017-10-08 JAPAN PHP CONFERENCE 2017 15
function test()
{
if (1 + 2 > 0) {
if (false) {
echo "A";
} else {
echo "B";
}
} else {
echo "C";
}
}
# op return operands
----------------------------------
0 ADD ~0 1, 2
1 IS_SMALLER ~1 0, ~0
2 JMPZ ~1, ->8
3 JMPZ <bool>, ->6
4 ECHO 'A'
5 JMP ->7
6 ECHO 'B'
7 JMP ->9
8 ECHO 'C'
9 RETURN null
 ソースコード  コンパイル結果
OPcache の役割
バイトコード命令をキャッシュして再利用
2017-10-08 JAPAN PHP CONFERENCE 2017 16
バイトコードをキャッシュする
PHP ファイルをコンパイルする
キャッシュから
バイトコードを取得する
キャッシュ済み?
インタプリタで実行する
NO YES
OPcache の役割
バイトコード命令を最適化する
2017-10-08 JAPAN PHP CONFERENCE 2017 17
キャッシュから
バイトコードを取得する
キャッシュ済み?
インタプリタで実行する
NO YES
バイトコードを最適化する
バイトコードをキャッシュする
PHP ファイルをコンパイルする
発表の流れ
ベンチマーク結果の紹介
PHP のプログラム実行と OPcache
OPcache の最適化器の変遷
◦ PHP 5.5 ~ 7.0
◦ PHP 7.1
◦ PHP 7.2
2017-10-08 JAPAN PHP CONFERENCE 2017 18
PHP 5.5 の最適化器
2017-10-08 JAPAN PHP CONFERENCE 2017 19
PASS 3
連続するジャンプの短絡など
PASS 10
NOP 命令の除去
PASS 9
一時変数のメモリ領域共有
PASS 5
制御フローグラフを用いた最適化
PASS 2
条件分岐の置き換えなど
PASS 1
定数式の置き換えなど
素朴な最適化の例
出発点:最適化を行わない場合
2017-10-08 JAPAN PHP CONFERENCE 2017 20
function test()
{
if (1 + 2 > 0) {
if (false) {
echo "A";
} else {
echo "B";
}
} else {
echo "C";
}
}
# op return operands
----------------------------------
0 ADD ~0 1, 2
1 IS_SMALLER ~1 0, ~0
2 JMPZ ~1, ->8
3 JMPZ <bool>, ->6
4 ECHO 'A'
5 JMP ->7
6 ECHO 'B'
7 JMP ->9
8 ECHO 'C'
9 RETURN null
 ソースコード  コンパイル結果
PASS 1 定数式の置き換え
1 + 2 > 0 は true だと分かるので・・・
2017-10-08 JAPAN PHP CONFERENCE 2017 21
function test()
{
if (1 + 2 > 0) {
if (false) {
echo "A";
} else {
echo "B";
}
} else {
echo "C";
}
}
# op return operands
----------------------------------
0 ADD ~0 1, 2
1 IS_SMALLER ~1 0, ~0
2 JMPZ ~1, ->8
3 JMPZ <bool>, ->6
4 ECHO 'A'
5 JMP ->7
6 ECHO 'B'
7 JMP ->9
8 ECHO 'C'
9 RETURN null
 ソースコード  コンパイル結果
PASS 1 定数式の置き換え
コンパイル時に計算してしまう
2017-10-08 JAPAN PHP CONFERENCE 2017 22
function test()
{
if (1 + 2 > 0) {
if (false) {
echo "A";
} else {
echo "B";
}
} else {
echo "C";
}
}
# op return operands
----------------------------------
0 NOP
1 NOP
2 JMPZ <bool>, ->8
3 JMPZ <bool>, ->6
4 ECHO 'A'
5 JMP ->7
6 ECHO 'B'
7 JMP ->9
8 ECHO 'C'
9 RETURN null
 ソースコード  コンパイル結果
PASS 2 条件分岐の置き換え
if 文の true/false はコンパイル時に決まっているので・・・
2017-10-08 JAPAN PHP CONFERENCE 2017 23
function test()
{
if (1 + 2 > 0) {
if (false) {
echo "A";
} else {
echo "B";
}
} else {
echo "C";
}
}
# op return operands
----------------------------------
0 NOP
1 NOP
2 JMPZ <bool>, ->8
3 JMPZ <bool>, ->6
4 ECHO 'A'
5 JMP ->7
6 ECHO 'B'
7 JMP ->9
8 ECHO 'C'
9 RETURN null
 ソースコード  コンパイル結果
PASS 2 条件分岐の置き換え
NOP (飛ばない場合) か JMP (飛ぶ場合) に置き換える
2017-10-08 JAPAN PHP CONFERENCE 2017 24
function test()
{
if (1 + 2 > 0) {
if (false) {
echo "A";
} else {
echo "B";
}
} else {
echo "C";
}
}
# op return operands
----------------------------------
0 NOP
1 NOP
2 NOP
3 JMP ->6
4 ECHO 'A'
5 JMP ->7
6 ECHO 'B'
7 JMP ->9
8 ECHO 'C'
9 RETURN null
 ソースコード  コンパイル結果
PASS 3 連続ジャンプの短絡
JMP 命令の飛び先も JMP 命令なので・・・
2017-10-08 JAPAN PHP CONFERENCE 2017 25
function test()
{
if (1 + 2 > 0) {
if (false) {
echo "A";
} else {
echo "B";
}
} else {
echo "C";
}
}
# op return operands
----------------------------------
0 NOP
1 NOP
2 NOP
3 JMP ->6
4 ECHO 'A'
5 JMP ->7
6 ECHO 'B'
7 JMP ->9
8 ECHO 'C'
9 RETURN null
 ソースコード  コンパイル結果
PASS 3 連続ジャンプの短絡
最後の飛び先まで一気にジャンプする
2017-10-08 JAPAN PHP CONFERENCE 2017 26
function test()
{
if (1 + 2 > 0) {
if (false) {
echo "A";
} else {
echo "B";
}
} else {
echo "C";
}
}
# op return operands
----------------------------------
0 NOP
1 NOP
2 NOP
3 JMP ->6
4 ECHO 'A'
5 JMP ->9
6 ECHO 'B'
7 JMP ->9
8 ECHO 'C'
9 RETURN null
 ソースコード  コンパイル結果
PASS 10 NOP 命令の除去
NOP (何もしない命令) を実行しても何もしないのだから・・・
2017-10-08 JAPAN PHP CONFERENCE 2017 27
function test()
{
if (1 + 2 > 0) {
if (false) {
echo "A";
} else {
echo "B";
}
} else {
echo "C";
}
}
# op return operands
----------------------------------
0 NOP
1 NOP
2 NOP
3 JMP ->6
4 ECHO 'A'
5 JMP ->9
6 ECHO 'B'
7 JMP ->9
8 ECHO 'C'
9 RETURN null
 ソースコード  コンパイル結果
PASS 10 NOP 命令の除去
消す
2017-10-08 JAPAN PHP CONFERENCE 2017 28
function test()
{
if (1 + 2 > 0) {
if (false) {
echo "A";
} else {
echo "B";
}
} else {
echo "C";
}
}
# op return operands
----------------------------------
0 JMP ->3
1 ECHO 'A'
2 JMP ->6
3 ECHO 'B'
4 JMP ->6
5 ECHO 'C'
6 RETURN null
 ソースコード  コンパイル結果
PASS 5 制御フローグラフ
処理の流れをグラフ構造で表現して各種最適化を行う
2017-10-08 JAPAN PHP CONFERENCE 2017 29
function test()
{
if (1 + 2 > 0) {
if (false) {
echo "A";
} else {
echo "B";
}
} else {
echo "C";
}
}
0 ADD ~0 1, 2
1 IS_SMALLER ~1 0, ~0
2 JMPZ ~1, ->8
 ソースコード  制御フローグラフ
3 JMPZ <bool>, ->6
4 ECHO 'A'
5 JMP ->7
6 ECHO 'B'
7 JMP ->9
9 RETURN null
8 ECHO 'C'
PASS 5 制御フローグラフ
この例ではどこを通るか決まっているので・・・
2017-10-08 JAPAN PHP CONFERENCE 2017 30
function test()
{
if (1 + 2 > 0) {
if (false) {
echo "A";
} else {
echo "B";
}
} else {
echo "C";
}
}
0 ADD ~0 1, 2
1 IS_SMALLER ~1 0, ~0
2 JMPZ ~1, ->8
 ソースコード  制御フローグラフ
3 JMPZ <bool>, ->6
4 ECHO 'A'
5 JMP ->7
6 ECHO 'B'
7 JMP ->9
9 RETURN null
8 ECHO 'C'
PASS 5 制御フローグラフ
ここまで最適化される (PHP 5.5 の頃からこの程度はできていた)
2017-10-08 JAPAN PHP CONFERENCE 2017 31
function test()
{
if (1 + 2 > 0) {
if (false) {
echo "A";
} else {
echo "B";
}
} else {
echo "C";
}
}
# op return operands
----------------------------------
0 ECHO 'B'
1 RETURN null
 ソースコード  コンパイル結果
PHP 5.6 の最適化器
2017-10-08 JAPAN PHP CONFERENCE 2017 32
PASS 4
関数呼び出しの効率化
PASS 11
未使用リテラルの除去
PASS 9
PASS 5PASS 1
PASS 2
PASS 3 PASS 10
PHP 7.0 の最適化器
2017-10-08 JAPAN PHP CONFERENCE 2017 33
PASS 9
PASS 5PASS 1
PASS 2
PASS 3 PASS 10
PASS 4 PASS 11
PASS 12
関数スタックフレームの最適化
PHP 7.1 の最適化器
2017-10-08 JAPAN PHP CONFERENCE 2017 34
PASS 9
PASS 1
PASS 2
PASS 3 PASS 10
PASS 11
PASS 5
PASS 6
データフロー解析に基づく最適化
PASS 12
PASS 7
コールグラフの構築
PASS 4 (関数呼び出しの効率化)
→ PASS 16
関数のインライン化 (極めて限定的)
PASS 7 コールグラフ
関数間の呼び出し関係をグラフ構造で表現して各種最適化を行う
2017-10-08 JAPAN PHP CONFERENCE 2017 35
function test() {
return f();
}
function f() {
return x() + y();
}
function x() { ... }
function y() { ... }
 ソースコード  コールグラフ
f
test
x y
ただし現時点では解析結果を積極的には利用していない様子
PASS 6 データフロー解析
プログラムの各点でデータが取り得る型や値を解析する
2017-10-08 JAPAN PHP CONFERENCE 2017 36
function test()
{
$a = 1 + 2;
$b = $a + 3;
if ($b > 0) {
$a = 4;
} else {
$b = $a * 5.6;
}
return $a + $b;
}
 ソースコード  バイトコード命令列 (データフロー解析前)
0 ASSIGN !0, 3
1 ADD ~2 !0, 3
2 ASSIGN !1, ~2
3 IS_SMALLER ~2 0, !1
4 JMPZ ~2, ->7
5 ASSIGN !0, 4
6 JMP ->9
7 MUL ~2 !0, 5.6
8 ASSIGN !1, ~2
9 ADD ~2, !0, !1
10 RETURN ~2
PASS 6 データフロー解析
プログラムの各点でデータが取り得る型や値を解析する
2017-10-08 JAPAN PHP CONFERENCE 2017 37
function test()
{
$a = 1 + 2;
$b = $a + 3;
if ($b > 0) {
$a = 4;
} else {
$b = $a * 5.6;
}
return $a + $b;
}
 ソースコード  制御フローグラフ
9 ADD ~2, !0, !1
10 RETURN ~2
0 ASSIGN !0, 3
1 ADD ~2 !0, 3
2 ASSIGN !1, ~2
3 IS_SMALLER ~2 0, !1
4 JMPZ ~2, ->7
5 ASSIGN !0, 4
6 JMP ->9
7 MUL ~2 !0, 5.6
8 ASSIGN !1, ~2
PASS 6 データフロー解析
プログラムの各点でデータが取り得る型や値を解析する
2017-10-08 JAPAN PHP CONFERENCE 2017 38
function test()
{
$a = 1 + 2;
$b = $a + 3;
if ($b > 0) {
$a = 4;
} else {
$b = $a * 5.6;
}
return $a + $b;
}
 ソースコード  制御フローグラフ
return $a + $b;
$a = 3;
$b = $a + 3;
if ($b > 0)
$a = 4; $b = $a * 5.6;
PASS 6 データフロー解析
プログラムの各点でデータが取り得る型や値を解析する
2017-10-08 JAPAN PHP CONFERENCE 2017 39
function test()
{
$a = 1 + 2;
$b = $a + 3;
if ($b > 0) {
$a = 4;
} else {
$b = $a * 5.6;
}
return $a + $b;
}
 ソースコード  制御フローグラフ
return $a + $b;
$a = 3;
$b = $a + 3;
if ($b > 0)
$a = 4; $b = $a * 5.6;
PASS 6 データフロー解析
プログラムの各点でデータが取り得る型や値を解析する
2017-10-08 JAPAN PHP CONFERENCE 2017 40
function test()
{
$a = 1 + 2;
$b = $a + 3;
if ($b > 0) {
$a = 4;
} else {
$b = $a * 5.6;
}
return $a + $b;
}
 ソースコード  制御フローグラフ
return $a + $b;
$a = 3;
$b = $a + 3;
if ($b > 0)
$a = 4; $b = $a * 5.6;
PASS 6 データフロー解析
プログラムの各点でデータが取り得る型や値を解析する
2017-10-08 JAPAN PHP CONFERENCE 2017 41
function test()
{
$a = 1 + 2;
$b = $a + 3;
if ($b > 0) {
$a = 4;
} else {
$b = $a * 5.6;
}
return $a + $b;
}
 ソースコード  制御フローグラフ
$a <- $a or $a;
return $a + $b;
$a = 3;
$b = $a + 3;
if ($b > 0)
$a = 4; $b = $a * 5.6;
静的単一代入形式 (SSA) と呼ばれる
PASS 6 データフロー解析
プログラムの各点でデータが取り得る型や値を解析する
2017-10-08 JAPAN PHP CONFERENCE 2017 42
function test()
{
$a = 1 + 2;
$b = $a + 3;
if ($b > 0) {
$a = 4;
} else {
$b = $a * 5.6;
}
return $a + $b;
}
 ソースコード  制御フローグラフ
$a <- $a or $a;
$b <- $b or $b;
return $a + $b;
$a = 3;
$b = $a + 3;
if ($b > 0)
$a = 4; $b = $a * 5.6;
PASS 6 データフロー解析
プログラムの各点でデータが取り得る型や値を解析する
2017-10-08 JAPAN PHP CONFERENCE 2017 43
function test()
{
$a = 1 + 2;
$b = $a + 3;
if ($b > 0) {
$a = 4;
} else {
$b = $a * 5.6;
}
return $a + $b;
}
 ソースコード  制御フローグラフ
$a <- $a or $a; // [3, 4]: int
$b <- $b or $b; // ?: [int, float]
return $a + $b;
$a = 3; // 3: int
$b = $a + 3; // 6: int
if ($b > 0)
// 4: int
$a = 4;
// ?: float
$b = $a * 5.6;
解析結果の用途
型や値に応じた効率的なバイトコード命令への変換
2017-10-08 JAPAN PHP CONFERENCE 2017 44
function test():int
{
$a = 1;
$a = $a + 1;
return $a;
}
# op return operands
----------------------------------
0 ASSIGN !0, 1
1 ASSIGN_ADD !0, 1
2 VERIFY_RETURN_TYPE !0
3 RETURN !0
 ソースコード  コンパイル結果 (データフロー解析なし)
0 QM_ASSIGN !0 1
1 PRE_INC !0
2 RETURN !0
 コンパイル結果 (データフロー解析あり)
PHP 7.1 時点ではそれほど積極的な実装はされていない様子
解析結果の用途
型に特化したハンドラの選択
"ADD 命令" は大量にある (データの種類や型によって "適切な ADD" を選択)
2017-10-08 JAPAN PHP CONFERENCE 2017 45
ZEND_ADD_SPEC_CONST_CONST_HANDLER
ZEND_ADD_SPEC_CONST_TMPVAR_HANDLER
ZEND_ADD_SPEC_CONST_CV_HANDLER
ZEND_ADD_SPEC_TMPVAR_CONST_HANDLER
ZEND_ADD_SPEC_TMPVAR_TMPVAR_HANDLER
ZEND_ADD_SPEC_TMPVAR_CV_HANDLER
ZEND_ADD_SPEC_CV_CONST_HANDLER
ZEND_ADD_SPEC_CV_TMPVAR_HANDLER
ZEND_ADD_SPEC_CV_CV_HANDLER
ZEND_ADD_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV_HANDLER
ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV_HANDLER
ZEND_ADD_LONG_SPEC_CONST_TMPVARCV_HANDLER
ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV_HANDLER
ZEND_ADD_DOUBLE_SPEC_CONST_TMPVARCV_HANDLER
ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV_HANDLER
7.1 で追加
解析結果の用途
型に特化したハンドラの選択
"ADD 命令" は大量にある (データの種類や型によって "適切な ADD" を選択)
2017-10-08 JAPAN PHP CONFERENCE 2017 46
ZEND_ADD_SPEC_CONST_CONST_HANDLER
ZEND_ADD_SPEC_CONST_TMPVAR_HANDLER
ZEND_ADD_SPEC_CONST_CV_HANDLER
ZEND_ADD_SPEC_TMPVAR_CONST_HANDLER
ZEND_ADD_SPEC_TMPVAR_TMPVAR_HANDLER
ZEND_ADD_SPEC_TMPVAR_CV_HANDLER
ZEND_ADD_SPEC_CV_CONST_HANDLER
ZEND_ADD_SPEC_CV_TMPVAR_HANDLER
ZEND_ADD_SPEC_CV_CV_HANDLER
ZEND_ADD_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV_HANDLER
ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV_HANDLER
ZEND_ADD_LONG_SPEC_CONST_TMPVARCV_HANDLER
ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV_HANDLER
ZEND_ADD_DOUBLE_SPEC_CONST_TMPVARCV_HANDLER
ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV_HANDLER
7.1 で追加
比
較
特化したハンドラの威力
ハンドラの違いによる実装の比較
2017-10-08 JAPAN PHP CONFERENCE 2017 47
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL
ZEND_ADD_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zval *op1, *op2, *result;
op1 = EX_CONSTANT(opline->op1);
op2 = _get_zval_ptr_cv_undef(execute_data, opline->op2.var);
if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
result = EX_VAR(opline->result.var);
fast_long_add_function(result, op1, op2);
ZEND_VM_NEXT_OPCODE();
} else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
result = EX_VAR(opline->result.var);
ZVAL_DOUBLE(result, ((double)Z_LVAL_P(op1)) + Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
}
} else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
result = EX_VAR(opline->result.var);
ZVAL_DOUBLE(result, Z_DVAL_P(op1) + Z_DVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
} else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
result = EX_VAR(opline->result.var);
ZVAL_DOUBLE(result, Z_DVAL_P(op1) + ((double)Z_LVAL_P(op2)));
ZEND_VM_NEXT_OPCODE();
}
}
SAVE_OPLINE();
if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
op1 = GET_OP1_UNDEF_CV(op1, BP_VAR_R);
}
if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
}
add_function(EX_VAR(opline->result.var), op1, op2);
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
 従来のハンドラ (CONST_CV)  特化ハンドラ (LONG_NO_OVERFLOW)
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL
ZEND_ADD_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
zval *op1, *op2, *result;
op1 = EX_CONSTANT(opline->op1);
op2 = EX_VAR(opline->op2.var);
result = EX_VAR(opline->result.var);
ZVAL_LONG(result, Z_LVAL_P(op1) + Z_LVAL_P(op2));
ZEND_VM_NEXT_OPCODE();
}
PHP 7.2 の最適化器
2017-10-08 JAPAN PHP CONFERENCE 2017 48
PASS 9
PASS 1
PASS 2
PASS 3 PASS 10
PASS 4
→ PASS 16
PASS 11
PASS 5
PASS 13
未使用変数の除去
PASS 12
PASS 6 (データフロー解析)
PASS 7 (コールグラフの構築)
→ PASS 8
定数伝播
→ PASS 14
不要コード除去
PASS 8 定数伝播
定数式をコンパイル時に計算する
例:PHP 7.1 までは・・・
2017-10-08 JAPAN PHP CONFERENCE 2017 49
function test()
{
$a = 1 + 2;
$b = $a + 3;
$c = $b + 4;
echo $c;
}
compiled vars: !0=$a, !1=$b, !2=$c
op return operands
-------------------------------------
QM_ASSIGN !0 3
ADD !1 3, !0
ADD !2 4, !1
ECHO !2
RETURN null
 ソースコード  コンパイル結果
$a の右辺だけは計算されるが計算結果が後続の命令に伝わらない
PASS 8 定数伝播
定数式をコンパイル時に計算する
例:定数伝播を適用すると
2017-10-08 JAPAN PHP CONFERENCE 2017 50
function test()
{
$a = 1 + 2;
$b = $a + 3;
$c = $b + 4;
echo $c;
}
compiled vars: !0=$a, !1=$b, !2=$c
op return operands
-------------------------------------
QM_ASSIGN !0 3
QM_ASSIGN !1 6
QM_ASSIGN !2 10
ECHO !2
RETURN null
 ソースコード  コンパイル結果
PHP 7.2 で最適化レベルを指定
optimization_level=0x7fff8fff
$b や $c の右辺もコンパイル時に計算され定数になる
PASS 14 不要コードの除去
不要なバイトコード命令を除去する
例:不要コード除去も適用すると
2017-10-08 JAPAN PHP CONFERENCE 2017 51
function test()
{
$a = 1 + 2;
$b = $a + 3;
$c = $b + 4;
echo $c;
}
compiled vars: !0=$a, !1=$b, !2=$c
op return operands
-------------------------------------
ECHO 10
RETURN null
 ソースコード  コンパイル結果
PHP 7.2 で最適化レベルを指定
optimization_level=0x7fffafff
$a, $b, $c に代入する命令が除去され 10 が直接出力される
PASS 13 未使用変数の除去
使われることのない変数を除去する
例:未使用変数の除去も適用すると
2017-10-08 JAPAN PHP CONFERENCE 2017 52
function test()
{
$a = 1 + 2;
$b = $a + 3;
$c = $b + 4;
echo $c;
}
compiled vars: none
op return operands
-------------------------------------
ECHO 10
RETURN null
 ソースコード  コンパイル結果
PHP 7.2 のデフォルトの設定
optimization_level=0x7fffbfff
スタックに $a, $b, $c の領域を確保しなくなる (PASS 12 の処理)
もう少し複雑な例
2017-10-08 JAPAN PHP CONFERENCE 2017 53
# op return operands
----------------------------------
0 RETURN 10
 ソースコード  コンパイル結果
function test() {
$a = 1 + 2;
$b = $a + 3;
if ($b > 0) {
$a = 4;
} else {
$b = $a * 5.6;
}
return $a + $b;
}
まだ出来ていないこと
いろいろある
例:ループを含むコード
2017-10-08 JAPAN PHP CONFERENCE 2017 54
function test()
{
$a = 1;
for ($i=0; $i<3; ++$i) {
++$a;
}
echo $a;
}
# op return operands
------------------------------
1 QM_ASSIGN !0 1
2 QM_ASSIGN !1 0
3 JMP ->5
4 PRE_INC !0
5 PRE_INC !1
6 IS_SMALLER ~2 !1, 3
7 JMPNZ ~2, ->3
8 ECHO !0
9 RETURN null
 ソースコード  コンパイル結果
まとめ と 補足
PHP 7.1 以降で OPcache の最適化器が大きく進歩
コマンドラインからの PHP 実行で OPcache を有効にするには
2017-10-08 JAPAN PHP CONFERENCE 2017 55
$ php -d opcache.enable_cli=1 bench.php

More Related Content

What's hot

20111015 勉強会 (PCIe / SR-IOV)
20111015 勉強会 (PCIe / SR-IOV)20111015 勉強会 (PCIe / SR-IOV)
20111015 勉強会 (PCIe / SR-IOV)Kentaro Ebisawa
 
Innodb Deep Talk #2 でお話したスライド
Innodb Deep Talk #2 でお話したスライドInnodb Deep Talk #2 でお話したスライド
Innodb Deep Talk #2 でお話したスライドYasufumi Kinoshita
 
PHP AST 徹底解説
PHP AST 徹底解説PHP AST 徹底解説
PHP AST 徹底解説do_aki
 
PHP-FPM の子プロセス制御方法と設定をおさらいしよう
PHP-FPM の子プロセス制御方法と設定をおさらいしようPHP-FPM の子プロセス制御方法と設定をおさらいしよう
PHP-FPM の子プロセス制御方法と設定をおさらいしようShohei Okada
 
本当は恐ろしい分散システムの話
本当は恐ろしい分散システムの話本当は恐ろしい分散システムの話
本当は恐ろしい分散システムの話Kumazaki Hiroki
 
Dockerfile を書くためのベストプラクティス解説編
Dockerfile を書くためのベストプラクティス解説編Dockerfile を書くためのベストプラクティス解説編
Dockerfile を書くためのベストプラクティス解説編Masahito Zembutsu
 
Linux女子部 systemd徹底入門
Linux女子部 systemd徹底入門Linux女子部 systemd徹底入門
Linux女子部 systemd徹底入門Etsuji Nakai
 
Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)
Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)
Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)NTT DATA Technology & Innovation
 
realpathキャッシュと OPcacheの面倒すぎる関係
realpathキャッシュと OPcacheの面倒すぎる関係realpathキャッシュと OPcacheの面倒すぎる関係
realpathキャッシュと OPcacheの面倒すぎる関係Yoshio Hanawa
 
エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織Takafumi ONAKA
 
std::pin の勘所
std::pin の勘所std::pin の勘所
std::pin の勘所Hiroaki Goto
 
CentOS Linux 8 の EOL と対応策の検討
CentOS Linux 8 の EOL と対応策の検討CentOS Linux 8 の EOL と対応策の検討
CentOS Linux 8 の EOL と対応策の検討Masahito Zembutsu
 
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―shinjiigarashi
 
php and sapi and zendengine2 and...
php and sapi and zendengine2 and...php and sapi and zendengine2 and...
php and sapi and zendengine2 and...do_aki
 
PHPで並列処理する ライブラリを作った
PHPで並列処理する ライブラリを作ったPHPで並列処理する ライブラリを作った
PHPで並列処理する ライブラリを作ったHironobu Saitoh
 
PHPからgoへの移行で分かったこと
PHPからgoへの移行で分かったことPHPからgoへの移行で分かったこと
PHPからgoへの移行で分かったことgree_tech
 
Scapyで作る・解析するパケット
Scapyで作る・解析するパケットScapyで作る・解析するパケット
Scapyで作る・解析するパケットTakaaki Hoyo
 
DockerとPodmanの比較
DockerとPodmanの比較DockerとPodmanの比較
DockerとPodmanの比較Akihiro Suda
 

What's hot (20)

20111015 勉強会 (PCIe / SR-IOV)
20111015 勉強会 (PCIe / SR-IOV)20111015 勉強会 (PCIe / SR-IOV)
20111015 勉強会 (PCIe / SR-IOV)
 
Innodb Deep Talk #2 でお話したスライド
Innodb Deep Talk #2 でお話したスライドInnodb Deep Talk #2 でお話したスライド
Innodb Deep Talk #2 でお話したスライド
 
PHP AST 徹底解説
PHP AST 徹底解説PHP AST 徹底解説
PHP AST 徹底解説
 
PHP-FPM の子プロセス制御方法と設定をおさらいしよう
PHP-FPM の子プロセス制御方法と設定をおさらいしようPHP-FPM の子プロセス制御方法と設定をおさらいしよう
PHP-FPM の子プロセス制御方法と設定をおさらいしよう
 
本当は恐ろしい分散システムの話
本当は恐ろしい分散システムの話本当は恐ろしい分散システムの話
本当は恐ろしい分散システムの話
 
Dockerfile を書くためのベストプラクティス解説編
Dockerfile を書くためのベストプラクティス解説編Dockerfile を書くためのベストプラクティス解説編
Dockerfile を書くためのベストプラクティス解説編
 
Linux女子部 systemd徹底入門
Linux女子部 systemd徹底入門Linux女子部 systemd徹底入門
Linux女子部 systemd徹底入門
 
Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)
Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)
Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)
 
realpathキャッシュと OPcacheの面倒すぎる関係
realpathキャッシュと OPcacheの面倒すぎる関係realpathキャッシュと OPcacheの面倒すぎる関係
realpathキャッシュと OPcacheの面倒すぎる関係
 
エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織
 
std::pin の勘所
std::pin の勘所std::pin の勘所
std::pin の勘所
 
CentOS Linux 8 の EOL と対応策の検討
CentOS Linux 8 の EOL と対応策の検討CentOS Linux 8 の EOL と対応策の検討
CentOS Linux 8 の EOL と対応策の検討
 
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―
 
HTTP/2 入門
HTTP/2 入門HTTP/2 入門
HTTP/2 入門
 
php and sapi and zendengine2 and...
php and sapi and zendengine2 and...php and sapi and zendengine2 and...
php and sapi and zendengine2 and...
 
PHPで並列処理する ライブラリを作った
PHPで並列処理する ライブラリを作ったPHPで並列処理する ライブラリを作った
PHPで並列処理する ライブラリを作った
 
PHPからgoへの移行で分かったこと
PHPからgoへの移行で分かったことPHPからgoへの移行で分かったこと
PHPからgoへの移行で分かったこと
 
Scapyで作る・解析するパケット
Scapyで作る・解析するパケットScapyで作る・解析するパケット
Scapyで作る・解析するパケット
 
perfを使ったPostgreSQLの解析(前編)
perfを使ったPostgreSQLの解析(前編)perfを使ったPostgreSQLの解析(前編)
perfを使ったPostgreSQLの解析(前編)
 
DockerとPodmanの比較
DockerとPodmanの比較DockerとPodmanの比較
DockerとPodmanの比較
 

Viewers also liked

LancersのCakePHPバージョンアップ施策について
LancersのCakePHPバージョンアップ施策についてLancersのCakePHPバージョンアップ施策について
LancersのCakePHPバージョンアップ施策についてShigemasa Akiyama
 
PHP拡張をPECLに登録してわかったこと
PHP拡張をPECLに登録してわかったことPHP拡張をPECLに登録してわかったこと
PHP拡張をPECLに登録してわかったことYoshio Hanawa
 
PHP Version Up と AWS への移行
PHP Version Up と AWS への移行PHP Version Up と AWS への移行
PHP Version Up と AWS への移行gree_tech
 
PHPとシグナル、その裏側
PHPとシグナル、その裏側PHPとシグナル、その裏側
PHPとシグナル、その裏側do_aki
 
著名PHPアプリの脆弱性に学ぶセキュアコーディングの原則
著名PHPアプリの脆弱性に学ぶセキュアコーディングの原則著名PHPアプリの脆弱性に学ぶセキュアコーディングの原則
著名PHPアプリの脆弱性に学ぶセキュアコーディングの原則Hiroshi Tokumaru
 
片手間MySQLチューニング戦略
片手間MySQLチューニング戦略片手間MySQLチューニング戦略
片手間MySQLチューニング戦略yoku0825
 
PHPアプリの品質を(ある程度)保つために出来る事 〜組織編〜
PHPアプリの品質を(ある程度)保つために出来る事 〜組織編〜PHPアプリの品質を(ある程度)保つために出来る事 〜組織編〜
PHPアプリの品質を(ある程度)保つために出来る事 〜組織編〜Katsuhiro Miura
 

Viewers also liked (8)

phpcon2017 LT01 MDD
phpcon2017 LT01 MDDphpcon2017 LT01 MDD
phpcon2017 LT01 MDD
 
LancersのCakePHPバージョンアップ施策について
LancersのCakePHPバージョンアップ施策についてLancersのCakePHPバージョンアップ施策について
LancersのCakePHPバージョンアップ施策について
 
PHP拡張をPECLに登録してわかったこと
PHP拡張をPECLに登録してわかったことPHP拡張をPECLに登録してわかったこと
PHP拡張をPECLに登録してわかったこと
 
PHP Version Up と AWS への移行
PHP Version Up と AWS への移行PHP Version Up と AWS への移行
PHP Version Up と AWS への移行
 
PHPとシグナル、その裏側
PHPとシグナル、その裏側PHPとシグナル、その裏側
PHPとシグナル、その裏側
 
著名PHPアプリの脆弱性に学ぶセキュアコーディングの原則
著名PHPアプリの脆弱性に学ぶセキュアコーディングの原則著名PHPアプリの脆弱性に学ぶセキュアコーディングの原則
著名PHPアプリの脆弱性に学ぶセキュアコーディングの原則
 
片手間MySQLチューニング戦略
片手間MySQLチューニング戦略片手間MySQLチューニング戦略
片手間MySQLチューニング戦略
 
PHPアプリの品質を(ある程度)保つために出来る事 〜組織編〜
PHPアプリの品質を(ある程度)保つために出来る事 〜組織編〜PHPアプリの品質を(ある程度)保つために出来る事 〜組織編〜
PHPアプリの品質を(ある程度)保つために出来る事 〜組織編〜
 

Similar to OPcache の最適化器の今

PHP AST 徹底解説(補遺)
PHP AST 徹底解説(補遺)PHP AST 徹底解説(補遺)
PHP AST 徹底解説(補遺)do_aki
 
Node.js × 音声認識 - 東京Node学園 2012 LT枠 6番目
Node.js × 音声認識 - 東京Node学園 2012 LT枠 6番目Node.js × 音声認識 - 東京Node学園 2012 LT枠 6番目
Node.js × 音声認識 - 東京Node学園 2012 LT枠 6番目hecomi
 
Php in ruby
Php in rubyPhp in ruby
Php in rubydo_aki
 
データサイエンスワールドからC++を眺めてみる
データサイエンスワールドからC++を眺めてみるデータサイエンスワールドからC++を眺めてみる
データサイエンスワールドからC++を眺めてみるShintaro Fukushima
 
Python physicalcomputing
Python physicalcomputingPython physicalcomputing
Python physicalcomputingNoboru Irieda
 
Local php-100828 2
Local php-100828 2Local php-100828 2
Local php-100828 2Akio Ishida
 
Stroustrup11章雑感
Stroustrup11章雑感Stroustrup11章雑感
Stroustrup11章雑感31 00
 
x86とコンテキストスイッチ
x86とコンテキストスイッチx86とコンテキストスイッチ
x86とコンテキストスイッチMasami Ichikawa
 
Cookpad 17 day Tech internship 2017 言語処理系入門 Rubyをコンパイルしよう
Cookpad 17 day Tech internship 2017 言語処理系入門 RubyをコンパイルしようCookpad 17 day Tech internship 2017 言語処理系入門 Rubyをコンパイルしよう
Cookpad 17 day Tech internship 2017 言語処理系入門 RubyをコンパイルしようKoichi Sasada
 
GNU awk (gawk) を用いた Apache ログ解析方法
GNU awk (gawk) を用いた Apache ログ解析方法GNU awk (gawk) を用いた Apache ログ解析方法
GNU awk (gawk) を用いた Apache ログ解析方法博文 斉藤
 
関西Php勉強会のlimeの話
関西Php勉強会のlimeの話関西Php勉強会のlimeの話
関西Php勉強会のlimeの話Hisateru Tanaka
 
私とOSS活動とPerl
私とOSS活動とPerl私とOSS活動とPerl
私とOSS活動とPerlShunsuke Maeda
 
Apacheの展望とmod_perlの超絶技巧 #yapcasia
Apacheの展望とmod_perlの超絶技巧 #yapcasiaApacheの展望とmod_perlの超絶技巧 #yapcasia
Apacheの展望とmod_perlの超絶技巧 #yapcasia鉄次 尾形
 
PHPの関数実行とその計測
PHPの関数実行とその計測PHPの関数実行とその計測
PHPの関数実行とその計測shinjiigarashi
 
Javaで簡単にgpgpu aparapi
Javaで簡単にgpgpu aparapiJavaで簡単にgpgpu aparapi
Javaで簡単にgpgpu aparapiKen'ichi Sakiyama
 
Modern PHP Programming @ PFI Seminar
Modern PHP Programming @ PFI SeminarModern PHP Programming @ PFI Seminar
Modern PHP Programming @ PFI SeminarSotaro Karasawa
 
T69 c++cli ネイティブライブラリラッピング入門
T69 c++cli ネイティブライブラリラッピング入門T69 c++cli ネイティブライブラリラッピング入門
T69 c++cli ネイティブライブラリラッピング入門伸男 伊藤
 

Similar to OPcache の最適化器の今 (20)

PHP AST 徹底解説(補遺)
PHP AST 徹底解説(補遺)PHP AST 徹底解説(補遺)
PHP AST 徹底解説(補遺)
 
Node.js × 音声認識 - 東京Node学園 2012 LT枠 6番目
Node.js × 音声認識 - 東京Node学園 2012 LT枠 6番目Node.js × 音声認識 - 東京Node学園 2012 LT枠 6番目
Node.js × 音声認識 - 東京Node学園 2012 LT枠 6番目
 
Php in ruby
Php in rubyPhp in ruby
Php in ruby
 
データサイエンスワールドからC++を眺めてみる
データサイエンスワールドからC++を眺めてみるデータサイエンスワールドからC++を眺めてみる
データサイエンスワールドからC++を眺めてみる
 
Python physicalcomputing
Python physicalcomputingPython physicalcomputing
Python physicalcomputing
 
Rの高速化
Rの高速化Rの高速化
Rの高速化
 
Local php-100828 2
Local php-100828 2Local php-100828 2
Local php-100828 2
 
about dakota6.7 gui
about dakota6.7 guiabout dakota6.7 gui
about dakota6.7 gui
 
Stroustrup11章雑感
Stroustrup11章雑感Stroustrup11章雑感
Stroustrup11章雑感
 
about DakotagUI
about DakotagUIabout DakotagUI
about DakotagUI
 
x86とコンテキストスイッチ
x86とコンテキストスイッチx86とコンテキストスイッチ
x86とコンテキストスイッチ
 
Cookpad 17 day Tech internship 2017 言語処理系入門 Rubyをコンパイルしよう
Cookpad 17 day Tech internship 2017 言語処理系入門 RubyをコンパイルしようCookpad 17 day Tech internship 2017 言語処理系入門 Rubyをコンパイルしよう
Cookpad 17 day Tech internship 2017 言語処理系入門 Rubyをコンパイルしよう
 
GNU awk (gawk) を用いた Apache ログ解析方法
GNU awk (gawk) を用いた Apache ログ解析方法GNU awk (gawk) を用いた Apache ログ解析方法
GNU awk (gawk) を用いた Apache ログ解析方法
 
関西Php勉強会のlimeの話
関西Php勉強会のlimeの話関西Php勉強会のlimeの話
関西Php勉強会のlimeの話
 
私とOSS活動とPerl
私とOSS活動とPerl私とOSS活動とPerl
私とOSS活動とPerl
 
Apacheの展望とmod_perlの超絶技巧 #yapcasia
Apacheの展望とmod_perlの超絶技巧 #yapcasiaApacheの展望とmod_perlの超絶技巧 #yapcasia
Apacheの展望とmod_perlの超絶技巧 #yapcasia
 
PHPの関数実行とその計測
PHPの関数実行とその計測PHPの関数実行とその計測
PHPの関数実行とその計測
 
Javaで簡単にgpgpu aparapi
Javaで簡単にgpgpu aparapiJavaで簡単にgpgpu aparapi
Javaで簡単にgpgpu aparapi
 
Modern PHP Programming @ PFI Seminar
Modern PHP Programming @ PFI SeminarModern PHP Programming @ PFI Seminar
Modern PHP Programming @ PFI Seminar
 
T69 c++cli ネイティブライブラリラッピング入門
T69 c++cli ネイティブライブラリラッピング入門T69 c++cli ネイティブライブラリラッピング入門
T69 c++cli ネイティブライブラリラッピング入門
 

More from y-uti

潜在ディリクレ配分法
潜在ディリクレ配分法潜在ディリクレ配分法
潜在ディリクレ配分法y-uti
 
Active Object
Active ObjectActive Object
Active Objecty-uti
 
目で見る過学習と正則化
目で見る過学習と正則化目で見る過学習と正則化
目で見る過学習と正則化y-uti
 
ロジスティック回帰入門
ロジスティック回帰入門ロジスティック回帰入門
ロジスティック回帰入門y-uti
 
論文紹介 Identifying Implementation Bugs in Machine Learning based Image Classifi...
論文紹介 Identifying Implementation Bugs in Machine Learning based Image Classifi...論文紹介 Identifying Implementation Bugs in Machine Learning based Image Classifi...
論文紹介 Identifying Implementation Bugs in Machine Learning based Image Classifi...y-uti
 
PECL operator で演算子オーバーロード
PECL operator で演算子オーバーロードPECL operator で演算子オーバーロード
PECL operator で演算子オーバーロードy-uti
 
PHP-ML で手書き数字認識
PHP-ML で手書き数字認識PHP-ML で手書き数字認識
PHP-ML で手書き数字認識y-uti
 
スパース推定
スパース推定スパース推定
スパース推定y-uti
 
Kaggle の Titanic チュートリアルに挑戦した話
Kaggle の Titanic チュートリアルに挑戦した話Kaggle の Titanic チュートリアルに挑戦した話
Kaggle の Titanic チュートリアルに挑戦した話y-uti
 
PHP カンファレンス福岡 2017 参加報告
PHP カンファレンス福岡 2017 参加報告PHP カンファレンス福岡 2017 参加報告
PHP カンファレンス福岡 2017 参加報告y-uti
 
分類問題 - 機械学習ライブラリ scikit-learn の活用
分類問題 - 機械学習ライブラリ scikit-learn の活用分類問題 - 機械学習ライブラリ scikit-learn の活用
分類問題 - 機械学習ライブラリ scikit-learn の活用y-uti
 
JIT for PHP を試した
JIT for PHP を試したJIT for PHP を試した
JIT for PHP を試したy-uti
 
Task Spooler を試した
Task Spooler を試したTask Spooler を試した
Task Spooler を試したy-uti
 
anyenv + phpenv + php-build が便利すぎる件
anyenv + phpenv + php-build が便利すぎる件anyenv + phpenv + php-build が便利すぎる件
anyenv + phpenv + php-build が便利すぎる件y-uti
 
PHP カンファレンス福岡 参加報告
PHP カンファレンス福岡 参加報告PHP カンファレンス福岡 参加報告
PHP カンファレンス福岡 参加報告y-uti
 
RFC: "var" Deprecation
RFC: "var" DeprecationRFC: "var" Deprecation
RFC: "var" Deprecationy-uti
 
最近の PHP の話
最近の PHP の話最近の PHP の話
最近の PHP の話y-uti
 
Windows で拡張モジュールをビルドしてみた
Windows で拡張モジュールをビルドしてみたWindows で拡張モジュールをビルドしてみた
Windows で拡張モジュールをビルドしてみたy-uti
 
PECL を数えてみた
PECL を数えてみたPECL を数えてみた
PECL を数えてみたy-uti
 
Windows で PHP をビルドしてみた
Windows で PHP をビルドしてみたWindows で PHP をビルドしてみた
Windows で PHP をビルドしてみたy-uti
 

More from y-uti (20)

潜在ディリクレ配分法
潜在ディリクレ配分法潜在ディリクレ配分法
潜在ディリクレ配分法
 
Active Object
Active ObjectActive Object
Active Object
 
目で見る過学習と正則化
目で見る過学習と正則化目で見る過学習と正則化
目で見る過学習と正則化
 
ロジスティック回帰入門
ロジスティック回帰入門ロジスティック回帰入門
ロジスティック回帰入門
 
論文紹介 Identifying Implementation Bugs in Machine Learning based Image Classifi...
論文紹介 Identifying Implementation Bugs in Machine Learning based Image Classifi...論文紹介 Identifying Implementation Bugs in Machine Learning based Image Classifi...
論文紹介 Identifying Implementation Bugs in Machine Learning based Image Classifi...
 
PECL operator で演算子オーバーロード
PECL operator で演算子オーバーロードPECL operator で演算子オーバーロード
PECL operator で演算子オーバーロード
 
PHP-ML で手書き数字認識
PHP-ML で手書き数字認識PHP-ML で手書き数字認識
PHP-ML で手書き数字認識
 
スパース推定
スパース推定スパース推定
スパース推定
 
Kaggle の Titanic チュートリアルに挑戦した話
Kaggle の Titanic チュートリアルに挑戦した話Kaggle の Titanic チュートリアルに挑戦した話
Kaggle の Titanic チュートリアルに挑戦した話
 
PHP カンファレンス福岡 2017 参加報告
PHP カンファレンス福岡 2017 参加報告PHP カンファレンス福岡 2017 参加報告
PHP カンファレンス福岡 2017 参加報告
 
分類問題 - 機械学習ライブラリ scikit-learn の活用
分類問題 - 機械学習ライブラリ scikit-learn の活用分類問題 - 機械学習ライブラリ scikit-learn の活用
分類問題 - 機械学習ライブラリ scikit-learn の活用
 
JIT for PHP を試した
JIT for PHP を試したJIT for PHP を試した
JIT for PHP を試した
 
Task Spooler を試した
Task Spooler を試したTask Spooler を試した
Task Spooler を試した
 
anyenv + phpenv + php-build が便利すぎる件
anyenv + phpenv + php-build が便利すぎる件anyenv + phpenv + php-build が便利すぎる件
anyenv + phpenv + php-build が便利すぎる件
 
PHP カンファレンス福岡 参加報告
PHP カンファレンス福岡 参加報告PHP カンファレンス福岡 参加報告
PHP カンファレンス福岡 参加報告
 
RFC: "var" Deprecation
RFC: "var" DeprecationRFC: "var" Deprecation
RFC: "var" Deprecation
 
最近の PHP の話
最近の PHP の話最近の PHP の話
最近の PHP の話
 
Windows で拡張モジュールをビルドしてみた
Windows で拡張モジュールをビルドしてみたWindows で拡張モジュールをビルドしてみた
Windows で拡張モジュールをビルドしてみた
 
PECL を数えてみた
PECL を数えてみたPECL を数えてみた
PECL を数えてみた
 
Windows で PHP をビルドしてみた
Windows で PHP をビルドしてみたWindows で PHP をビルドしてみた
Windows で PHP をビルドしてみた
 

Recently uploaded

新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
新人研修のまとめ       2024/04/12の勉強会で発表されたものです。新人研修のまとめ       2024/04/12の勉強会で発表されたものです。
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。iPride Co., Ltd.
 
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。iPride Co., Ltd.
 
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxIoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxAtomu Hidaka
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略Ryo Sasaki
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Danieldanielhu54
 
20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directoryosamut
 
PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000Shota Ito
 
UPWARD_share_company_information_20240415.pdf
UPWARD_share_company_information_20240415.pdfUPWARD_share_company_information_20240415.pdf
UPWARD_share_company_information_20240415.pdffurutsuka
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムsugiuralab
 

Recently uploaded (9)

新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
新人研修のまとめ       2024/04/12の勉強会で発表されたものです。新人研修のまとめ       2024/04/12の勉強会で発表されたものです。
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
 
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
 
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxIoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Daniel
 
20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory
 
PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000
 
UPWARD_share_company_information_20240415.pdf
UPWARD_share_company_information_20240415.pdfUPWARD_share_company_information_20240415.pdf
UPWARD_share_company_information_20240415.pdf
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
 

OPcache の最適化器の今