徹底検証!PHP最適化Tips

第1回 世間で噂されるPHP最適化tipsについて検証する

この記事を読むのに必要な時間:およそ 5 分

はじめに

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を使いわけたほうがよさそうです。

著者プロフィール

梶原大輔(かじわらだいすけ)

大学卒業後,ヤフー株式会社に入社し,Yahoo!ビデオキャストなどのサービス開発に従事。

現在はグリー株式会社でバックエンドシステムの開発を担当。

URLhttp://d.hatena.ne.jp/kajidai/

コメント

  • リンクがこわれてますよ

    PHP コード最適化 Best Practices 63+ の。

    Commented : #1  とおりすがり (2008/10/14, 21:47)

コメントの記入