php文の途中でhtmlソースを出力したい時、一度phpタグを閉じてhtml文を書くのと、そのままechoの中にhtml文を記述するのとでは、どちかがいいのでしょうか。

どちらで書くべきかいつも迷うので、とりあえず速度比較してみました。

目次

検証環境と計測方法

先に、どんな環境・どんなコードを使って検証していくのかをご紹介しておきます。

検証環境

  • PHPコードの実行は「Local by Flywheel」で構築した ローカル環境 にて行っています。
  • PCはMacBook Proで検証しました。以下スペックです。
  • OS:macOS High Sierra
  • CPU:Intel Core i7
  • メモリ:16 GB
  • ブラウザは Google Chrom (バージョン: 66.0.3359.181) を使用。
  • その他、起動アプリケーションの数などは全て同じ状態で行なっています。

検証方法

コードは以下の2種類。

phpタグを閉じる場合のコード

<ul style="display:none">
<?php
    define('DO_COUNT',10000);      //実行回数
    define('TEST_COUNT',100);      //計測回数
    define('DECIMAL_DIGITS',10);   //小数点桁数
    $all_time = 0.0;               //全体の計測時間

    for($i = 0; $i < TEST_COUNT; $i++) {

        $start = microtime(true);
        for($j = 0; $j < DO_COUNT; $j++) {
?>
            <li>
                <p>
                    Hello, World!
                </p>
            </li>
<?php
        }
        $end = microtime(true);

        $test_time = $end - $start;
        $all_time += $test_time;
    }

    $average = number_format($all_time / TEST_COUNT, DECIMAL_DIGITS);
?>
</ul>
<div><?=$average?>秒</div>

こちらと、

phpタグを閉じずにechoでそのまま出力する場合のコード

<ul style="display:none">
<?php
    define('DO_COUNT',1000);      //実行回数
    define('TEST_COUNT',100);      //計測回数
    define('DECIMAL_DIGITS',10);   //小数点桁数
    $all_time = 0.0;               //全体の計測時間

    for($i = 0; $i < TEST_COUNT; $i++) {

        $start = microtime(true);
        for($j = 0; $j < DO_COUNT; $j++) {

            echo "<li>"
                    ."<p>"
                        ."Hello, World!"
                    ."</p>";
                "</li>";

        }
        $end = microtime(true);

        $test_time = $end - $start;
        $all_time += $test_time;
    }

    $average = number_format($all_time / TEST_COUNT, DECIMAL_DIGITS);
?>
</ul>
<div><?=$average?>秒</div>

上記2つのコードで計測。

検証する方のコードを記述したphpファイルをブラウザで確認し、表示された計測結果時間を記録します。

計測コードについては下記を参照してください。

PHPで速度比較をしたい時に便利な、実行速度計測コードPHPで速度比較をしたい時に便利な、実行速度計測コード

echoで出力する内容はdisplay:noneを付与したulタグで囲み、非表示にしています。

また、今回はDO_COUNTの数を元コードより一桁少なくしています。(ブラウザの更新が遅すぎたので)


echoの記述がなぜ「.」で繋いだ形式なのかについては、以前に検証を行なった結果、この形式が一番速いということが分かったためです。

PHPでechoを使って複数行のHTML文を出力する時、echoの付け方(「PHPでechoを使って複数行のHTML文を出力する時、echoの付け方(「""」で丸ごと囲むか、「.」で繋ぐか、全行echoするか)はどれが一番速いのか?

計測結果

では、計測結果を見てみましょう。それぞれ計測コードを3回ずつ実行させました。

phpタグを閉じて出力した場合

  • 0.0010669565秒
  • 0.0009882283秒
  • 0.0010182762秒

phpタグを閉じずにechoした場合

  • 0.0002991223秒
  • 0.0002786517秒
  • 0.0002913785秒

結果と考察

お、phpタグを閉じない方が速いですね。

およそ3倍ほど差が見られます。

追加検証 - 1行の出力で計測

phpタグを閉じない方が速いことが先ほどの計測でわかりました。

しかし、これは本当にphpタグの開閉による差なのか気になったので、さらに検証を続けてみます。

計測対象

追加で計測したコードは3パターン。html的には先ほどと同じ内容ですが、出力は1行で記述してみました。

検証に使ったコードは以下です。

phpタグを閉じる場合のコード(html文を1行で記述版)

/*(略)*/
        for($j = 0; $j < DO_COUNT; $j++) {
    ?>
            <li><p>Hello, World!</p></li>
    <?php
        }
        $end = microtime(true);
/*(略)*/

phpタグを閉じる場合のコード(phpタグを含め1行で記述版)

/*(略)*/
        for($j = 0; $j < DO_COUNT; $j++) {

            ?><li><p>Hello, World!</p></li><?php

        }
        $end = microtime(true);
/*(略)*/

phpタグを閉じずにechoでそのまま出力する場合のコード(1行で記述版)

/*(略)*/
        for($j = 0; $j < DO_COUNT; $j++) {

            echo "<li><p>Hello, World!</p></li>";

        }
        $end = microtime(true);
/*(略)*/

(略)の部分は前半の検証コードと全く同じ内容です。

計測結果

同じくそれぞれ3回計測しました。

phpタグを閉じて出力(html文を1行で記述版)

  • 0.0004678222秒
  • 0.0004730198秒
  • 0.0004744009秒

phpタグを閉じて出力(phpタグを含め1行で記述版)

  • 0.0003198647秒
  • 0.0003024456秒
  • 0.0003599286秒

phpタグを閉じずにechoした場合(1行で記述版)

  • 0.0003460336秒
  • 0.0002838397秒
  • 0.0003548408秒

考察

後半2つはほぼ同じ速度となりましたが、phpタグの開閉に改行を挟んだ1つ目のパターンは少し遅い結果となりました。

つまり、この結果と最初の検証を踏まえると、「htmlソース上の改行の数」によって、出力の速度は変わるということがここからわかります。

まとめと考察

改行を含んだコードの場合、phpタグは閉じずに、そのままechoで出力した方が圧倒的に速い結果となりました(ただし、echoの記述方法は前回の検証で最速だった「.」で繋ぐ記法)。

しかし追加検証を行なった結果、この速度の差は「htmlソース上の改行の数」によるものではないかと推測できます。

つまり、

phpを閉じるか閉じないかは直接的には速度に影響しないものの、それによってhtmlソースにおける改行数が増加してしまうと、その分出力速度が落ちてしまう。

ということが今回の検証でわかりました。

htmlソースにおける改行がここまで速度に影響するとは驚きでした。

 

- Thank you for reading. -

コメント

コメントする