Tags:, Posted in PHP 1 Comment

fortuneteller高速化Tipsには、実践的に役立つものも多々ありますが、実際的にはほとんど役に立たないものも含まれていることが多いです。

知識として「ふーん」という以上には役立たないTipsの、PHPにおける最右翼はこのechoとprintの速度差問題ではないでしょうか。前回挙げたでも、公開当初はあったものの、後に消されたエントリの1つです。
Smartyなどのレンダリングエンジンに慣れていれば、そもそもデバッグ時以外では使わない場合も多いこのステートメントの「速度差」が、果たしてどの程度のものなのかを確かめてみます。

大きな文字列を出力

1Mほどの大きな文字列を出力させてみます。

$s = str_repeat('x', 1024 * 1024);
echo $s."\n";
print $s."\n";
print $s."\n";
echo $s."\n";

実行順序で結果が変わることがあるので、2回ずつ呼んでみました。

echo: 0.005774974823
print: 0.00450992584229
print: 0.0048840045929
echo: 0.00483393669128

誤差の範囲しか、違いを見出すことは出来ませんでした。

繰り返し出力

256bytesほどの文字列を、繰り返し出力させます。

$s = str_repeat('x', 256);
$cnt = 10000;
for($i=0; $i<$cnt; ++$i)
  print $s."\n";
for($i=0; $i<$cnt; ++$i)
  echo $s."\n";
for($i=0; $i<$cnt; ++$i)
  echo $s."\n";
for($i=0; $i<$cnt; ++$i)
  print $s."\n";
print: 0.0117089748383
echo: 0.0106270313263
echo: 0.0104529857635
print: 0.0104429721832

こちらも、わずかに echo の方が速いと言えるかもしれない程度です。

速度差を気にする必要は無い

気にしなければならないほどの速度差は、無いと判断します。
PHP自体のCのソースコードを読めば、printの方が少し余計な処理をしている分だけ遅いのが道理ですが、意識しなければいけないほどではありません。
OSなど標準出力の機構によってはもう少し大きな差が出るケースがあるのかもしれませんが、基本的には動作・シンタックスの違いだけを気にしておけば良いと思います。(これすら、実際には使い分ける必要はまず無いと思いますが)
一応、簡単に違いを挙げておきます。

echoとprintの違い(1) 文法

どちらも関数ではなく言語構造である点は共通しているので、括弧なしに呼ぶようなことが可能です。しかしprintの方が、比較的関数に近しい記述を許されています。
例えば、次のような記述はechoでは出来ません。

$ret = $flag ? print 'true' : print 'false';
echo "return code: $ret";

このコードは、標準出力が成功すれば$flagの値がどうあれ”1″を返します。

echoとprintの違い(2) 引数

echoは複数の引数を取り、これを連続して出力することが出来ます。

echo "x", "y", "z";
print "x"."y"."z";

カンマで渡した方が、若干高速なようです。(これもよくきくオカルトですし、実際に逆の検証結果もあるようですが、自分の方で試した結果はやはり文字列結合より引数渡しの方が、やや速いようでした)

このエントリーをはてなブックマークに追加
Bookmark this on Yahoo Bookmark
Bookmark this on Livedoor Clip
Share on FriendFeed
Share on StumbleUpon
Newsing it!

Related posts:

  1. [PHP] 高速化Tipsのオカルト(1) 関数への参照渡し
  2. [PHP] 配列やオブジェクトの値渡しと参照渡し

2009 年 7 月 5 日