【PHP】配列要素追加処理のベンチマーク

PHP

配列へ要素を追加する処理のベンチマークを実施してみました。

配列への要素追加処理

今回ベンチマークを実施したのは次の処理です。

  • array_push()
  • 角括弧 []
  • 配列結合演算子 +=
  • array_merge()
  • 配列展開演算子 […]
  • ArrayObject

array_push()

この配列関数の使い方の例は次の通り。

<?php

$a = [1, 2, ];
array_push($a, 3);
print_r($a);

既存の配列 $a の最後に、整数 3 を要素として追加しています。

実行結果:

Array
(
    [0] => 1
    [1] => 2
    [2] => 3
)

角括弧 []

角括弧での配列要素追加の仕方の例は次の通りです。

<?php

$a = [1, 2, ];
$a[] = 3;
print_r($a);

処理内容は前項と同じです。

実行結果も前項と同じです。

配列結合演算子 +=

配列結合演算子は、2つの配列を結合してくれます。

$a + $b

とした結果、配列$bの中に、$a にないインデックスの要素が

あれば、$aにその要素を追加してくれます。

本来の使い方の例は公式サイトにあります。

PHP: 配列演算子 - Manual

配列結合演算子 += による配列要素追加の例は次の通りです。

<?php

$a = [1, 2, ];
$a += [count($a) => 3]; // same as: $a = $a + [3];
print_r($a);

ここでは、既存配列の最後に追加したいので、

追加する配列のインデックスとして、$aの要素数 count($a) を指定して、その要素として 整数 3 を指定しています。

実行結果は前項と全く同じです。

配列展開演算子 […]

配列展開演算子(アンパック演算子)の具体的な使い方は

公式サイトにわかりやすい例があります。

PHP: 配列 - Manual

配列展開演算子を使って配列の最後に要素追加する例は次の通りです。

<?php

$a = [1, 2, ];
$a = [...$a, 3];
print_r($a);

既存配列 $a の追加代入式の角括弧内で、

既存配列 $a の全要素を展開演算子で展開( …$a )し、

その後ろに整数 3 を追加しています。

実行結果は前項と全く同じです。

ArrayObject

これは配列をオブジェクト化して扱うためのものです。

詳細は公式サイトを参照してください。

PHP: ArrayObject - Manual

ArrayObjectを使って配列の最後に要素追加する例は次の通りです。

<?php

$a = new ArrayObject([1, 2, ]);
$a->append(3);
print_r($a);

ArrayObject を new する時点で引数に配列を渡します。

最後の要素を追加する際には、appendメソッドを使います。

実行結果は次の通りです。

ArrayObject Object
(
    [storage:ArrayObject:private] => Array
        (
            [0] => 1
            [1] => 2
            [2] => 3
        )

)

ベンチマークスクリプト

Gistに掲載しておきました。

ベンチマーク結果

上記Gistのコメントに掲載しておきました。

1回目:

            array_push() =>	Time: 0.004728 sec.
      square brackets [] =>	Time: 0.002071 sec.
       union operator += =>	Time: 0.003370 sec.
           array_merge() =>	Time: 0.105991 sec.
unpacking operator [...] =>	Time: 0.311016 sec.
             ArrayObject =>	Time: 0.006851 sec.

2回目:

            array_push() =>	Time: 0.004765 sec.
      square brackets [] =>	Time: 0.002110 sec.
       union operator += =>	Time: 0.003569 sec.
           array_merge() =>	Time: 0.107618 sec.
unpacking operator [...] =>	Time: 0.330064 sec.
             ArrayObject =>	Time: 0.004905 sec.

3回目:

            array_push() =>	Time: 0.004920 sec.
      square brackets [] =>	Time: 0.002054 sec.
       union operator += =>	Time: 0.003514 sec.
           array_merge() =>	Time: 0.113861 sec.
unpacking operator [...] =>	Time: 0.300871 sec.
             ArrayObject =>	Time: 0.004863 sec.

4回目:

            array_push() =>	Time: 0.005846 sec.
      square brackets [] =>	Time: 0.002054 sec.
       union operator += =>	Time: 0.003339 sec.
           array_merge() =>	Time: 0.106517 sec.
unpacking operator [...] =>	Time: 0.360666 sec.
             ArrayObject =>	Time: 0.005932 sec.

5回目:

            array_push() =>	Time: 0.005791 sec.
      square brackets [] =>	Time: 0.002138 sec.
       union operator += =>	Time: 0.004024 sec.
           array_merge() =>	Time: 0.118922 sec.
unpacking operator [...] =>	Time: 0.393219 sec.
             ArrayObject =>	Time: 0.005309 sec.

結論

1位: 角括弧 [] での追加が圧倒的に最速でしたね。

2位: 意外と結合演算子が早かったです。

    毎回 count() してるのが負荷になるかと思いましたが。

3位: array_push() が3位とは。。

4位: ArrayObject は array_push() と同じくらいでしたね。

5位: array_merge() は2桁遅いです

6位: 配列展開演算子はコストが高いです。

   array_merge() の2倍。。

コメント

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