背景

どんなライブラリを見ても、php の文字列はだいたいシングルクォートで定義されている。パフォーマンスに差があるのはわかるが、変数を入れ込みたいときに面倒になる。

'{$hoge}' と書いて実行して、間違いに気づきあとで "{$hoge}" に変更する... という作業を何度やったことか。個人的には "" で統一したい派なので実際にどれぐらいの差があるか測定してみたかった。

調べてみると

測定しているサイトがあった。なるほど大して変わらないらしい。
ただちょっと記事が古い。php は 7 で大分変ったので手法はそのまま使わせていただき実測してみることに

php のシングルクォートはほんとうに早いのか
http://takuya-1st.hatenablog.jp/entry/2013/09/10/221859

実測

コードは参考サイトから拝借させていただき、まんま同じコードを流します。

foreach (range(1,1000*1000) as $cnt ) {
    $str = '人は「考え方」を手に入れたとたん頭のよくなる生き物である';
}

結果がこれ。シングルクォート版は 46.3441ms


ダブルクオート版を流します。
foreach (range(1,1000*1000) as $cnt ) {
    $str = "人は「考え方」を手に入れたとたん頭のよくなる生き物である";
}

結果がこれ。ダブルクオート版は 49.5017ms

その差 3.1576ms 。
ちなみに、これは「シングルクォート版」と「ダブルクオート版」を交互に実行して、一番それっぽく差が出た数値を採用しました。
どういう事かというと、同じダブルクオート版を実行しただけでも誤差の範囲でこれぐらいのブレがあります。

  • 49.01ms
  • 47.0376ms
  • 50.2956ms
シングルクォート版だけでも、これぐらいのブレがでます。
  • 48.038ms
  • 49.675ms
  • 49.3508ms

1回1回の差分を見ると、1-2ms あるかないかぐらいですね。その程度ということです。
その程度のことにまでくまなく神経を行き届かせるのが我々の仕事ですが、何を重視するかの方針次第だと思いました。私は面倒くさがりなので全部 " に統一したい派です。

文字列結合バージョン

ちなみに文字列結合バージョンはこんな感じの結果でした。
foreach (range(1,1000*1000) as $cnt ) {
    $str = "人は「考え方」を手に入れたとたん頭のよくなる生き物である{$cnt}";
}
  • 84.2508ms
  • 85.6132ms
  • 80.1787ms
foreach (range(1,1000*1000) as $cnt ) {
    $str = "人は「考え方」を手に入れたとたん頭のよくなる生き物である".$cnt;
}
  • 84.6025ms
  • 81.3242ms
  • 80.8663ms

うーん、ほとんど変わりがありません。

実行環境

Windows10 の php 7.3.5 でした。


以上。