PHP

配列の結合の速度を比較してみたら、まさかの結果だった

今更、というかバージョンによって結果は変わったりするのかもしれないけど、
ふと思い立ってPHP 8.2.7において単純配列の結合をarray_pusharray_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に積極的にリプレースしていきたいところです。

スポンサーリンク
記事を書いた人

システムえんじにゃー🐈
趣味はエレキギター、自転車など。作曲したい。
World of Warshipsやってます。
記事に関する質問はお気軽にどうぞ。

surface0 (さーふぇす)をフォローする

コメント

タイトルとURLをコピーしました