PHPの配列は、普通の配列も連想配列も実際は順序付きMapです。
JavaであればArrayListやTreeMap等色々な配列があってややこしいのですが、PHPだと全部array()で楽ちん。
これは非常に便利なのですが、でも自由度があるぶん遅いです。
固定長配列しか扱えないかわりに高速化されたSplFixedArrayというものがありましたので使ってみます。
結果は以下のとおり。
array put: 0.25703620910645
array get: 0.061129093170166
SplFixedArray put: 0.11810994148254
SplFixedArray get: 0.13133406639099
挿入はSplFixedArrayが配列の約半分、でも取得は普通の配列のほうが早くてSplFixedArrayの約半分という微妙な結果になりました。
合計としてはSplFixedArrayに軍配があがりますが、それでも100万件で0.1秒差とかそういうレベルです。
よっぽど時間にシビアなシステムでもないかぎり、現状の配列をわざわざ差し替えるほどのものではないかなあと。
どちらかというと予め最大数を決めておきたい場合に使うとかになるでしょうか。
JavaであればArrayListやTreeMap等色々な配列があってややこしいのですが、PHPだと全部array()で楽ちん。
これは非常に便利なのですが、でも自由度があるぶん遅いです。
固定長配列しか扱えないかわりに高速化されたSplFixedArrayというものがありましたので使ってみます。
<?php
$max = 1000000;
$array = array();
$splFixedArray = new SplFixedArray($max);
$time=array();
// arrayにput
$time[1] = microtime(true);
for($i=0;$i<$max;$i++){
$array[$i] = $i;
}
$time[2] = microtime(true);
// SplFixedArrayにput
$time[3] = microtime(true);
for($i=0;$i<$max;$i++){
$splFixedArray[$i] = $i;
}
$time[4] = microtime(true);
// arrayからget
$time[5] = microtime(true);
foreach($array as $key=>$val){
$tmp = $val;
}
$time[6] = microtime(true);
// SplFixedArrayからget
$time[7] = microtime(true);
foreach($splFixedArray as $key=>$val){
$tmp = $val;
}
$time[8] = microtime(true);
いいかげんな計測方法ですがまあ気にしない。結果は以下のとおり。
array put: 0.25703620910645
array get: 0.061129093170166
SplFixedArray put: 0.11810994148254
SplFixedArray get: 0.13133406639099
挿入はSplFixedArrayが配列の約半分、でも取得は普通の配列のほうが早くてSplFixedArrayの約半分という微妙な結果になりました。
合計としてはSplFixedArrayに軍配があがりますが、それでも100万件で0.1秒差とかそういうレベルです。
よっぽど時間にシビアなシステムでもないかぎり、現状の配列をわざわざ差し替えるほどのものではないかなあと。
どちらかというと予め最大数を決めておきたい場合に使うとかになるでしょうか。
PR