php7で変わること ——言語仕様とエンジンの改善ポイント

51
What’s new in PHP7 PHP7で変わること 言語仕様とエンジンの改善ポイント hnw PHPカンファレンス関西2015 (2015/5/30)発表資料

Upload: yoshio-hanawa

Post on 24-Jul-2015

64.762 views

Category:

Technology


2 download

TRANSCRIPT

Page 1: PHP7で変わること ——言語仕様とエンジンの改善ポイント

What’s new in PHP7

PHP7で変わること ̶̶言語仕様とエンジンの改善ポイント

hnw PHPカンファレンス関西2015 (2015/5/30)発表資料

Page 2: PHP7で変わること ——言語仕様とエンジンの改善ポイント

自己紹介

❖ @hnw

❖ 勤務先:KLab株式会社

❖ カレーとバグが大好物

❖ PHP歴15年

❖ PHPや周辺エクステンションにバグレポ・PR多数

Page 3: PHP7で変わること ——言語仕様とエンジンの改善ポイント

アジェンダ

❖ PHP7、さいきんどう?

❖ PHP7の新機能

❖ 性能改善と背景

❖ データ構造の変更

❖ HHVMとPHP

Page 4: PHP7で変わること ——言語仕様とエンジンの改善ポイント

まずはアンケート

Page 5: PHP7で変わること ——言語仕様とエンジンの改善ポイント

PHP7って聞いたことがある人?

Page 6: PHP7で変わること ——言語仕様とエンジンの改善ポイント

実際にPHP7を動かしたことがある人?

Page 7: PHP7で変わること ——言語仕様とエンジンの改善ポイント

❖ PHP7、さいきんどう?

❖ PHP7の新機能

❖ 性能改善と背景

❖ データ構造の変更

❖ HHVMとPHP

Page 8: PHP7で変わること ——言語仕様とエンジンの改善ポイント

PHP7?

❖ PHP 5.6.xの次のバージョンがPHP 7.0.0

❖ PHP6はスキップ

❖ 約10年ぶりのメジャーバージョンアップ

Page 9: PHP7で変わること ——言語仕様とエンジンの改善ポイント

さいきんのPHP7

❖ 予定通り3月に新機能の導入を凍結

❖ RFCが大量に出ていたので個人的に心配していた

❖ そろそろalpha1を出す予定だったが、遅延ぎみ

❖ まだ議論が残っているため

❖ 11月にPHP7リリース予定

Page 10: PHP7で変わること ——言語仕様とエンジンの改善ポイント

PHPのRFCシステム

❖ 新機能の導入にはRFCと呼ばれる説明ページが必要

❖ 提案内容や変更による影響などを書く

❖ MLで議論後、投票によって採用・不採用が決まる

❖ 過半数または2/3以上の同意が必要(内容による)

❖ スピード感は無いが、十分機能している印象

Page 11: PHP7で変わること ——言語仕様とエンジンの改善ポイント

PHP7に対するRFC

❖ PHP7で採択されたRFCは48個

❖ 参考:PHP 5.6は17個、PHP 5.5は20個

→普段のマイナーバージョンアップよりは変化が大きい

Page 12: PHP7で変わること ——言語仕様とエンジンの改善ポイント

PHP7で変わらないこと

❖ PHPは言語仕様の変更に対して非常に保守的

❖ PHP7でも後方互換性は重視されている

❖ 移行コストは十分低いはず

Page 13: PHP7で変わること ——言語仕様とエンジンの改善ポイント

❖ PHP7、さいきんどう?

❖ PHP7の新機能

❖ 性能改善と背景

❖ データ構造の変更

❖ HHVMとPHP

Page 14: PHP7で変わること ——言語仕様とエンジンの改善ポイント

致命的エラーが例外になった

❖ PHP5までの致命的エラー

❖ エラーハンドリングできず、即座に終了していた

❖ PHP7の致命的エラー

❖ EngineExceptionという新しい例外になった

❖ トップレベルに到達すると今まで通りのエラーになる

→ユニットテストで致命的エラーから復帰できる

Page 15: PHP7で変わること ——言語仕様とエンジンの改善ポイント

??演算子の新設❖ nullでなければその値を、nullなら右オペランドを返す

❖ isset()と同様に未定義値に対しても使える

❖ ようやくisset()地獄から解放されるぞ!

Page 16: PHP7で変わること ——言語仕様とエンジンの改善ポイント

無名クラスの導入❖ クラス定義と同時にインスタンス化できる構文を導入

❖ その場限りのインスタンスを作りたいときに便利

Page 17: PHP7で変わること ——言語仕様とエンジンの改善ポイント

AST(抽象構文木)の導入

❖ 解釈フェーズが1段増えた

❖ 文法解釈の柔軟性が上がった

❖ opcode最適化 Zend VMopcode

Parser

Lexertoken

PHP

Zend VM

opcode

Parser

Lexertoken

PHP

Opcode CompilerAST

PHP 5 PHP 7

Page 18: PHP7で変わること ——言語仕様とエンジンの改善ポイント

返り値のタイプヒントをサポート❖ 関数の返り値に型が指定できるようになった

❖ 抽象クラスやインターフェースで指定すると便利

Page 19: PHP7で変わること ——言語仕様とエンジンの改善ポイント

スカラ型のタイプヒントをサポート

❖ 以下の型が引数・返り値で指定できるようになった

❖ int型

❖ float型

❖ string型

❖ bool型

❖ ようやく落としどころが見つかった

Page 20: PHP7で変わること ——言語仕様とエンジンの改善ポイント

非推奨だった機能を廃止

❖ PHP5.6までに非推奨になった機能をPHP7で廃止

❖ ereg関数(preg関数使ってね)

❖ mysql関数(mysqli関数かPDO使ってね)

❖ その他

Page 21: PHP7で変わること ——言語仕様とエンジンの改善ポイント

非推奨だった機能を廃止

❖ 今までもdeprecated(非推奨)エラーが出ていたはず

❖ いま開発環境が~E_DEPRECATEDの人は注意

❖ php.iniが空だとdeprecatedエラーは出ません

Page 22: PHP7で変わること ——言語仕様とエンジンの改善ポイント

❖ PHP7、さいきんどう?

❖ PHP7の新機能

❖ 性能改善と背景

❖ データ構造の変更

❖ HHVMとPHP

Page 23: PHP7で変わること ——言語仕様とエンジンの改善ポイント

PHP7は速いらしい

❖ 「PHP5より倍速い」

❖ 「HHVMとほぼ互角」

❖ ホントに?

Page 24: PHP7で変わること ——言語仕様とエンジンの改善ポイント

PHP7の性能(1)

Zeevのブログ記事(2014/7)より

Page 25: PHP7で変わること ——言語仕様とエンジンの改善ポイント

PHP7の性能(2)

DmitryのZendCon 2014での発表(2014/10)より

Page 26: PHP7で変わること ——言語仕様とエンジンの改善ポイント

PHP7の性能(3)

RasmusのFluent 2015での発表(2015/4)より

Page 27: PHP7で変わること ——言語仕様とエンジンの改善ポイント

PHP7の性能(4)

❖ ごく最近まで性能改善が続いている

Page 28: PHP7で変わること ——言語仕様とエンジンの改善ポイント

速くなりすぎ?

❖ PHP7は確かに速い

❖ この1年で倍の高速化(WordPressで比較)

❖ 今までも性能改善をサボっていたわけじゃない

❖ 10年間(PHP5.0→5.6)で倍の高速化

❖ 5.4以降は頭打ちの感さえあった

Page 29: PHP7で変わること ——言語仕様とエンジンの改善ポイント

何があったのか?

❖ 現代のCPUに合わせて大幅なデータ構造変更を行った

❖ データ量の削減・データ局所性の改善

❖ 高速化チームの裁量が大きかった

❖ RFC「Move the phpng branch into master」

❖ 様々なアイデアを約1年間に渡って実現

Page 30: PHP7で変わること ——言語仕様とエンジンの改善ポイント

❖ PHP7、さいきんどう?

❖ PHP7の新機能

❖ 性能改善と背景

❖ データ構造の変更

❖ HHVMとPHP

Page 31: PHP7で変わること ——言語仕様とエンジンの改善ポイント

データ構造の変更

❖ PHP7で見直したデータ構造

❖ PHPの変数(zval)

❖ 文字列(zend_string)

❖ 配列(HashTable / Bucket)

❖ 特にzvalの見直しは非常に大胆だが有効だった

Page 32: PHP7で変わること ——言語仕様とエンジンの改善ポイント

データ構造変更の必要性(1)

❖ これまでのデータ構造は32bit CPUの頃の設計

❖ 16bytes中14bytesを使う構造だった

❖ 64bit CPUでは24bytes中6bytesが未使用

❖ 64bit時代に対応したデータ構造が必要

Page 33: PHP7で変わること ——言語仕様とエンジンの改善ポイント

データ構造変更の必要性(2)❖ キャッシュを効率的に使う発想が無い頃の設計

❖ メモリやキャッシュが相対的に速かった

❖ 現代のCPUではキャッシュを有効活用する必要性

❖ CPU速度に比べるとメモリ速度の改善は鈍い

❖ キャッシュサイズもあまり増えていない

Page 34: PHP7で変わること ——言語仕様とエンジンの改善ポイント

PHP5のzval(int型)

❖ 計24bytes

❖ 常にポインタ参照される

❖ 参照カウント&コピーオンライト

Page 35: PHP7で変わること ——言語仕様とエンジンの改善ポイント

PHP7のzval(int型)

❖ 計16bytes

❖ 参照カウントしない、代入では常にコピー

Page 36: PHP7で変わること ——言語仕様とエンジンの改善ポイント

新zvalへの評価

❖ どの環境でも16bytes

→64bit時代に対応

❖ ポインタ参照が1段減った

❖ int型・float型・bool型でコピーオンライト廃止

→メモリ消費量減少

→キャッシュに優しくなった

Page 37: PHP7で変わること ——言語仕様とエンジンの改善ポイント

❖ PHP7で我々は本物の配列を手に入れた!

配列にも大改革

Page 38: PHP7で変わること ——言語仕様とエンジンの改善ポイント

❖ PHP7で我々は本物の配列を手に入れた!

配列にも大改革

Page 39: PHP7で変わること ——言語仕様とエンジンの改善ポイント

配列とは

❖ (典型的には)連続するメモリ領域を確保する

❖ インデックスは0から連続する数字

❖ 読み書きが高速

リンゴバナナ

トマトニンジン

0

1

2

3

Page 40: PHP7で変わること ——言語仕様とエンジンの改善ポイント

連想配列とは

❖ 文字列をキーにできる

❖ そこそこ読み書きも速い(配列よりは遅い)

"apple"

0

"banana" "carrot"

1 2 3 4 5 6 7

キーのハッシュ値を計算

"apple"=>リンゴ"banana"=>バナナ "tomato"=>トマト

"tomato"

"carrot"=>ニンジン

Page 41: PHP7で変わること ——言語仕様とエンジンの改善ポイント

PHP5の配列❖ PHP5までは連想配列しか無かった

❖ $array[1]でも連想配列アクセスしていた

❖ 他の言語の配列に比べると遅かった

Page 42: PHP7で変わること ——言語仕様とエンジンの改善ポイント

PHP7の配列❖ PHP7から配列と連想配列が作れるようになった

❖ 内部で自動的に選択される

❖ キーが0から連続する数字なら配列になる

→for文での配列のループ処理が高速になった

Page 43: PHP7で変わること ——言語仕様とエンジンの改善ポイント

PHP7の配列

arData

flagsrefcount type gc_info

zend_array

u nTableMask

nNumUsed nNumOfElements

nTableSize nInternalPointer

nNextFreeElement

pDestructor

zval

Bucket[]

h (hash value)

key (キーへのポインタ)

h

key

0

1

h

key

2

zval

zval

❖ 他言語の配列と同じ構造(数字キーのみの場合)

Page 44: PHP7で変わること ——言語仕様とエンジンの改善ポイント

Bucket構造体の改善

❖ Bucket構造体:配列の要素1個に対応するデータ構造

❖ PHP5(72bytes)→PHP7(32bytes)

❖ メモリ使用量が劇的に減った

→配列のメモリ効率が良くなった

Page 45: PHP7で変わること ——言語仕様とエンジンの改善ポイント

Bucket構造体の改善

❖ PHP7ではBucketの配列を連続領域に確保

❖ PHP5では1個ずつメモリ確保していた

→foreach文でのアクセス速度が有利に

Page 46: PHP7で変わること ——言語仕様とエンジンの改善ポイント

❖ PHP7、さいきんどう?

❖ PHP7の新機能

❖ 性能改善と背景

❖ データ構造の変更

❖ HHVMとPHP

Page 47: PHP7で変わること ——言語仕様とエンジンの改善ポイント

HHVMとは

❖ Facebookが自社向けに開発したPHPの実装

❖ PHP5より断然高速

❖ PHPコアコミッターがフルタイムでHHVMにコミット

❖ OSS開発もうまく回っている

→PHPでは初の「もう一つの選択肢」

Page 48: PHP7で変わること ——言語仕様とエンジンの改善ポイント

HHVMの評価

❖ PHP7の登場で速度面のアドバンテージは失った

❖ JITコンパイルが効く状況では速い

❖ 実アプリケーションでの差は縮まった

❖ 魅力は多い

❖ 開発の活発さ、フットワークの軽さ

❖ Hack言語の仕様面での挑戦(例:async)

Page 49: PHP7で変わること ——言語仕様とエンジンの改善ポイント

選択肢があることの価値

❖ HHVMはPHPに新しい価値を与えてくれた

❖ 必要に応じて別の実装を選べる状況

❖ PHP7での速度改善のモチベーション

❖ PythonやRubyでは当たり前の状況

❖ お互いに良い影響を与え続ける関係が望ましい

Page 50: PHP7で変わること ——言語仕様とエンジンの改善ポイント

まとめ

❖ PHP7への移行のハードルは低い

❖ 便利そうな新機能が実装された

❖ 高速化のため大胆なリファクタリングが行われた

❖ 現代のアーキテクチャに合わせた最適化をした

❖ 他の選択肢があることに価値がある

❖ PHPもHHVMも盛り上がっていってほしい

Page 51: PHP7で変わること ——言語仕様とエンジンの改善ポイント

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