高速化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";
カンマで渡した方が、若干高速なようです。(これもよくきくオカルトですし、実際に逆の検証結果もあるようですが、自分の方で試した結果はやはり文字列結合より引数渡しの方が、やや速いようでした)
Related posts:
[...] はいえ、実用上気にするような速度差が出ることはないでしょう。こちらのサイトでprintとechoの速度差について調べられていますが、やはり気にするほどの速度差はないとされています [...]