PHP 配列処理とパフォーマンス

やっと技術系の記事を書いてみます。こんにちは、光永です。
Symfony2で作成しているシステムのパフォーマンス改善を行っていたのですが、そこでちょっと気になったことがあり調べてみました。
テーマは「PHPの配列作成処理って何が正しいの?」です

規則性を持った配列生成のコードを書いてみました。

テストコード >>>>>>>>>>>>>>>>>>>>>>

$count = 100000; //繰り返す回数

function getStr(){
   return "AAA";
}
// a-A
$array1 = array();
for($i = 0; $i< $count; $i++){
   $a = getStr();
   $array1[] = array('a' => $a, 'b' => 'B');
}

// a-B
$array2 = array();
for($i= 0; $i< $count; $i++){
   $array2[] = array('a' => getStr(), 'b' => 'B');
}

// b-A
$array3 = array();
for($i= 0; $i< $count; $i++){
   $a = getStr();
   $array3[] = $a;
}

// b-B
$array4 = array();
for($i= 0; $i< $count; $i++){
   $array4[] = getStr();
}

<<<<<<<<<<<<<<<<<<<<<<<<<

ちなみに条件は以下です。
1)ループで配列を作成
2)格納先
.  a.連想配列(キーは文字列/値は2つずつ)
.  b.配列(キーは自動採番/値を1つずつ)
3)パターン
.  A.値の取得処理メソッドの戻り値を一旦変数に格納後、配列に追加
.  B.値の取得処理メソッドを呼び出し、結果を直接格納する

各々作成処理を10万回回し、測定はmicrotime関数で 結果 = 終了時間 – 開始時間 として行いました。

処理結果 >>>>>>>>>>>>>>>>>>>

  • a.連想配列
  • A   0.23364520072937
  • B   0.29721593856812
  • b.配列
  • A   0.21791481971741
  • B   0.17324304580688

<<<<<<<<<<<<<<<<<<<<<<<

おお・・・差が出ている・・・。
連想配列でまとめて値を格納した場合と、配列に1つずつ格納したケースは結果が速度が逆転しています。理由がわからないのがもやっと点ですが、調べたかったことはわかりました!

ちなみに今回使いたかったのはSymfony2のフォームクラスの定義で、a.のケースでしたのでこれにならってやってみることにします。
ということで、ぬるい温度で調べてみた結果でしたが、
この結果は間違っている! や もっと詳細にしらべた!
というご意見ご感想がありましたら、ぜひ調査結果を教えてください!
最後に今回のテストコードを置いておきます。
汚いコードですが、参考まで。

それでは、また次回!