【PHP】’(シングルクォーテーション)と”(ダブルクォーテーション)はどちらを使うべきか(PHP高速化)
2019.08.30
PHPで文字列を扱う際には’(シングルクォーテーション)と”(ダブルクォーテーション)である。
それぞれの特徴として
- シングルクォーテーション:囲った中身を文字列として扱い、変数、制御文字列もただの文字列として扱う
- ダブルクォーテーション:囲った中身を文字列として扱うが、変数、制御文字列は元々の元として扱う
一般的に全て文字列として扱う為、コード内の文字列はシングルクォーテーションで囲うほうが速度が早く良いと言われています。
本当に全てをシングルクォーテーションに変えたほうがシステムとして良いのか検証してみたいと思います。
動作の違い
変数や制御文字列の扱いが異なると記述しましたが、具体的にどう異なるのかを解説します。
PHPで以下の記述を行った際に出力結果がどう変わるのかをまとめました。
実行コード
$str = "文字列";
echo '表示$str';
echo "表示$str";
echo "表示{$str}";
echo '表示文字列\n';
echo "表示文字列\n";
出力結果
表示$str
表示文字列
表示文字列
表示文字列\n
表示文字列(表示上改行される)
シングルクォーテーションの場合は制御文字列、変数がそのまま文字列として出力されています。
しかし、ダブルクォーテーションはそのまま変数中身や制御文字列として出力しています。
これは文字列連結を行う上で可読性がかなり高くなります。
しかし、外部から何が入ってくるかわからない場合は、外部から制御文字列などを入力されてしまう危険性があります。
ですので可読性とセキュリティを考えどのような文字列なのかを考えたほうが良いでしょう。
また、”表示$str”、”表示{$str}”この2つの記述は同じ結果になりますが
渡ってくる変数が配列だった場合
echo "表示$str['str']";
echo "表示{$str['str']}";
この2種類のコードを動作させた場合
上はエラーになり、下は正常に動作するといった差が出てきます。
単純代入の場合の速度比較
以下のコードでクォートを変え速度比較を行います。
for ($i=0; $i<=100000000;$i++) {
$str = "abcdefghijklmno";
}
real 0m4.175s
user 0m4.157s
sys 0m0.006s
real 0m4.148s
user 0m4.126s
sys 0m0.012s
real 0m4.071s
user 0m4.050s
sys 0m0.010s
real 0m4.133s
user 0m4.115s
sys 0m0.013s
確かにシングルクォーテーションの方が全ての場合で早くなりました
1億回繰り返して速度差は一番大きいところで0.6msとなっていました。
つまりシングルクォーテーションとダブルクォーテーション1個分の差は0.000000006msの差が出ています。
文字列連結する場合の速度比較
以下のコードでクォートを変え速度比較を行います。
$str_tmp = 'abcdefghijklmno';
for ($i=0; $i<=100000000;$i++) {
$str = 'abcdefghijklmno'.$str_tmp;
}
real 0m7.122s
user 0m7.062s
sys 0m0.047s
real 0m9.014s
user 0m8.930s
sys 0m0.066s
文字列を連結するという処理が入る為、単純な代入よりも時間がかかっています。
シングルクォーテーションとダブルクォーテーションの速度差もほぼ無い状態でした。
文字列比較する場合の速度比較
以下のコードでクォートを変え速度比較を行います。
$str = "abcdefghijklmno";
for ($i=0; $i<=100000000;$i++) {
if ($str == "abcdefghijklmno") {
}
}
real 0m5.088s
user 0m5.068s
sys 0m0.009s
real 0m4.976s
user 0m4.963s
sys 0m0.009s
こちらは代入と比べ格段速度が早いようです。
シングルクォーテーションとダブルクォーテーションの速度差も無い為、どちらを採用しても問題がなさそうです
どちらを使用したほうが良いのか
やはり、一般的に言われているようにシングルクォーテーションを使用したほうがシステムとしては僅かですが早くなると思います。
特に大規模で、多量のアクセスを裁かなければならないシステム程この効果は大きいでしょう。
ですが、文字列を連結する際は文字列の中に変数を直接記述できるダブルクォーテーションの方が可読性が高いです。
ですので、基本的にシングルクォーテーションを使用し、必要な箇所でダブルクォーテーションを使用するように心がける事で
より質の高いシステムを組むことができると思われます。
関連