PHPの文字列連結、ダブルコーテーションとシングルコーテーションの速度比較
perlと同じくPHPでも、文字列をダブルコーテーションで括ると変数の展開が行われる。
処理スピードが遅くなるので「できればシングルコーテーションを使いなさい」とインターネットに書かれていた。
「さもありなんだがホンマかな?」と思ったので、イヤラシイけど確認してみた。
とりあえず変数の展開が行われない場合。。。
ありゃ、表とグラフで時間単位が違っているわ(汗; 表のほうの単位がマイクロ秒ですねプログラム見たらグラフの縦軸単位がミリ秒じゃなくて秒ですわ。
回数が多くなると差は1%未満。ダブルコーテーションのほうが速い場合もあるようで少し驚き。回数が少ないほど差が大きいのは、メモリの確保などのオーバーヘッドが影響しているのかもしれない。
実行したスクリプトはこれ。$nに上のグラフの横軸の数値が入る。
<?php function dqAdd($n) { $s = ""; for($i = 0; $i < $n; $i++) { $s .= "0 123456789"; $s .= "01 23456789"; $s .= "012 3456789"; $s .= "0123 456789"; $s .= "01234 56789"; $s .= "012345 6789"; $s .= "0123456 789"; $s .= "01234567 89"; $s .= "012345678 9"; $s .= "0123456789 "; } } function sqAdd($n) { $s = ''; for($i = 0; $i < $n; $i++) { $s .= '0 123456789'; $s .= '01 23456789'; $s .= '012 3456789'; $s .= '0123 456789'; $s .= '01234 56789'; $s .= '012345 6789'; $s .= '0123456 789'; $s .= '01234567 89'; $s .= '012345678 9'; $s .= '0123456789 '; } } ?>
じゃあ変数展開するのと変数を連結するのではどうなるか?とやってみた。
わずかといってもだいたい3%くらいの差があるね。回数が少ないほうが差が開くのは上と同じ。
比較したのは以下の処理です。
<?php function dqAdd($n) { $s = ""; for($i = 0; $i < $n; $i++) { $s .= "0$i 123456789"; $s .= "01$i 23456789"; $s .= "012$i 3456789"; $s .= "0123$i 456789"; $s .= "01234$i 56789"; $s .= "012345$i 6789"; $s .= "0123456$i 789"; $s .= "01234567$i 89"; $s .= "012345678$i 9"; $s .= "0123456789$i "; } } function sqAdd($n) { $s = ''; for($i = 0; $i < $n; $i++) { $s .= '0'.$i.' 123456789'; $s .= '01'.$i.' 23456789'; $s .= '012'.$i.' 3456789'; $s .= '0123'.$i.' 456789'; $s .= '01234'.$i.' 56789'; $s .= '012345'.$i.' 6789'; $s .= '0123456'.$i.' 789'; $s .= '01234567'.$i.' 89'; $s .= '012345678'.$i.' 9'; $s .= '0123456789'.$i.' '; } } ?>
これは自宅PCでの結果なんだけど、実は仕事で使っているPCではシングルコーテーションで変数を連結するほうが遅かった。
自宅PCも仕事PCもWindows7。どちらも指数的に処理速度が伸びているように見えたが、ためしにホスティングしているUNIXサーバーでやってみると、自宅PCと同じくシングルコーテーションのほうが速い。でも、どうみてもリニアな処理時間が得られました。メモリの搭載量やプロセッサの数によってこういう差が出るのかも。
通常のプログラムでこれほど一時に大量にループしながら文字を連結することは無いと思うから、もしかしたら回数の少ないほうの速度差が大きいという結果を採用すべきかも。しかし、変数を連結する場合は、マシンによって結果が逆転する場合があるので、一概にどっちが速いといえるものでもないのだろう。
そして、速度差はミリ秒マイクロ秒の世界だけど、検証プログラム全体の処理時間は20秒近くかかっているから、無視できるレベルの差だと思う。総合的に考えて、コーディング時に細かく気にする必要は無いってことだ。気にする分だけ時間の無駄かも。
« div.onloadの実現 | トップページ | 再ダイエットなう »
「プログラミング」カテゴリの記事
- 自分で書いたコードが大好き(2020.09.20)
- NPMのヨロコビ(2020.05.14)
- VanilaJS は必須科目(2019.02.25)
- MZ-700フルJavaScriptエミュレータ v1.0.6 をリリース(2019.01.26)
- 戦々恐々GitHub vs BitBucket(2019.01.08)
「php」カテゴリの記事
- ワレキでググってビビった件(2012.03.02)
- [php] PHPExcelで幅と高さを指定して画像を貼り付ける(2012.02.28)
- [php] 日付演算 DateTime/DateIntervalのうるう年対応(2012.02.24)
- Twitterアプリを試作してみた(2012.02.15)
- PHPで「なんちゃって静的URL」(2012.02.10)
コメント