« div.onloadの実現 | トップページ | 再ダイエットなう »

2012.02.07

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の実現 | トップページ | 再ダイエットなう »

プログラミング」カテゴリの記事

php」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック

« div.onloadの実現 | トップページ | 再ダイエットなう »

2020年7月
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  
フォト

Google AdSense

銀の弾丸

無料ブログはココログ

他のアカウント