結論
変数に配列を代入する時点で初期化$a = [1]
したほうが速い
環境
経緯
うちのコーディングは社内的な癖があったりなかったりします。1
そのうちの一つとして、
「配列は空で宣言し、その後に追加する」
というものがります。
こんなコード。
$a = [];
$a['hoge'] = 'HOGE';
$a['huga'] = 'HUGA';
個人的には、読みづらいし文字数増えるしミスが入りやすいしでいいことはないと思うのです。
しかし、結果・出力には違いがない。
別に初期化で作れという規約があるわけでもない。2
そのためか、初期化しましょうと言ってもなかなか受けが良くない気がする。
速度にしても初期化の方が速いとは予想していても、調べてないので説得力がでない。
できれば初期化で配列を作ることを浸透させたいので、速度的にメリットがあるという証拠を突き付けて駆逐していきたい。
計測
計測コードは
今すぐできるPHP高速化 5つのポイント
からお借りしました。
結果は約2倍ほど初期化が速い。
ただし、10万回繰り返して差は0.005秒しか変わらない。
でも結果が同じなら少しでも速いほうがいいはず。
代入
<?php
//計測回数
define('COUNT',10);
//試行回数
define('TEST_COUNT',100000);
//小数点桁数
define('DECIMAL_DIGITS',10);
//平均値
$average = 0.0;
for($i = 0; $i < COUNT; $i++) {
$start = microtime(true);
for($j = 0; $j < TEST_COUNT; $j++) {
//計測対象
$a = [];
$a[] = 1;
$a['a'] = 'A';
$a['b'] = 'B';
}
$end = microtime(true);
$result = $end - $start;
echo number_format($result,DECIMAL_DIGITS)."秒\n";
$average += $result;
}
//平均値の出力
$average = number_format($average/COUNT,DECIMAL_DIGITS);
echo 'avarage:'. $average.'秒<br>';
0.0094299316秒
0.0101590157秒
0.0111100674秒
0.0102610588秒
0.0099561214秒
0.0111129284秒
0.0110650063秒
0.0102789402秒
0.0110731125秒
0.0111088753秒
初期化
<?php
//計測回数
define('COUNT',10);
//試行回数
define('TEST_COUNT',100000);
//小数点桁数
define('DECIMAL_DIGITS',10);
//平均値
$average = 0.0;
for($i = 0; $i < COUNT; $i++) {
$start = microtime(true);
for($j = 0; $j < TEST_COUNT; $j++) {
//計測対象
$a = [
0 => 1,
'a' => 'A',
'b' => 'B'
];
}
$end = microtime(true);
$result = $end - $start;
echo number_format($result,DECIMAL_DIGITS)."秒\n";
$average += $result;
}
//平均値の出力
$average = number_format($average/COUNT,DECIMAL_DIGITS);
echo 'avarage:'. $average.'秒<br>';
0.0053119659秒
0.0049719810秒
0.0057301521秒
0.0058169365秒
0.0058898926秒
0.0071680546秒
0.0057520866秒
0.0060698986秒
0.0059280396秒
0.0063500404秒
オマケの文字カウント
$a = [];
$a[] = 1;
$a['a'] = 'A';
$a['b'] = 'B'
スペースあり:44文字
スペースなし:36文字
$a = [
0 => 1,
'a' => 'A',
'b' => 'B'
];
スペースあり:50文字
スペースなし:28文字
変数名が長く、要素が増えると初期化がもっと有利になるはず。