C++プリプロセッサ#define
はまったく異なります。
PHPは、define()
単に変数を作成するのと何か違いがありますか?
define("SETTING", 0);
$something = SETTING;
vs
$setting = 0;
$something = $setting;
C++プリプロセッサ#define
はまったく異なります。
PHPは、define()
単に変数を作成するのと何か違いがありますか?
define("SETTING", 0);
$something = SETTING;
vs
$setting = 0;
$something = $setting;
「define」操作自体はかなり遅い - xdebug プロファイラーで確認済み。
http://t3.dotgnu.info/blog/php/my-first-php-extension.htmlのベンチマークは次のとおりです。
純粋な「定義」
380.785 フェッチ/秒
14.2647 平均ミリ秒/最初の応答
「hidef」拡張子で定義された定数
930.783 fetches/sec
6.30279 mean ms/first-response
リンク切れの更新
上記のブログ投稿はインターネットを離れました。ここでも Wayback Machine 経由で見ることができます。ここに別の同様の記事があります。
著者が参照するライブラリは、ここ (apc_define_constants)とここ (hidef 拡張)にあります。
一般に、定数の考え方は、 (おかしく聞こえますよね? ;))プログラム内で定数であることです。つまり、コンパイラ (インタープリター) は、スクリプト全体で "FOOBAR" を FOOBAR の値に置き換えます。
理論と利点についてはこれで終わりです-コンパイルする場合。現在、PHP は非常に動的であり、ほとんどの場合、PHP スクリプトは実行ごとにコンパイルされるため、違いに気付くことはありません。APC、Zend Optimizer、eAcceleratorなどのバイトコードキャッシュを使用しない限り、定数と変数の速度に顕著な違いは見られないはずです。それなら理にかなっています。
定数の他のすべての長所/短所は、既にここに記載されており、PHP マニュアルに記載されています。
php > $cat='';$f=microtime(1);$s='cowcow45';$i=9000;while ($i--){$cat.='plip'.$s.'cow';}echo microtime(1)-$f."\n";
0.00689506530762
php > $cat='';$f=microtime(1);define('s','cowcow45');$i=9000;while ($i--){$cat.='plip'.s.'cow';}echo microtime(1)-$f."\n";
0.00941896438599
これは、同様の結果で再現可能です。定数は、変数よりも定義および/または使用が少し遅いように見えます。
マニュアルとの違いは次のとおりです
私にとっての主な利点は、グローバルスコープです。私は確かにそれらの効率について心配しません-変更可能であってはならないグローバルスカラー値が必要なときはいつでもそれらを使用してください。
効率的ではないようです。(そして、ここでのすべての仮定は、php.net からの 1 つのコメントに基づいています。まだ自分でベンチマークを行っていません。)
定数の呼び出しには、変数の呼び出しの 2 倍の時間がかかります。
定数の存在を確認するには 2 ミリ秒かかり、誤検知の場合は 12 ミリ秒かかります!
これは、php のオンライン ドキュメントの定義ページのコメントからのベンチマークです。
defined() を使用する前に、次のベンチマークを見てください。
true 0.65ms
$true 0.69ms (1)
$config['true'] 0.87ms
TRUE_CONST 1.28ms (2)
true 0.65ms
defined('TRUE_CONST') 2.06ms (3)
defined('UNDEF_CONST') 12.34ms (4)
isset($config['def_key']) 0.91ms (5)
isset($config['undef_key']) 0.79ms
isset($empty_hash[$good_key]) 0.78ms
isset($small_hash[$good_key]) 0.86ms
isset($big_hash[$good_key]) 0.89ms
isset($small_hash[$bad_key]) 0.78ms
isset($big_hash[$bad_key]) 0.80ms
PHP バージョン 5.2.6、Apache 2.0、Windows XP
各ステートメントは 1000 回実行され、1000 回の呼び出しで 12 ミリ秒のオーバーヘッドが発生するため、エンド ユーザーが頭を悩ませることはありませんが、if(true) と比較すると興味深い結果が得られます。
1) if($true) は実質的に同一でした 2) if(TRUE_CONST) はほぼ 2 倍遅くなりました - コンパイル時に置換が行われていないと思います (これを再確認する必要がありました!) 3) defined() は定数が存在する場合は 3 倍遅くなります。 4) 定数が存在しない場合、defined() は 19 倍遅くなります。5) isset() は、何を投げても非常に効率的です (配列駆動イベント システムを実装している人にとっては朗報です - 私です!)
if(defined('DEBUG'))... を避けたい場合があります。
tris+php から tfconsulting dot com dot au 26-Mar-2009 06:40
定義は単純な静的な意味です。つまり、プロセスに沿ってその値を自由に操作できるため、変数は動的な意味ですが、実行時にその値を変更することはできません。
When I run speed tests, constants being set and dumped out run much a little faster than setting variables and dumping them out.
主な違い:
効率についてはわかりませんが、変数を作成するだけではありません。