この記事は PHP Advent Calendar 2023 7日目の記事です。
更新 2024/01/19
構文のミスがあったため記事内容を修正しています。
はじめに
PHPで文字列連結をすることって頻繁にありますよね。
あなたは意図した使い分けが出来ていますか?
1. 結合演算子
$lang = 'PHP';
$job = 'エンジニア';
echo $lang . $job;
// 出力結果
// PHPエンジニア
いわゆる「ドットつなぎ」ですね。
2. 変数展開
$lang = 'PHP';
$job = 'エンジニア';
echo "{$lang}{$job}";
// 出力結果
// PHPエンジニア
詳しくは公式ページへ。
それでは本題に入ります
今回は、文字列連結のパフォーマンスについて実験を行います。
噂によると、「結合演算子」と「変数展開」ではメモリの使用量に違いが出てくると聞きました。
名前の通り「変数展開」っていうくらいなのでなんとなく処理がかかるイメージはありますが果たして真相はどうなのか...
調査しようと思った経緯
可読性が高いと感じて、変数展開を乱用していた時期がありました。
ただ、先輩エンジニアから「実装の統一性・パフォーマンスの観点から多用は好ましくない」とのご指摘をもらいました。
そこで、どの程度パフォーマンスに違いがあるのか試してみたくなったっていうのが本記事のパーパスです。
検証始めます
シナリオ
- 10000回文字列連結をします。
- 「結合演算子」と「変数展開」で処理開始時刻・終了時刻の差を計測します。
- 計測結果を評価します。
テストコード
// テスト回数
$loop = 10000;
// 結合演算子を使用する場合
$start_dot = microtime(TRUE);
for ($i = 0; $i < $loop; $i++) {
$a = 'あ';
$i = 'い';
$result_dot = $a . $i;
}
$end_dot = microtime(TRUE);
$dot = ($end_dot - $start_dot);
// 変数展開を使用する場合
$start_var = microtime(TRUE);
for ($i = 0; $i < $loop; $i++) {
$u = 'う';
$e = 'え';
$result_var = "{$u}{$e}";
}
$end_var = microtime(TRUE);
$var = ($end_var - $start_var);
var_dump($dot);
var_dump($var);
分析
// 出力結果
$dot float(2.09808349609375E-5)
$var float(2.1219253540039062E-5)
10^-5
ですので、想像よりは大差はないですね。(わかんない人は関数電卓で計算してください)
いちおう、その後も10回ほど計測をしましたが**わずかに変数展開を利用したほうが遅い...**程度ですね。
まとめ
少しモヤモヤしていたので、今回の調査で「あまりパフォーマンスへの影響がない」ということがわかったのは今回の収穫です。
どっちがいいかというよりかは、「実装の統一性・可読性」を考慮した実装に注力したほうがよさそうですね。