「配列に要素があるかどうかをチェックするのに、こうやるよりもこうやる方が速い」

みたいな話をどっかで読んだ記憶があって、参考書をひっくり返したり検索したりしていたのだけど、自分の記憶にある文章がどうしても見つからなくて時間を使ってしまっていた…で、気付いた、そんなの自分でコード書いてベンチ取ればいいじゃん。ですよね。もし後日他の実装案が見つかったら追加すれば良いんだし。

といわけで、比べてみる。比較方法は次の2つ。

  1. if(count($array)) { return true; }
  2. if(!empty($array)) { return true; }

また$arrayが配列と解っている場合には、次でも空配列かどうかを判断できます。

  1. if($array) { return true; }

もちろん、$arrayが配列である事を確認するコストを含んでいないので参考で。


Pear::Benchmarkを使って取ったベンチマークは以下の通り。

ベンチマークに利用したコード

require_once 'Benchmark/Iterate.php';

$benchmark = new Benchmark_Iterate();
$a0 = null;
$a1 = array();
$a2 = array(0);

$benchmark->run(10000, 'count_test', array($a1));
$result = $benchmark->get(true);
var_dump($result['mean'] * $result['iterations']);

$benchmark->run(10000, 'empty_test', array($a1));
$result = $benchmark->get(true);
var_dump($result['mean'] * $result['iterations']);

$benchmark->run(10000, 'a_test', array($a1));
$result = $benchmark->get(true);
var_dump($result['mean'] * $result['iterations']);

function count_test($array) { return (count($array)) ? true : false; }
function a_test($array) { return ($array) ? true : false; }
function empty_test($array) { return (!empty($array)) ? true : false; }



ベンチマークの結果

1回目

count($array)0.2113
!empty($array)0.1820
($array)0.1815

2回目

count($array)0.2091
!empty($array)0.1849
($array)0.1857

3回目

count($array)0.2041
!empty($array)0.1860
($array)0.1839

4回目

count($array)0.2057
!empty($array)0.1850
($array)0.1829

5回目

count($array)0.2092
!empty($array)0.1870
($array)0.1876

countを使うよりもemptyで比較した方が平均で大体11%程度高速なようです。
参考案も大体同じくらい、ただまぁこれは…文字列も通しちゃうのでアレですな。

というわけで、チェックはemptyでやりましょうというアレで。
ああ、そうだったそうだった。