SOFTELメモ Developer's blog

会社概要 ブログ 調査依頼 採用情報 ...
技術者募集中

【php】define()は遅いのか

問題

define()って遅いんですか?

調査結果

大量のdefine()で定数を定義をした場合と、大量の変数を定義をした場合を比較した。

・test1.php

<?php
define('D_0', '0');
define('D_1', '1');
define('D_2', '2');
define('D_3', '3');
define('D_4', '4');
define('D_5', '5');
define('D_6', '6');
...(以下10000まで)

・test1.php

<?php
$D_0 =  '0';
$D_1 =  '1';
$D_2 =  '2';
$D_3 =  '3';
$D_4 =  '4';
$D_5 =  '5';
$D_6 =  '6';
...(以下10000まで)

実行結果

# time php test1.php
real    0m0.088s
user    0m0.059s 定数定義 10000回
sys     0m0.015s

# time php test2.php
real    0m0.158s
user    0m0.136s 変数定義 10000回
sys     0m0.009s

さらに10万回の場合のテスト

# time php test1.php
real    0m0.580s
user    0m0.481s 定数定義 100000回
sys     0m0.084s

# time php test2.php
real    0m11.909s
user    0m11.846s 変数定義 100000回
sys     0m0.046s

定義自体はdefineが速い。

変数の定義は回数が多くなると異常に遅くなる。

変数の定義にはメモリの確保や付随する処理が多くあるのだろうか。他に違う点といえば、定数にはスカラデータ(boolean, integer, double, string)が指定できるが、変数はさらに配列やresource型なども格納できて、変数の方が高機能。

参照するときは変数の方が若干速いのだが。

メモリ使用量も気になって、スクリプトの最後に memory_get_usage() を追記して確認したが、10万回のとき、変数定義は24MBの方が、定数定義define()は31MBで、変数定義の方がメモリの使用量は少なかった。

1つのスコープの中に100万個も変数を定義するという、通常あまりなさそうなことをしてみた。結果はなかなか面白かった。

関連するメモ

コメント