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.のケースでしたのでこれにならってやってみることにします。
ということで、ぬるい温度で調べてみた結果でしたが、
この結果は間違っている! や もっと詳細にしらべた!
というご意見ご感想がありましたら、ぜひ調査結果を教えてください!
最後に今回のテストコードを置いておきます。
汚いコードですが、参考まで。
それでは、また次回!