質問
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フェッチ/秒
6.30279平均ミリ秒/最初の応答
リンク切れの更新
上記のブログ投稿はインターネットを離れました。引き続き表示できますこちらはWayback Machine経由。別の類似の記事があります。
作成者が参照するライブラリは、こちら(apc_define_constants)にあります。 およびこちら(hidef拡張機能)。
他のヒント
一般的に、定数の概念は、プログラム内で constant (おかしいですね?))です。これは、コンパイラー(インタープリター)が" 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
これは同様の結果で再現可能です。定数は変数よりも定義や使用が少し遅いように思えます。
- 定数の前にドル記号($)はありません;
- 定数は、単純な割り当てではなく、define()関数を使用してのみ定義できます。
- 定数は、変数スコープ規則に関係なく、どこでも定義およびアクセスできます。
- 設定された定数は再定義または未定義にできません。そして
- 定数はスカラー値にのみ評価できます。
私にとっての主な利点は、グローバルスコープです。私は確かにそれらの効率について心配しません-変更できないグローバルなスカラー値が必要なときはいつでもそれらを使用してください。
非効率的です。 (そして、私はここですべての仮定を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回の呼び出しでは、エンドユーザーが髪を引き裂くことはありません。 if(true)と比較すると、いくつかの興味深い結果がスローされます:
1)if($ true)は事実上同一2)if(TRUE_CONST)はほぼ同じ 2倍遅い-置換はコンパイル時に行われないと思います 時間(これを再確認する必要がありました!)3)defined()は3倍遅い 定数が存在する場合4)defined()は19倍遅い 定数は存在しません! 5)isset()は非常に効率的です あなたがそれを投げる(アレイを実装している人にとって素晴らしいニュース 駆動型イベントシステム-私!)
if(defined( 'DEBUG'))...を避けたい場合があります...
tfconsulting dot com dot auのtris + phpから2009年3月26日06:40
定義は単純な静的な意味です。つまり、変数は動的な意味ですが、プロセス中に値を自由に操作できるため、実行中に値を変更することはできません。
主な違い:
- 定義は定数、変数は変数です
- 異なるスコープ/可視性
速度テストを実行すると、変数を設定してダンプするよりも、設定およびダンプされる定数の方がはるかに速く実行されます。
効率についてはわかりませんが、varを作成するだけではありません:
- これは定数です。この設定を再定義または再割り当てすることはできません。
- 定義が見つからない場合、$ somethingが" SETTING"に設定されます。これは、たとえばi18nで便利です。翻訳が欠落している場合(つまり、対応する定義がローカリゼーションファイルである場合)、大文字の大きな単語、かなり目に見える...