はじめに
PHPに関する話題の中では,PHPコードをどのように書けば最適化されるのかに関するtipsがブログなどでもたびたび話題に出てきています。しかし,このようなtipsが本当に有効なのか,どうして有効なのか解説している記事は少なく,その信憑性は気になるとこです。
そこで,PHP最適化tipsについて紹介している記事,
をもとに,いくつか抜粋して検証していきます。
PHPソースコードの入手
やはり,内部の動きを知るにはソースコードを読むのが一番です。本稿でもソースコードをもとに解説を行います。
こちらから最新版のソースコードが入手できます。現在の最新バージョンは5.2.6になります。本稿ではPHP5.2.6をベースに解説していきます。
echoのほうがprintより速い
まずはじめに検証を行うのは,“echoのほうがprintより速い”というtipsです。echo,printはご存知のとおり文字列を出力します。
それでは実際に下記のコードを用いてベンチマークをとってみます。用意したコードは1000回ループを回して,echoとprintを実行した合計時間で評価を行うシンプルなコードです。それぞれのコードは5行目でechoを使っているか,printを使っているかの違いがあります。
benchmark_echo.php
<?php
ob_start();
$t = microtime(true);
while($i < 1000) {
echo '';
++$i;
}
$tmp = microtime(true) - $t;
ob_end_clean();
var_dump($tmp);
?>
benchmark_print.php
<?php
ob_start();
$t = microtime(true);
while($i < 1000) {
print '';
++$i;
}
$tmp = microtime(true) - $t;
ob_end_clean();
var_dump($tmp);
?>
実行結果
$ php benchmark_echo.php float(0.000132083892822) $ php benchmark_print.php float(0.000159978866577)
わずかではありますが,echoのほうが速い結果になりました。
それでは,この違いはどこからくるものなのでしょうか。実際にコードを追ってみましょう。
printの実体はZend/zend_compile.c内のzend_do_print()にあります。zend_do_print()ではresultに返り値を必要としており,result変数に返り値が設定されています。
Zend/zend_compile.c
void zend_do_print(znode *result, znode *arg TSRMLS_DC)
{
zend_op *opline = get_next_op(CG(active_op_array) TSRMLS_CC);
opline->result.op_type = IS_TMP_VAR;
opline->result.u.var = get_temporary_variable(CG(active_op_array));
opline->opcode = ZEND_PRINT;
opline->op1 = *arg;
SET_UNUSED(opline->op2);
*result = opline->result;
}
echoの実体はZend/zend_compile.c内のzend_do_echo()にあります。zend_do_echo()ではzend_do_print()とは違い,返り値を必要としていないことがわかります。
Zend/zend_compile.c
void zend_do_echo(znode *arg TSRMLS_DC)
{
zend_op *opline = get_next_op(CG(active_op_array) TSRMLS_CC);
opline->opcode = ZEND_ECHO;
opline->op1 = *arg;
SET_UNUSED(opline->op2);
}
結果を返さない分,echoのほうが早くなります。
1. Speed. There is a difference between the two, but speed-wise it should be irrelevant which one you use. echo is marginally faster since it doesn't set a return value if you really want to get down to the nitty gritty.
http://www.faqts.com/knowledge_base/view.phtml/aid/1/fid/40
PHPの生みの親でもあるRasmusらが書いたこのエントリには,echoとprintには返り値があるかないかの違いはあるが,実行速度の違いは気にするほどのものではないと書かれおり,使い方によってecho, printを使いわけたほうがよさそうです。

