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ファイルをブラウザで確認し、表示された計測結果時間を記録します。
計測コードについては下記を参照してください。
echoで出力する内容はdisplay:none
を付与したulタグで囲み、非表示にしています。
また、今回はDO_COUNT
の数を元コードより一桁少なくしています。(ブラウザの更新が遅すぎたので)
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ソースにおける改行がここまで速度に影響するとは驚きでした。