大量データのレポート出力処理を書いていたら、
線形じゃない形で出力時間が増えていくことになって、何かおかしいなって調査した結果です。
結果、 php の array_merge は使うんじゃない。
Centos7
php7.0.19
でこんな感じのソースで試す
※1から30000まで 5000刻みで配列追加を行う
結果
// use array_merge
5001 >> 0.40064096450806 s
10001 >> 2.418830871582 s
15001 >> 5.3260531425476 s
20001 >> 8.5192930698395 s
25001 >> 14.773620128632 s
// insert with []
5001 >> 0.00035500526428223 s
10001 >> 0.00072813034057617 s
15001 >> 0.0010349750518799 s
20001 >> 0.0013651847839355 s
25001 >> 0.0017449855804443 s
array_merge だと25000行追加するのに14秒
$arr[] = ”; の形だと 0.001秒
14.773620128632/0.0017449855804443 = 8466倍!
使い方が間違っているんだろうか。
—
追記
akiyanさんにコメントで教えていただきました。
@jakkrokk https://t.co/KBcM0cjMvJ ですが、https://t.co/6j4ReJHqsI は配列同士をマージする関数であって配列に追加していく関数ではないのでそもそもの用途が違うのではと思います。第二引数に配列以外を渡すと自動変換も挟んでそうです
— akiyan (@akiyan) 2017年6月19日
用途が違うってことですね。
php10年近く触っているのにまだまだ知らないことが多い・・・