ざっくりまとめ、その後自分でやってみたことも含む
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