PHPでechoを使って複数行に渡るhtmlソースを出力する時に、echoのつけ方はどれが一番速いのか?を検証してみました。
どゆこと?というのを具体的に説明しますと、以下のコードたちを比較していきます。
// 全て''で囲む
echo '<div style="display:none">
ほげほげ
ほげほげ
ほげほげ
ほげほげ
ほげほげ
ほげほげ
ほげほげ
ほげほげ
ほげほげ
ほげほげ
</div>';
// .で繋ぐ
echo '<div style="display:none">'.
'ほげほげ'.
'ほげほげ'.
'ほげほげ'.
'ほげほげ'.
'ほげほげ'.
'ほげほげ'.
'ほげほげ'.
'ほげほげ'.
'ほげほげ'.
'ほげほげ'.
'</div>';
// ,で繋ぐ
echo '<div style="display:none">',
'ほげほげ',
'ほげほげ',
'ほげほげ',
'ほげほげ',
'ほげほげ',
'ほげほげ',
'ほげほげ',
'ほげほげ',
'ほげほげ',
'ほげほげ',
'</div>';
// 各行echo
echo '<div style="display:none">';
echo 'ほげほげ';
echo 'ほげほげ';
echo 'ほげほげ';
echo 'ほげほげ';
echo 'ほげほげ';
echo 'ほげほげ';
echo 'ほげほげ';
echo 'ほげほげ';
echo 'ほげほげ';
echo 'ほげほげ';
echo '</div>';
// 最後にまとめてecho
$str = "";
$str .= '<div style="display:none">';
$str .= 'ほげほげ';
$str .= 'ほげほげ';
$str .= 'ほげほげ';
$str .= 'ほげほげ';
$str .= 'ほげほげ';
$str .= 'ほげほげ';
$str .= 'ほげほげ';
$str .= 'ほげほげ';
$str .= 'ほげほげ';
$str .= 'ほげほげ';
$str .= '</div>';
echo $str;
目次
検証環境と計測方法
どんな環境・どんなコードを使って検証していくのかを先にご紹介しておきます。
検証環境
- PHPコードの実行は「Local by Flywheel」で構築した ローカル環境 にて行っています。
- 他に何も処理のないPHPファイルで検証。
- PHPバージョンは7.2.0
- PCはMacBook Proで検証しました。以下スペックです。
- OS:macOS High Sierra
- CPU:Intel Core i7
- メモリ:16 GB
- ブラウザは Google Chrom (バージョン: 66.0.3359.181) を使用。
- その他、起動アプリケーションの数などは全て同じ状態で行なっています。
計測方法
以下のコードを記述したphpファイルをブラウザで確認し、表示された計測時間をメモしています。
function benchmark(callable $fn,$name,$count = 10000) {
$DO_COUNT = $count; //試行回数
$DECIMAL_DIGITS = 10; //小数点桁数
$start = microtime(true); //計測前の現在時刻を取得
for($j = 0; $j < $DO_COUNT; $j++) {
$fn();
}
$end = microtime(true); //計測後の現在時刻を取得
$test_time = $end - $start; //10000回の実行にかかった時間
//100回計測した時の平均値を計算し、出力
$average = number_format($test_time, $DECIMAL_DIGITS);
echo $name . " : " . $average . "秒";
}
benchmark(function(){
echo '<div style="display:none">
ほげほげ
ほげほげ
ほげほげ
ほげほげ
ほげほげ
ほげほげ
ほげほげ
ほげほげ
ほげほげ
ほげほげ
</div>';
},"全て''で囲む", 1000);
benchmark(function(){
echo '<div style="display:none">'.
'ほげほげ'.
'ほげほげ'.
'ほげほげ'.
'ほげほげ'.
'ほげほげ'.
'ほげほげ'.
'ほげほげ'.
'ほげほげ'.
'ほげほげ'.
'ほげほげ'.
'</div>';
},".で繋ぐ", 1000);
benchmark(function(){
echo '<div style="display:none">',
'ほげほげ',
'ほげほげ',
'ほげほげ',
'ほげほげ',
'ほげほげ',
'ほげほげ',
'ほげほげ',
'ほげほげ',
'ほげほげ',
'ほげほげ',
'</div>';
},",で繋ぐ", 1000);
benchmark(function(){
echo '<div style="display:none">';
echo 'ほげほげ';
echo 'ほげほげ';
echo 'ほげほげ';
echo 'ほげほげ';
echo 'ほげほげ';
echo 'ほげほげ';
echo 'ほげほげ';
echo 'ほげほげ';
echo 'ほげほげ';
echo 'ほげほげ';
echo '</div>';
},"各行echo", 1000);
benchmark(function(){
$str = "";
$str .= '<div style="display:none">';
$str .= 'ほげほげ';
$str .= 'ほげほげ';
$str .= 'ほげほげ';
$str .= 'ほげほげ';
$str .= 'ほげほげ';
$str .= 'ほげほげ';
$str .= 'ほげほげ';
$str .= 'ほげほげ';
$str .= 'ほげほげ';
$str .= 'ほげほげ';
$str .= '</div>';
echo $str;
},"最後にまとめてecho", 1000);
実行回数を1000回、2000回、3000回の3パターンでそれぞれ3回ずつ計測していきます。
また、ブラウザでの表示がスムーズになるよう、echoで出力する内容はdisplay:none
を付与したdivタグで囲み、非表示にしています。
※ コードの詳細については、下記を参考にしてください。
PHPコードの処理速度を比較するためのベンチマーク計測用関数を自作する
PHPで関数やコードの実行速度を検証・比較してみたい時にコピペで使るコードをメモしておこうと思います。 echoとprintはどっちが速いのかとか、nullチェックはどれが一...
計測結果
では、計測結果を見てみましょう。
実行回数を1000回、2000回、3000回の3パターンでそれぞれ計測コードを3回ずつ実行させた時の、出力結果です。(ブラウザを3回ずつ更新)
試行回数:1000回
//1回目
// 全て''で囲む : 0.0025041103秒
// .で繋ぐ : 0.0010151863秒
// ,で繋ぐ : 0.0041139126秒
// 各行echo : 0.0031838417秒
// 最後にまとめてecho : 0.0033588409秒
//2回目
// 全て''で囲む : 0.0037560463秒
// .で繋ぐ : 0.0017318726秒
// ,で繋ぐ : 0.0041899681秒
// 各行echo : 0.0036749840秒
// 最後にまとめてecho : 0.0030860901秒
//3回目
// 全て''で囲む : 0.0025279522秒
// .で繋ぐ : 0.0007939339秒
// ,で繋ぐ : 0.0027079582秒
// 各行echo : 0.0032389164秒
// 最後にまとめてecho : 0.0046842098秒
試行回数:2000回
//1回目
// 全て''で囲む : 0.0057449341秒
// .で繋ぐ : 0.0060830116秒
// ,で繋ぐ : 0.0055329800秒
// 各行echo : 0.0057539940秒
// 最後にまとめてecho : 0.0048341751秒
//2回目
// 全て''で囲む : 0.0048530102秒
// .で繋ぐ : 0.0041890144秒
// ,で繋ぐ : 0.0051281452秒
// 各行echo : 0.0050950050秒
// 最後にまとめてecho : 0.0053131580秒
//3回目
// 全て''で囲む : 0.0072808266秒
// .で繋ぐ : 0.0063908100秒
// ,で繋ぐ : 0.0053248405秒
// 各行echo : 0.0059490204秒
// 最後にまとめてecho : 0.0047049522秒
試行回数:3000回
//1回目
// 全て''で囲む : 0.0105700493秒
// .で繋ぐ : 0.0064129829秒
// ,で繋ぐ : 0.0082840919秒
// 各行echo : 0.0077738762秒
// 最後にまとめてecho : 0.0070631504秒
//2回目
// 全て''で囲む : 0.0101959705秒
// .で繋ぐ : 0.0071201324秒
// ,で繋ぐ : 0.0089440346秒
// 各行echo : 0.0067071915秒
// 最後にまとめてecho : 0.0072538853秒
//3回目
// 全て''で囲む : 0.0098440647秒
// .で繋ぐ : 0.0087699890秒
// ,で繋ぐ : 0.0079779625秒
// 各行echo : 0.0087931156秒
// 最後にまとめてecho : 0.0069439411秒
まとめ:結果と考察
ん〜?笑
「全て''で囲む」パターンが安定して遅そうなこと以外では、どれも誤差の範囲内でどれも同じ速度、といったレベルでしょうか。
ただ、試行回数が1000回程度の回数であれば、「.で繋ぐ」パターンが安定してかなり速いですね。
おまけ:HTMLの出力時、phpタグは一旦閉じるべき?
他の方のブログなんかを見ていると、基本的にHTML文を記述するときは一度phpタグを閉じている人が多いように思います。
どっちがいいんだろうか...。
気になったので、そちらについても検証してみました!
php文の途中でhtmlを出力する時にphpタグを一度閉じるべきか、そのままechoで出力するべきかを速度比較...
php文の途中でhtmlソースを出力したい時、一度phpタグを閉じてhtml文を書くのと、そのままechoの中にhtml文を記述するのとでは、どちかがいいのでしょうか。 どちらで書...
コメント
コメント一覧 (1件)
ヒアドキュメントのケースも気になります。自分でやってみろという話ですが、コンピューターが特殊なほど貧弱なので一般的な参考にならなさそうなんです。