Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

PHP7はなぜ速いのか

29,709 views

Published on

第85回PHP勉強会資料

Published in: Technology
  • Be the first to comment

PHP7はなぜ速いのか

  1. 1. Why is PHP7 so fast? PHP7は なぜ速いのか hnw 第85回PHP勉強会 (2014/12/24)発表資料
  2. 2. 自己紹介 ❖ @hnw ❖ 勤務先:KLab株式会社 ❖ カレーとバグが大好物 ❖ 好きなPHP実装:PHP7
  3. 3. アジェンダ ❖ PHP7の状況 ❖ PHP7のzval ❖ PHP7のzend_string ❖ PHP7の HashTable
  4. 4. まずはアンケート
  5. 5. PHP7って
 聞いたことがある人?
  6. 6. 実際にPHP7を
 動かしたことがある人?
  7. 7. ❖ PHP7の状況 ❖ PHP7のzval ❖ PHP7のzend_string ❖ PHP7の HashTable
  8. 8. PHP7? ❖ PHPの次バージョンはPHP 7.0 ❖ 2015年11月リリース予定 ❖ PHP6は開発中止した奴と紛らわしいのでスキップ ❖ 現在masterブランチ上でPHP7の開発が進んでいる
  9. 9. PHPNGとは ❖ PHP高速化プロジェクト ❖ 2014年1月公開 ❖ リードプログラマ:Dmitry Stogov ❖ 2014年8月にPHP7のベースプロジェクトとして採用 ❖ かなりのスピード採用
  10. 10. PHP7の性能 ❖ DmitryのZendCon 2014での発表から引用
  11. 11. PHP7での改善内容 ❖ PHPの内部的なデータ構造を大きく変更 ❖ zval ❖ zend_string ❖ HashTable ❖ メモリ動的確保の回数やメモリ消費量を減らす方針 ❖ PHPの言語仕様は変わらない
  12. 12. ❖ PHP7の状況 ❖ PHP7のzval ❖ PHP7のzend_string ❖ PHP7の HashTable
  13. 13. PHP5のzval(整数型) ❖ 計24bytes ❖ 常にポインタ参照される ❖ 参照カウンタがある
  14. 14. PHP7のzval(整数型) ❖ 計16bytes ❖ 参照カウントされない
  15. 15. PHP5のコピーオンライト ❖ 「$a=$b」では参照カウンタだけ増える ❖ どちらかの変数値を書き換えるとzvalをコピーする
 (コピーオンライト、CoWなどと言います)
  16. 16. PHP7で「$a=$b」 ❖ PHP7の整数型は毎回コピーされる ❖ 真偽値型・浮動小数点数型も同様 ❖ 本当にPHP7の方が有利なのか?
  17. 17. コピーオンライトの功罪 ❖ 不要なデータコピーは減らすべき→正しい ❖ CoWを実現するのに必要なもの ❖ ポインタ(8bytes) ❖ 参照カウンタ(4bytes) ❖ zval(16bytes)のコピーを減らすのに12bytes使うのは 割に合わない
  18. 18. メモリキャッシュを活用する ❖ CPUから見るとメモリは非常に遅いデバイス ❖ 現代のCPUは3GHz動作→0.3nsに1回計算できる ❖ メモリアクセスは60-100ns程度 ❖ メモリキャッシュはL1、L2、L3の3段構造 ❖ 高速なキャッシュほど容量が小さい ❖ キャッシュライン(64bytes程度)ごとにキャッシュ
  19. 19. キャッシュに優しいデータ構造 ❖ メモリ消費量が少ない ❖ 高速なキャッシュに乗りやすい ❖ 近所のメモリにアクセスする頻度が多い(局所参照性) ❖ L1キャッシュを利用できる ❖ PHP7の方がキャッシュに優しい構造になっている
  20. 20. 新zvalへの評価 ❖ メモリアクセス関連の改善 ❖ 真偽値型・整数型・浮動小数点数型でCoW廃止 ❖ ポインタ参照を減らして局所参照性を上げた
  21. 21. ❖ PHP7の状況 ❖ PHP7のzval ❖ PHP7のzend_string ❖ PHP7の HashTable
  22. 22. PHP5での文字列変数 ❖ 参照カウンタと文字列の実体が別管理だった
  23. 23. zend_string ❖ PHP7で新規に作られた文字列を管理する構造体 ❖ 参照カウンタを持つ
  24. 24. zend_string ❖ 文字列型の変数値の表現 ❖ 内部的な文字列表現としても使われる ❖ 例:連想配列のキー ❖ 同じ文字列がプロセス内で共有できるようになった ❖ PHP5では「連想配列の配列」のキーを毎回作ってた
  25. 25. zend_stringへの評価 ❖ ポインタ参照を減らして局所参照性を上げた ❖ 文字列長と文字列本体が近所になった ❖ 同じ文字列は使い回すようにしてメモリ消費量を節約
  26. 26. ❖ PHP7の状況 ❖ PHP7のzval ❖ PHP7のzend_string ❖ PHP7の HashTable
  27. 27. PHPの連想配列 ❖ PHP5まで事実上配列が無かった ❖ $array[1]でも連想配列アクセスしていた ❖ PHP7から「HASH_FLAG_PACKED」ができた ❖ ハッシュのルックアップテーブルを持たない配列 ❖ $array[0..N-1]まで要素が詰まってる前提 ❖ ねんがんのはいれつをてにいれたぞ!
  28. 28. HashTable/Bucketの改善 ❖ HashTable: 72bytes→56bytes ❖ Bucket: 72bytes→32bytes ❖ メモリの動的確保が劇的に減った
  29. 29. 新HashTableへの評価 ❖ 実は一番性能に影響する改善ポイントなのでは… ❖ まだ僕も調査が不十分です、ごめんなさい
  30. 30. まとめ ❖ 結局PHP7はなぜ速いのか? ❖ メモリアクセスに関する細かい改善の積み重ね ❖ PHP7の工夫を見ていると気づきがある ❖ 普段とは違うレイヤの話題が多くて面白い ❖ 情報も出そろいつつある ❖ 年末年始に遊んでみたらどうかな!
  31. 31. ご静聴 ありがとう ございました

×