PHPを少しでも早く(条件はあるよ)社内勉強会 @nakamura244
View Slide
いつものようにagendaなんかなくざっくばらんにいきますよ
前々回の勉強会でXdebugの話ありましが、Phpdbgで多分事が足りると思うので注意です
前々回の勉強会で`1ms Journey`という話がありました
それを受けて、色々なポイントで高速化させる部分があるとわかった
けど1つ気になった。サーバサイドまだまだ遅いだろコレ。
API + frontendに移行していけばどんどん気にならなくなっていくかもだけど、やりきるまで何年必要なんだ?
現状よりも少しでも良い価値を少しでも早くユーザに届けるのは間違いではない
なので
現状多くの仕事をPHPでこなしている。そのPHPを少しでも早く動かすにはどうしたら良いか...ちょっと考えたCaution:- 言語のverupやcacheの飛び道具なし- オブジェクト指向やめるもなし- タイプヒントやめるもなし
観点を出して見る
効果が高い所を狙いたいのでボトルネックを探す
1
ボトルネックを探す - Quick Profiler -
この2つはみとくと良いボトルネックを探す - Quick Profiler -
- この画面表示するのにそんなにSQL発行必要?- この画面表示するのにそんなメモリ必要?ボトルネックを探す - Quick Profiler -
explainの情報がみれるボトルネックを探す - Quick Profiler -
2
ボトルネックを探す - NewRelic -
ボトルネックを探す - NewRelic -- 自分が担当してた時に何度か洗って主な改善はdone状態- 今は主にFWでの処理(classレベルまで) or 外部APIコールが相対的なボトルネックとしてだいたい上がる
もう手は出せないのか??そんな事はない
FWのcoreをいじらずにcoreの処理の最適化をできる!!独自クラスをオーバーライドする事ができる!!
NewRelic以上の詳しいプロファイリングをする
example
メソッドレベル、関数レベルでのボトルネックを探して、その core classに変わるclassを開発するbenchとってokならFWのオーバーライド機能使って新classが使われるようにする
たぶんだけど、だいたい正規表現系(preg系)が大体多く使われている部分はpoint。最小限に留めたり、代替可能ロジックへ出来るか等...
3
個人的な趣味の色が強いです。カリカリのチューニング系です。おそらく効果は薄いです。
Opcodeレベルでの改善を考えます
https://github.com/sebastianbergmann/foal
2018年の末にしれっと新しいツールをリリース`Foal`
Tool to find lines eliminated byOpCache's bytecode optimizer
opCacheを考慮した時に無駄なコードを指摘してくれるツール?かな
中身の実装を見るとvld(Vulcan Logic Disassembler)というextensionを使って実現してた
ちょっとまて
http://nikic.github.io/2017/04/14/PHP-7-Virtual-machine.html
http://nikic.github.io/2017/04/14/PHP-7-Virtual-machine.htmlStatic Single Assignment静的単一代入Golang 1.7からControl Flow Graph制御フローグラフコンパイル方法に関する情報が見て取れる
php7.1からphpdbgやvldを使わずにopcodeをdumpできる機能があるじゃないか。それ使えば良いのにと思ってしまった
やっぱりphp7だけで実現できるな。きっと
よし。ちょっと興味が湧いたのでついでに作ってみた今回のLTは実コード付きです
https://github.com/nakamura244/phpfu
Opcode dumpした時に`Unreachable`に注目した。通過していないコードかな。なので意味のないコードとして解釈されたコードを表しているっぽい。(間違ってたらごめん)
使い方こんな感じ。一応composerでinstallできるようにしといたaというmethodでunreachableを検出lines=[n-n]はmethod内の行数
ちょっと脱線(時間あれば)
PHP5系とPHP7系のopcodeの最適化の違いに関して
多分時間なによね。また今度にします
以上
ご静聴ありがとうございました