等価演算子(==)と厳密等価演算子(===)

PHPでは速くなるとあったので、一応、検証してみた。

結論

PHPではできる限り、厳密等価演算子を使うべき。

ベンチマーク

<pre><?php

function write($str) {
	echo $str . '<br>';
}

$arr = array();
for($i=0;$i<100000;$i++)$arr[$i]=rand(1, 6); // 1〜6の乱数を生成

write('*数字の配列を操作');
function i11($arr) {
	write('比較演算子1-1');
	$start = microtime();
	for($i=0,$j=count($arr);$i<$j;++$i)$arr[$i]==6;
	$end = microtime();
	$start = explode(' ', $start);
	$end = explode(' ', $end);
	write(((float)$end[0]+(float)$end[1]) - ((float)$start[0]+(float)$start[1]));
}
i11($arr);
function i12($arr) {
	write('比較演算子1-2');
	$start = microtime();
	for($i=0,$j=count($arr);$i<$j;++$i)$arr[$i]===6;
	$end = microtime();
	$start = explode(' ', $start);
	$end = explode(' ', $end);
	write(((float)$end[0]+(float)$end[1]) - ((float)$start[0]+(float)$start[1]));
}
i12($arr);
function i21($arr) {
	write('比較演算子2-1');
	$start = microtime();
	for($i=0,$j=count($arr),$a=6;$i<$j;++$i)$arr[$i]==$a;
	$end = microtime();
	$start = explode(' ', $start);
	$end = explode(' ', $end);
	write(((float)$end[0]+(float)$end[1]) - ((float)$start[0]+(float)$start[1]));
}
i21($arr);
function i22($arr) {
	write('比較演算子2-2');
	$start = microtime();
	for($i=0,$j=count($arr),$a=6;$i<$j;++$i)$arr[$i]===$a;
	$end = microtime();
	$start = explode(' ', $start);
	$end = explode(' ', $end);
	write(((float)$end[0]+(float)$end[1]) - ((float)$start[0]+(float)$start[1]));
}
i22($arr);

write('*文字列の配列を操作');
for($i=0,$j=count($arr);$i<$j;++$i)$arr[$i]=''+$arr[$i];
function s11($arr) {
	write('比較演算子1-1');
	$start = microtime();
	for($i=0,$j=count($arr);$i<$j;++$i)$arr[$i]=='6';
	$end = microtime();
	$start = explode(' ', $start);
	$end = explode(' ', $end);
	write(((float)$end[0]+(float)$end[1]) - ((float)$start[0]+(float)$start[1]));
}
s11($arr);
function s12($arr) {
	write('比較演算子1-2');
	$start = microtime();
	for($i=0,$j=count($arr);$i<$j;++$i)$arr[$i]==='6';
	$end = microtime();
	$start = explode(' ', $start);
	$end = explode(' ', $end);
	write(((float)$end[0]+(float)$end[1]) - ((float)$start[0]+(float)$start[1]));
}
s12($arr);
function s21($arr) {
	write('比較演算子2-1');
	$start = microtime();
	for($i=0,$j=count($arr),$a='6';$i<$j;++$i)$arr[$i]==$a;
	$end = microtime();
	$start = explode(' ', $start);
	$end = explode(' ', $end);
	write(((float)$end[0]+(float)$end[1]) - ((float)$start[0]+(float)$start[1]));
}
s21($arr);
function s22($arr) {
	write('比較演算子2-2');
	$start = microtime();
	for($i=0,$j=count($arr),$a='6';$i<$j;++$i)$arr[$i]===$a;
	$end = microtime();
	$start = explode(' ', $start);
	$end = explode(' ', $end);
	write(((float)$end[0]+(float)$end[1]) - ((float)$start[0]+(float)$start[1]));
}
s22($arr);

結果

*数字の配列を操作
比較演算子1-1
0.0688788890839
比較演算子1-2
0.0615670681
比較演算子2-1
0.0762310028076
比較演算子2-2
0.063451051712
*文字列の配列を操作
比較演算子1-1
0.113929986954
比較演算子1-2
0.0609550476074
比較演算子2-1
0.123423099518
比較演算子2-2
0.0615451335907
*数字の配列を操作
比較演算子1-1
0.0963079929352
比較演算子1-2
0.0640721321106
比較演算子2-1
0.0713851451874
比較演算子2-2
0.0655879974365
*文字列の配列を操作
比較演算子1-1
0.12929391861
比較演算子1-2
0.0743482112885
比較演算子2-1
0.130146026611
比較演算子2-2
0.0655629634857
*数字の配列を操作
比較演算子1-1
0.0723650455475
比較演算子1-2
0.056412935257
比較演算子2-1
0.0732989311218
比較演算子2-2
0.0751008987427
*文字列の配列を操作
比較演算子1-1
0.132040023804
比較演算子1-2
0.0645160675049
比較演算子2-1
0.129715919495
比較演算子2-2
0.0672280788422

感想

現金なくらい速くなった。PHPでは今度から、できる限りこちらの厳密等価演算子を使うことにしよう。あと、一時変数に入れることは意味がないので、便利な方で良いと思った。
厳密等価演算子が遅いJavaScriptはエンジンがいろいろ頑張っているのか、データ構造が特殊なのか、そういうことが原因にある気がするけど、そこまで詳しくない。残念。