ざっくりまとめ、その後自分でやってみたことも含む
PHPコアから読み解くPHP5.5 蒋池さん
http://www.slideee.com/slide/php-php5-5
PHPコアとは
PHPの内部システムでC言語で記述されている
PHPコアの言語エンジンはZend Engineと呼ばれる
Zend EngineはPHPスクリプトを字句解析・構文解析してオペコードと呼ばれる命令を作り出して実行する
→PHPコアを知れば、PHPがどのように動作するかわかる。本当に良いコードはここまで理解しないとかけない
速度計測する
任意のコードをmicrotime()で挟むことで実測可能(ネットワークやコンパイルに左右されない)
<?php $start = microtime(true); phpinfo(); $end = microtime(true); $tm = $end - $start; echo $tm; ?>
vldを用いたオペコード表示
vld(Vulcan Logic Disassembler)はPHP用のディスアセンブラのこと
オペコードが少ないほうが、処理が軽い可能性が高し
root@hostname:/home/shimizu# pecl search vld
Retrieving data...0%
Matched packages, channel pecl.php.net:
=======================================
Package Stable/(Latest) Local
vld 0.12.0 (beta) Provides functionality to dump the internal representation of PHP scripts
root@hostname:/home/shimizu# pecl install vld
Failed to download pecl/vld within preferred state "stable", latest release is version 0.12.0, stability "beta", use "channel://pecl.php.net/vld-0.12.0" to install
install failed
root@hostname:/home/shimizu# cd /usr/local/src/
root@hostname:/usr/local/src/vld-0.12.0# aptitude install php5-dev
...
root@hostname:/usr/local/src# wget -d http://pecl.php.net/get/vld-0.12.0.tgz
...
root@hostname:/usr/local/src# tar xzvf vld-0.12.0.tgz
package.xml
vld-0.12.0/branchinfo.c
vld-0.12.0/branchinfo.h
vld-0.12.0/Changelog
vld-0.12.0/config.m4
vld-0.12.0/config.w32
vld-0.12.0/CREDITS
vld-0.12.0/Makefile.in
vld-0.12.0/php_vld.h
vld-0.12.0/set.c
vld-0.12.0/set.h
vld-0.12.0/srm_oparray.c
vld-0.12.0/srm_oparray.h
vld-0.12.0/vld.c
root@hostname:/usr/local/src/vld-0.12.0# phpize
Configuring for:
PHP Api Version: 20100412
Zend Module Api No: 20100525
Zend Extension Api No: 220100525
root@hostname:/usr/local/src/vld-0.12.0# ./configure
...
root@hostname:/usr/local/src/vld-0.12.0# make
...
root@hostname:/usr/local/src/vld-0.12.0# make install
Installing shared extensions: /usr/lib/php5/20100525/
root@hostname:/usr/local/src# cd /var/www/htdocs/
root@hostname:/var/www/htdocs# vi /etc/php5/conf.d/30-vld.ini
=====
extension=/usr/lib/php5/20100525/vld.so
=====
root@hostname:/var/www/htdocs# php -dvld.active=1 index.php
Finding entry points
Branch analysis from position: 0
Jump found. Position 1 = 10, Position 2 = 8
Branch analysis from position: 10
Return found
Branch analysis from position: 8
Jump found. Position 1 = 5
Branch analysis from position: 5
Jump found. Position 1 = 1
Branch analysis from position: 1
filename: /var/www/htdocs/index.php
function name: (null)
number of ops: 11
compiled vars: !0 = $i
line # * op fetch ext return operands
---------------------------------------------------------------------------------
2 0 > ASSIGN !0, 0
1 > SEND_VAL 1
2 DO_FCALL 1 $1 'count'
3 IS_SMALLER ~2 !0, $1
4 > JMPZNZ 8 ~2, ->10
5 > POST_INC ~3 !0
6 FREE ~3
7 > JMP ->1
3 8 > ECHO ''
4 9 > JMP ->5
6 10 > > RETURN 1
branch: # 0; line: 2- 2; sop: 0; eop: 0; out1: 1
branch: # 1; line: 2- 2; sop: 1; eop: 4; out1: 10; out2: 8
branch: # 5; line: 2- 2; sop: 5; eop: 7; out1: 1
branch: # 8; line: 3- 4; sop: 8; eop: 9; out1: 5
branch: # 10; line: 6- 6; sop: 10; eop: 10
path #1: 0, 1, 10,
path #2: 0, 1, 8, 5, 1, 10,
参考URL
PHPコアから読み解く定石の嘘ホント #phpcon2013
徹底検証!PHP最適化Tips
http://gihyo.jp/dev/feature/01/php-optimize/0004