Suche senden
Hochladen
zval をダイエットしてみた
•
1 gefällt mir
•
7,738 views
Yoshio Hanawa
Folgen
Technologie
Melden
Teilen
Melden
Teilen
1 von 27
Jetzt herunterladen
Downloaden Sie, um offline zu lesen
Empfohlen
PHPNGの動向
PHPNGの動向
Yoshio Hanawa
PHP7はなぜ速いのか
PHP7はなぜ速いのか
Yoshio Hanawa
PHP7の拡張モジュール事情
PHP7の拡張モジュール事情
Yoshio Hanawa
php-buildがいかに便利かを力説する
php-buildがいかに便利かを力説する
Yoshio Hanawa
PHPの拡張モジュールをGoで作る
PHPの拡張モジュールをGoで作る
Yoshio Hanawa
PHP7の内部実装から学ぶ性能改善テクニック
PHP7の内部実装から学ぶ性能改善テクニック
Yoshio Hanawa
PHP7で変わること ——言語仕様とエンジンの改善ポイント
PHP7で変わること ——言語仕様とエンジンの改善ポイント
Yoshio Hanawa
Zend OPcacheの速さの秘密を探る
Zend OPcacheの速さの秘密を探る
Yoshio Hanawa
Empfohlen
PHPNGの動向
PHPNGの動向
Yoshio Hanawa
PHP7はなぜ速いのか
PHP7はなぜ速いのか
Yoshio Hanawa
PHP7の拡張モジュール事情
PHP7の拡張モジュール事情
Yoshio Hanawa
php-buildがいかに便利かを力説する
php-buildがいかに便利かを力説する
Yoshio Hanawa
PHPの拡張モジュールをGoで作る
PHPの拡張モジュールをGoで作る
Yoshio Hanawa
PHP7の内部実装から学ぶ性能改善テクニック
PHP7の内部実装から学ぶ性能改善テクニック
Yoshio Hanawa
PHP7で変わること ——言語仕様とエンジンの改善ポイント
PHP7で変わること ——言語仕様とエンジンの改善ポイント
Yoshio Hanawa
Zend OPcacheの速さの秘密を探る
Zend OPcacheの速さの秘密を探る
Yoshio Hanawa
Phpでアプリケーションサーバー
Phpでアプリケーションサーバー
k-motoyan
たのしい独自フレームワーク
たのしい独自フレームワーク
Kenta USAMI
php-timecopを実戦投入してみた
php-timecopを実戦投入してみた
Yoshio Hanawa
Mysqlを4.0から5.0を経由して5.6へバージョンアップした話
Mysqlを4.0から5.0を経由して5.6へバージョンアップした話
Masataka Kono
歴史あるWebサービスに携わって2年半の間に起きた事やった事
歴史あるWebサービスに携わって2年半の間に起きた事やった事
Masataka Kono
CakePHPとYii_エンジニア勉強会20130820
CakePHPとYii_エンジニア勉強会20130820
エンジニア勉強会 エスキュービズム
FuelPHP × HHVM サービス開発事例
FuelPHP × HHVM サービス開発事例
Yuji Otani
PHPerに覚えて欲しい日本語の重要性
PHPerに覚えて欲しい日本語の重要性
Rina Fukuda
PHP5.6からPHP7.0への移行
PHP5.6からPHP7.0への移行
Yasuo Ohgaki
Lt資料 php7.0 張田浩明
Lt資料 php7.0 張田浩明
hharita
Pinoco phptal-phpcon-kansai
Pinoco phptal-phpcon-kansai
Hisateru Tanaka
PHPから離れて感じるPHPの良さ
PHPから離れて感じるPHPの良さ
Shinichi Takahashi
Go言語ハンズオン資料flagパッケージを使ってみる
Go言語ハンズオン資料flagパッケージを使ってみる
yoshito funayose
WordPressの多言語プラグイン「qTranslate」で、あなたのサイトも世界にデビュー♪
WordPressの多言語プラグイン「qTranslate」で、あなたのサイトも世界にデビュー♪
Chieko Aihara
10年続いているwebサービスの画像サーバをノーメンテでftpサーバからs3互換のストレージサーバに移行している話
10年続いているwebサービスの画像サーバをノーメンテでftpサーバからs3互換のストレージサーバに移行している話
Masataka Kono
Laravelのeloquent だけ入れた話
Laravelのeloquent だけ入れた話
Masataka Kono
Chrome-eject がこの先生きのこるには
Chrome-eject がこの先生きのこるには
Yosuke HASEGAWA
CakePHP を使ってよかったこと
CakePHP を使ってよかったこと
Wataru Terada
WordPress 多言語化プラグインqTranslateの紹介
WordPress 多言語化プラグインqTranslateの紹介
Takashi Uemura
3流プログラマーから見たPhalconとWISP
3流プログラマーから見たPhalconとWISP
YamaYamamoto
Php radomize
Php radomize
do_aki
Testing PHP extension on Travis CI
Testing PHP extension on Travis CI
Yoshio Hanawa
Weitere ähnliche Inhalte
Was ist angesagt?
Phpでアプリケーションサーバー
Phpでアプリケーションサーバー
k-motoyan
たのしい独自フレームワーク
たのしい独自フレームワーク
Kenta USAMI
php-timecopを実戦投入してみた
php-timecopを実戦投入してみた
Yoshio Hanawa
Mysqlを4.0から5.0を経由して5.6へバージョンアップした話
Mysqlを4.0から5.0を経由して5.6へバージョンアップした話
Masataka Kono
歴史あるWebサービスに携わって2年半の間に起きた事やった事
歴史あるWebサービスに携わって2年半の間に起きた事やった事
Masataka Kono
CakePHPとYii_エンジニア勉強会20130820
CakePHPとYii_エンジニア勉強会20130820
エンジニア勉強会 エスキュービズム
FuelPHP × HHVM サービス開発事例
FuelPHP × HHVM サービス開発事例
Yuji Otani
PHPerに覚えて欲しい日本語の重要性
PHPerに覚えて欲しい日本語の重要性
Rina Fukuda
PHP5.6からPHP7.0への移行
PHP5.6からPHP7.0への移行
Yasuo Ohgaki
Lt資料 php7.0 張田浩明
Lt資料 php7.0 張田浩明
hharita
Pinoco phptal-phpcon-kansai
Pinoco phptal-phpcon-kansai
Hisateru Tanaka
PHPから離れて感じるPHPの良さ
PHPから離れて感じるPHPの良さ
Shinichi Takahashi
Go言語ハンズオン資料flagパッケージを使ってみる
Go言語ハンズオン資料flagパッケージを使ってみる
yoshito funayose
WordPressの多言語プラグイン「qTranslate」で、あなたのサイトも世界にデビュー♪
WordPressの多言語プラグイン「qTranslate」で、あなたのサイトも世界にデビュー♪
Chieko Aihara
10年続いているwebサービスの画像サーバをノーメンテでftpサーバからs3互換のストレージサーバに移行している話
10年続いているwebサービスの画像サーバをノーメンテでftpサーバからs3互換のストレージサーバに移行している話
Masataka Kono
Laravelのeloquent だけ入れた話
Laravelのeloquent だけ入れた話
Masataka Kono
Chrome-eject がこの先生きのこるには
Chrome-eject がこの先生きのこるには
Yosuke HASEGAWA
CakePHP を使ってよかったこと
CakePHP を使ってよかったこと
Wataru Terada
WordPress 多言語化プラグインqTranslateの紹介
WordPress 多言語化プラグインqTranslateの紹介
Takashi Uemura
3流プログラマーから見たPhalconとWISP
3流プログラマーから見たPhalconとWISP
YamaYamamoto
Was ist angesagt?
(20)
Phpでアプリケーションサーバー
Phpでアプリケーションサーバー
たのしい独自フレームワーク
たのしい独自フレームワーク
php-timecopを実戦投入してみた
php-timecopを実戦投入してみた
Mysqlを4.0から5.0を経由して5.6へバージョンアップした話
Mysqlを4.0から5.0を経由して5.6へバージョンアップした話
歴史あるWebサービスに携わって2年半の間に起きた事やった事
歴史あるWebサービスに携わって2年半の間に起きた事やった事
CakePHPとYii_エンジニア勉強会20130820
CakePHPとYii_エンジニア勉強会20130820
FuelPHP × HHVM サービス開発事例
FuelPHP × HHVM サービス開発事例
PHPerに覚えて欲しい日本語の重要性
PHPerに覚えて欲しい日本語の重要性
PHP5.6からPHP7.0への移行
PHP5.6からPHP7.0への移行
Lt資料 php7.0 張田浩明
Lt資料 php7.0 張田浩明
Pinoco phptal-phpcon-kansai
Pinoco phptal-phpcon-kansai
PHPから離れて感じるPHPの良さ
PHPから離れて感じるPHPの良さ
Go言語ハンズオン資料flagパッケージを使ってみる
Go言語ハンズオン資料flagパッケージを使ってみる
WordPressの多言語プラグイン「qTranslate」で、あなたのサイトも世界にデビュー♪
WordPressの多言語プラグイン「qTranslate」で、あなたのサイトも世界にデビュー♪
10年続いているwebサービスの画像サーバをノーメンテでftpサーバからs3互換のストレージサーバに移行している話
10年続いているwebサービスの画像サーバをノーメンテでftpサーバからs3互換のストレージサーバに移行している話
Laravelのeloquent だけ入れた話
Laravelのeloquent だけ入れた話
Chrome-eject がこの先生きのこるには
Chrome-eject がこの先生きのこるには
CakePHP を使ってよかったこと
CakePHP を使ってよかったこと
WordPress 多言語化プラグインqTranslateの紹介
WordPress 多言語化プラグインqTranslateの紹介
3流プログラマーから見たPhalconとWISP
3流プログラマーから見たPhalconとWISP
Andere mochten auch
Php radomize
Php radomize
do_aki
Testing PHP extension on Travis CI
Testing PHP extension on Travis CI
Yoshio Hanawa
SQLite2と3のエスケープ関数の違いとその対策
SQLite2と3のエスケープ関数の違いとその対策
Akishige TAKEKOSHI
php7's ast
php7's ast
do_aki
Zend framework 3 と zend expressive の話
Zend framework 3 と zend expressive の話
Satoru Yoshida
OPcacheの新機能ファイルベースキャッシュの内部実装を読んでみた
OPcacheの新機能ファイルベースキャッシュの内部実装を読んでみた
Yoshio Hanawa
Laungage Update PHP編
Laungage Update PHP編
Yoshio Hanawa
PHP-FPMとuWSGI——mod_php以外の選択肢を探る
PHP-FPMとuWSGI——mod_php以外の選択肢を探る
Yoshio Hanawa
偶然にも500万個のSSH公開鍵を手に入れた俺たちは
偶然にも500万個のSSH公開鍵を手に入れた俺たちは
Yoshio Hanawa
お前は PHP の歴史的な理由の数を覚えているのか
お前は PHP の歴史的な理由の数を覚えているのか
Kousuke Ebihara
Andere mochten auch
(10)
Php radomize
Php radomize
Testing PHP extension on Travis CI
Testing PHP extension on Travis CI
SQLite2と3のエスケープ関数の違いとその対策
SQLite2と3のエスケープ関数の違いとその対策
php7's ast
php7's ast
Zend framework 3 と zend expressive の話
Zend framework 3 と zend expressive の話
OPcacheの新機能ファイルベースキャッシュの内部実装を読んでみた
OPcacheの新機能ファイルベースキャッシュの内部実装を読んでみた
Laungage Update PHP編
Laungage Update PHP編
PHP-FPMとuWSGI——mod_php以外の選択肢を探る
PHP-FPMとuWSGI——mod_php以外の選択肢を探る
偶然にも500万個のSSH公開鍵を手に入れた俺たちは
偶然にも500万個のSSH公開鍵を手に入れた俺たちは
お前は PHP の歴史的な理由の数を覚えているのか
お前は PHP の歴史的な理由の数を覚えているのか
Mehr von Yoshio Hanawa
自宅の消費電力をリアルタイムに グラフ化してみた
自宅の消費電力をリアルタイムに グラフ化してみた
Yoshio Hanawa
Zend VMにおける例外の実装
Zend VMにおける例外の実装
Yoshio Hanawa
Zend VMにおける例外の実装
Zend VMにおける例外の実装
Yoshio Hanawa
ぼくのかんがえる さいきょうの銀行振込
ぼくのかんがえる さいきょうの銀行振込
Yoshio Hanawa
「OKグーグル! 銀行振込1000円」
「OKグーグル! 銀行振込1000円」
Yoshio Hanawa
浮動小数点数とOSSのバグの話
浮動小数点数とOSSのバグの話
Yoshio Hanawa
PHP拡張をPECLに登録してわかったこと
PHP拡張をPECLに登録してわかったこと
Yoshio Hanawa
GitHubからお金をもらった話
GitHubからお金をもらった話
Yoshio Hanawa
iOS/macOSとAndroid/Linuxのサンドボックス機構について調べた
iOS/macOSとAndroid/Linuxのサンドボックス機構について調べた
Yoshio Hanawa
realpathキャッシュと OPcacheの面倒すぎる関係
realpathキャッシュと OPcacheの面倒すぎる関係
Yoshio Hanawa
家庭用ブロードバンドルータ上でWordPressを動かそう
家庭用ブロードバンドルータ上でWordPressを動かそう
Yoshio Hanawa
GitHubにバグ報告して賞金$500を頂いた話
GitHubにバグ報告して賞金$500を頂いた話
Yoshio Hanawa
PHPの正規表現と最長一致
PHPの正規表現と最長一致
Yoshio Hanawa
浮動小数点数の話 2013年度版
浮動小数点数の話 2013年度版
Yoshio Hanawa
PHPエクステンションの開発tips
PHPエクステンションの開発tips
Yoshio Hanawa
PHPで時間旅行をする方法
PHPで時間旅行をする方法
Yoshio Hanawa
Mehr von Yoshio Hanawa
(16)
自宅の消費電力をリアルタイムに グラフ化してみた
自宅の消費電力をリアルタイムに グラフ化してみた
Zend VMにおける例外の実装
Zend VMにおける例外の実装
Zend VMにおける例外の実装
Zend VMにおける例外の実装
ぼくのかんがえる さいきょうの銀行振込
ぼくのかんがえる さいきょうの銀行振込
「OKグーグル! 銀行振込1000円」
「OKグーグル! 銀行振込1000円」
浮動小数点数とOSSのバグの話
浮動小数点数とOSSのバグの話
PHP拡張をPECLに登録してわかったこと
PHP拡張をPECLに登録してわかったこと
GitHubからお金をもらった話
GitHubからお金をもらった話
iOS/macOSとAndroid/Linuxのサンドボックス機構について調べた
iOS/macOSとAndroid/Linuxのサンドボックス機構について調べた
realpathキャッシュと OPcacheの面倒すぎる関係
realpathキャッシュと OPcacheの面倒すぎる関係
家庭用ブロードバンドルータ上でWordPressを動かそう
家庭用ブロードバンドルータ上でWordPressを動かそう
GitHubにバグ報告して賞金$500を頂いた話
GitHubにバグ報告して賞金$500を頂いた話
PHPの正規表現と最長一致
PHPの正規表現と最長一致
浮動小数点数の話 2013年度版
浮動小数点数の話 2013年度版
PHPエクステンションの開発tips
PHPエクステンションの開発tips
PHPで時間旅行をする方法
PHPで時間旅行をする方法
zval をダイエットしてみた
1.
Reducing size of
zval structure zvalをダイエット してみた hnw 第五回闇PHP勉強会 (2014/3/15) 発表資料
2.
自己紹介 ❖ @hnw! ❖ 勤務先:KLab株式会社! ❖
カレーとバグが大好物! ❖ 好きなdouble値:NaN
3.
発想 ❖ NaN boxingってカッコいい! ❖
doubleの一部にポインタや整数を詰め込む技! ❖ PHPにも応用できないか?! ❖ サイズ減らす点だけなら真似できそうだ! ❖ やってみた
4.
アジェンダ ❖ PHPのzval概要! ❖ zvalをダイエットする! ❖
さらなるダイエットへの道
5.
❖ PHPのzval概要! ❖ zvalをダイエットする! ❖
さらなるダイエットへの道
6.
PHPの変数を考える ❖ C:静的型付け言語! ❖ コンパイル時に型が決まる! ❖
変数に型情報をつける必要が無い! ❖ PHP:動的型付け言語! ❖ 実行時まで型が決定できない! ❖ 変数値と型情報のペアを持ち回る必要がある
7.
PHPの変数 ❖ C言語レベルでは、zval構造体で管理されている typedef struct
_zval_struct zval; ! struct _zval_struct { zvalue_value value; /* 変数値 */ zend_uint refcount__gc; /* 参照カウンタ */ zend_uchar type; /* 変数型 */ zend_uchar is_ref__gc; /* 参照渡しされたか */ };
8.
zvalのtypeに入る値 ❖ 変数型ごとに異なるtype値が定義されている #define IS_NULL
0 #define IS_LONG 1 #define IS_DOUBLE 2 #define IS_BOOL 3 #define IS_ARRAY 4 #define IS_OBJECT 5 #define IS_STRING 6 #define IS_RESOURCE 7 #define IS_CONSTANT 8 #define IS_CONSTANT_ARRAY 9 #define IS_CALLABLE 10
9.
変数値に対応する共用体 ❖ 全ての変数型に対応する値を格納できる typedef union
_zvalue_value { long lval; /* intとboolとresource */ double dval; /* float */ struct { char *val; /* 文字列 */ int len; /* 文字列長 */ } str; /* string */ HashTable *ht; /* array */ zend_object_value obj; /* object */ } zvalue_value;
10.
zvalざっくり概要 ❖ zval:PHPの変数1個に対応する構造体! ❖ メンバ変数! ❖
型は何か! ❖ 値は何か! ❖ 参照カウンタ! ❖ 参照渡しされたか
11.
❖ PHPのzval概要! ❖ zvalをダイエットする! ❖
さらなるダイエットへの道
12.
zvalのサイズ減=高速化? ❖ 仮説:zvalのサイズを減らすとPHPが性能アップする! ❖ zvalのサイズって減らす余地あるのかしら?
13.
zvalのサイズ ❖ 64bit環境では24byteになる typedef struct
_zval_struct zval; ! struct _zval_struct { zvalue_value value; /* 128bit、変数値 */ zend_uint refcount__gc; /* 32bit、参照カウンタ */ zend_uchar type; /* 8bit、変数型 */ zend_uchar is_ref__gc; /* 8bit、参照渡しされたか */ }; /* 196bit */
14.
_zvalue_valueのサイズ typedef union _zvalue_value
{ long lval; /* 64bit */ double dval; /* 64bit */ struct { char *val; /* 64bit */ int len; /* 32bit */ } str; /* 128bit */ HashTable *ht; /* 64bit */ zend_object_value obj; /* 128bit */ } zvalue_value; ! typedef struct _zend_object_value { zend_object_handle handle; /* 32bit */ const zend_object_handlers *handlers; /* 64bit */ } zend_object_value; /* 128bit */ ! typedef unsigned int zend_object_handle;
15.
64bit環境のzvalはスカスカ ❖ zval構造体の内訳! ❖ 変数値に96bit(12byte)! ❖
参照カウンタ・その他で32bit+9bit! ❖ 実質18byteだが、alignmentの都合で24byte消費! ❖ 9bit節約すれば16byteにできるはず
16.
zvalダイエット図解 _zvalue_value refcount__gc unused unused type is_ref__gc ❖ 現状:24byte消費(64bit環境)
17.
zvalダイエット図解 ❖ これで16byteにできないか? _zvalue_value refcount__gc type is_ref__gc
18.
zvalダイエットの方針 ❖ _zvalue_valueの「あまり」に参照カウンタを詰める! ❖ 参照カウンタを32bitから23bitに減らす! ❖
浮いた9bitに変数型とis_ref_gcを詰める
19.
zvalダイエットの実装 ❖ _zval_structを構造体から共用体に変更! ❖ 詰めて使うための工夫! ❖
基本的にzval関連のマクロを修正するだけでよい! ❖ Z_TYPE_P()とかZ_ADDREF_P()とか! ❖ 行儀の悪い箇所もあるので、チマチマ修正! ❖ https://github.com/hnw/php-src/tree/PHP-5.5.9-smallzval
20.
zvalダイエットの結果 ❖ make testが99%以上通る程度には動いた!! ❖
ベンチマークテストを動かしてみた! ❖ sizeof(zval)は24→16に減った! ❖ 性能面:ほぼ同じか少し遅い印象…! ❖ 消費メモリ量:zvalのサイズ減による寄与はわずか
21.
❖ PHPのzval概要! ❖ zvalをダイエットする! ❖
さらなるダイエットへの道
22.
失敗の原因を考える(1) ❖ 個別に速度測定! ❖ zvalのallocationは速くなった! ❖
zval同士の値のコピーは少し遅くなった! ❖ 参照カウンタへのアクセスも少し遅くなった! ❖ 仮説1:差し引きゼロ! ❖ データの持ち方が複雑すぎる?
23.
失敗の原因を考える(2) ❖ そもそも、zvalはポインタ渡しされることが多い! ❖ zvalのallocationやcopyが少ないとすれば、 サイズ減をしても生きない! ❖
仮説2:「変数のサイズ減=性能向上」がPHPでは成り 立たない
24.
ポインタ渡しの功罪 ❖ 「大きい構造体を値渡しするのはダメ」という常識! ❖ (少なくとも昔は)Cの入門書に書いてあった! ❖
いまやポインタ64bit時代! ❖ 参照渡しのコストが相対的に増大! ❖ PHPは値渡しを避けすぎて無駄なコストを払っている?! ❖ 64bit環境だとzvalはポインタサイズの高々3倍
25.
Copy-on-write の功罪 ❖ PHPの変数コピーは「Copy-on-write」! ❖
PHP上の代入・値渡し=実装上はポインタ渡し! ❖ 必要があるときだけコピーする! ❖ コピーは最低限になる! ❖ 変数の代入のたびに参照カウンタの増減が必要! ❖ 値渡しより、メモリへのwriteはむしろ増える?
26.
まとめ(一部妄想) ❖ PHPのzvalをダイエットしたが効果は無かった! ❖ PHPの「Copy-on-write」は現代のCPUでは生きない?! ❖
基本型を値渡しすれば高速化の道もあるのでは! ❖ (zval *)にNaN boxingでint/doubleを入れたい! ❖ zvalのまま使ってる場所の始末が非現実的かも…
27.
ご静聴 ありがとう ございました
Jetzt herunterladen