Upgrade to Pro — share decks privately, control downloads, hide ads and more …

PHPを少しでも早く_条件はあるよ_.pdf

 PHPを少しでも早く_条件はあるよ_.pdf

tsuyoshi nakamura

February 14, 2019
Tweet

More Decks by tsuyoshi nakamura

Other Decks in Technology

Transcript

  1. PHPを少しでも早く
    (条件はあるよ)
    社内勉強会 @nakamura244

    View Slide

  2. いつものようにagendaなんかなく
    ざっくばらんにいきますよ

    View Slide

  3. 前々回の勉強会でXdebugの話ありまし
    が、Phpdbgで多分事が足りると思うので
    注意です

    View Slide

  4. 前々回の勉強会で`1ms Journey`という話
    がありました

    View Slide

  5. それを受けて、色々なポイントで高速化させ
    る部分があるとわかった

    View Slide

  6. けど1つ気になった。
    サーバサイドまだまだ遅いだろコレ。

    View Slide

  7. API + frontendに移行していけばどんどん
    気にならなくなっていくかもだけど、
    やりきるまで何年必要なんだ?

    View Slide

  8. 現状よりも少しでも良い価値を少しでも早く
    ユーザに届けるのは間違いではない

    View Slide

  9. なので

    View Slide

  10. 現状多くの仕事をPHPでこなしている。その
    PHPを少しでも早く動かすにはどうしたら良
    いか...ちょっと考えた
    Caution:
    - 言語のverupやcacheの飛び道具なし
    - オブジェクト指向やめるもなし
    - タイプヒントやめるもなし

    View Slide

  11. 観点を出して見る

    View Slide

  12. 効果が高い所を狙いたいので
    ボトルネックを探す

    View Slide

  13. 1

    View Slide

  14. ボトルネックを探す - Quick Profiler -

    View Slide

  15. この2つはみとくと良い
    ボトルネックを探す - Quick Profiler -

    View Slide

  16. - この画面表示するのにそんなにSQL発
    行必要?
    - この画面表示するのにそんなメモリ必
    要?
    ボトルネックを探す - Quick Profiler -

    View Slide

  17. explainの情報がみれる
    ボトルネックを探す - Quick Profiler -

    View Slide

  18. 2

    View Slide

  19. ボトルネックを探す - NewRelic -

    View Slide

  20. ボトルネックを探す - NewRelic -
    - 自分が担当してた時に何度か洗って主な
    改善はdone状態
    - 今は主にFWでの処理(classレベルま
    で) or 外部APIコールが相対的なボトル
    ネックとしてだいたい上がる

    View Slide

  21. もう手は出せないのか??
    そんな事はない

    View Slide

  22. FWのcoreをいじらずにcoreの処理の最適
    化をできる!!
    独自クラスをオーバーライドする事ができ
    る!!

    View Slide

  23. なので

    View Slide

  24. NewRelic以上の詳しいプロファイリングを
    する

    View Slide

  25. example

    View Slide

  26. メソッドレベル、関数レベルでのボトルネック
    を探して、その core classに変わるclass
    を開発する
    benchとってokならFWのオーバーライド機
    能使って新classが使われるようにする

    View Slide

  27. たぶんだけど、だいたい正規表現系
    (preg系)が大体多く使われている部分は
    point。
    最小限に留めたり、代替可能ロジックへ出
    来るか等...

    View Slide

  28. 3

    View Slide

  29. 個人的な趣味の色が強いです。
    カリカリのチューニング系です。
    おそらく効果は薄いです。

    View Slide

  30. Opcodeレベルでの改善を考えます

    View Slide

  31. View Slide

  32. https://github.com/sebastianbergmann/foal

    View Slide

  33. 2018年の末にしれっと新しいツールをリ
    リース
    `Foal`

    View Slide

  34. Tool to find lines eliminated by
    OpCache's bytecode optimizer

    View Slide

  35. opCacheを考慮した時に無
    駄なコードを指摘してくれる
    ツール?かな

    View Slide

  36. 中身の実装を見ると
    vld(Vulcan Logic Disassembler)という
    extensionを使って実現してた

    View Slide

  37. ちょっとまて

    View Slide

  38. http://nikic.github.io/2017/04/14/PHP-7-Virtual-machine.html

    View Slide

  39. http://nikic.github.io/2017/04/14/PHP-7-Virtual-machine.html

    View Slide

  40. http://nikic.github.io/2017/04/14/PHP-7-Virtual-machine.html
    Static Single Assignment
    静的単一代入
    Golang 1.7から
    Control Flow Graph
    制御フローグラフ
    コンパイル方法に関する情報が
    見て取れる

    View Slide

  41. php7.1からphpdbgやvldを使わずに
    opcodeをdumpできる機能があるじゃない
    か。それ使えば良いのにと思ってしまった

    View Slide

  42. やっぱりphp7だけで実現できるな。きっと

    View Slide

  43. よし。ちょっと興味が湧いたのでついでに
    作ってみた
    今回のLTは実コード付きです

    View Slide

  44. https://github.com/nakamura244/phpfu

    View Slide

  45. Opcode dumpした時に`Unreachable`に
    注目した。
    通過していないコードかな。なので意味のな
    いコードとして解釈されたコードを表してい
    るっぽい。
    (間違ってたらごめん)

    View Slide

  46. 使い方こんな感じ。
    一応composerでinstallで
    きるようにしといた
    aというmethodでunreachableを検出
    lines=[n-n]はmethod内の行数

    View Slide

  47. ちょっと脱線(時間あれば)

    View Slide

  48. PHP5系とPHP7系のopcodeの最適化の
    違いに関して

    View Slide

  49. 多分時間なによね。また今度にします

    View Slide

  50. 以上

    View Slide

  51. ご静聴ありがとうございました

    View Slide