こんにちは。 PHP 5.4から、[]
による配列の初期化ができるようになりました。
最近の言語やC言語ですら使える[]構文が今までPHPでは使用できませんでした。
従来、PHPで配列を生成するにはarray()
という関数を使用しなければなりませんでした。
[]
が使えるようになったので疑問に思ったのですが、array()
は関数です。
関数であれば多少なり呼び出しのオーバーヘッドがあるはず。
そのオーバーヘッドを考慮したらarray()
で配列を初期化するより[]
と書いたほうが高速なのでは?
という疑問が出たので検証します。
念のために、[]
で配列をどう記述するのかサンプルをお見せします。
<?php
// ~5.3での書き方
$list = array(1, 2, 3);
count($list); // 3
// 5.4~での書き方
$list = [1, 2, 3];
count($list); // 3
// もちろん連想配列も混合もOK
$list = ['a' => 1, 'b' => 2, 'c', 'd'];
// 混ぜてもOK
$list = array([1], [2], [3]);
$list = [array(1), array(2), array(3)];
では早速検証に移ります。
まずは添字配列です。
ベーシックな例から試してみます。
テストコードは以下の通りです。
ベンチマーク用のコードはモダンなPHPでのベンチマークの取り方様からお借りしました。
<?php
run(100000, array(
'bracket-idx' => function() {
$list = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
},
'function-idx' => function() {
$list = array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9);
}
));
title | total | % |
---|---|---|
bracket-idx | 0.4750 sec | 100.00% |
function-idx | 0.4964 sec | 104.49% |
思ったより同速。
**え? こんなもん?**と思って10回ほど試してみたのですが、一番差が大きかったのがこの結果でした。
だいたい100~102%くらいで落ち着きます。
オーバーヘッドが多少なりあるのかなと思っていましたが、
もはや構文のような役割を兼ねているarray関数は最適化がかかってたりするんでしょうか。
では連想配列ではどうなるのでしょう。
先ほどと同じベンチマーク関数を利用しています。
run(100000, array(
'bracket-assoc' => function() {
$list = ['a' => 0, 'b' => 1, 'c' => 2, 'd' => 3, 'e' => 4];
},
'function-assoc' => function() {
$list = array('a' => 0, 'b' => 1, 'c' => 2, 'd' => 3, 'e' => 4);
}
));
title | total | % |
---|---|---|
bracket-assoc | 0.4458 sec | 100.00% |
function-assoc | 0.4513 sec | 101.23% |
同速。悲しいほどに同速。
もう企画倒れです。何の差も出ません。
こちらも意図的に悪い結果がお見せできるように数値を選んだのですがこれです。
だいたい100~101%くらいの速度差で落ち着きました。
速度は誤差程度にしか変わりません。
そして、僅かな差ですが逆転することもあります。
どっちが早いとは言いがたい結果となりました。
ですが、せっかく計測したので、
今後のナウいPHPの発展を願い、この記事を残しておきます。涙。
他の言語からPHPをかじりに来た方や引っ越してきた方には嬉しい(あって当たり前な)構文だと思いますが、
古くからののPHPerの方だと、読みづらいんでしょうか。
ちなみに私は特にPHP好きでも嫌いでもないですが、[]
の方が見やすいです。