PHP Conference 2014に参加しました-そのいち-

ざっくりまとめ、その後自分でやってみたことも含む

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

メニューを閉じる