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コードの処理速度を検証・比較するベンチマーク計測方法

計測結果

では、計測結果を見てみましょう。

実行回数を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タグを一度閉じるべきか、そのままechoで出力するべきかを速度比較で考察してみた。
- Thank you for reading. -

コメント

コメントする