3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

PHPの配列の作成は初期化と代入のどちらが速いのか

Last updated at Posted at 2016-07-21

結論

変数に配列を代入する時点で初期化$a = [1]したほうが速い

環境

Docker PHP:7.0.8

経緯

うちのコーディングは社内的な癖があったりなかったりします。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文字

変数名が長く、要素が増えると初期化がもっと有利になるはず。

関連

forの公式通りの最適化 at 低回数 - Qiita

  1. 誰も理由を知らず、既存コードの真似をしたりする伝承レベル。
    初使用前にunset()とか、引数は一度変数に入れるとか。

  2. このレベルを規約にしたら膨大な量になりそうですね。

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?