今更、というかバージョンによって結果は変わったりするのかもしれないけど、
ふと思い立ってPHP 8.2.7において単純配列の結合をarray_push
、array_merge
、スプレッド構文
のそれぞれの方法で速度比較してみました。
テストコード
<?php
$arr1 = ['Neo', 'Trinity', 'Morpheus', 'Niobe', 'Agent Smith'];
// array_push
$arr2 = [];
for ($st = microtime(true), $i = 0; $i < 10000; $i++) {
array_push($arr2, ...$arr1);
}
echo 'array_push: ', microtime(true) - $st, PHP_EOL;
echo count($arr2), PHP_EOL;
// array_merge
$arr3 = [];
for ($st = microtime(true), $i = 0; $i < 10000; $i++) {
$arr3 = array_merge($arr3, $arr1);
}
echo 'array_merge: ', microtime(true) - $st, PHP_EOL;
echo count($arr3), PHP_EOL;
echo 'arr2 and arr3 are ', $arr2 === $arr3 ? 'same' : 'not same', PHP_EOL;
// スプレッド構文
$arr4 = [];
for ($st = microtime(true), $i = 0; $i < 10000; $i++) {
$arr4 = [...$arr4, ...$arr1];
}
echo 'spread syntax: ', microtime(true) - $st, PHP_EOL;
echo count($arr4), PHP_EOL;
echo 'arr2 and arr4 are ', $arr2 === $arr4 ? 'same' : 'not same', PHP_EOL;
実行結果
array_push: 0.00033402442932129
50000
array_merge: 0.34223604202271
50000
arr2 and arr3 are same
spread syntax: 0.75221800804138
50000
arr2 and arr4 are same
まさかのarray_push
がダントツ。文字通り桁違いに速かったです。
短い配列同士では僅差の結果になりますが、何度も繰り返して結合後の配列が長くなればなるほど大差がついていきます。
多分array_merge
はキーの重複チェック、スプレッド構文
は結合済み配列の展開をしているから遅いんでしょうね。
array_push
は破壊的だし、かつては引数に配列が指定できなかったので、かれこれずっとarray_merge
しか使ってなかったのですが、スプレッド構文の登場以降は真価を発揮するようになったということでしょうか。
例外が無ければarray_push
に積極的にリプレースしていきたいところです。
コメント