2011-10-14 15 views
21

私の現在のWebアプリケーションは約30程度の定数(DEFINE())を使用しています。私は変数がより速いことを読んでいる。変数の上書きを避けるための命名規則があるならば、私が見る他の唯一の欠点は、これらの変数をどのようにどのようにグローバル変数として定義しなければならないかということです。どちらが速いですか?定数、変数または変数配列

どちらが高速ですか?私はこれらの定数をアプリケーション全体を通してたくさん使用しています。おそらくリストに追加することは永遠にあり、関数とクラスの内外で使用されます。

+15

"時期尚早な最適化はすべての悪の根源です"。どんな違いがあっても差し支えないのであれば教えてください) – KingCrunch

+4

保存時間がとてもスリムで、それは本当に考慮する価値がありません。 –

+0

この最適化にはいつ価値がありますか?定数を参照するたびにコストがかかりますか?そしてそれはあなたが変数を参照するときよりも何ですか?これらの30の定数は各ページの参照100です。 – David

答えて

23

define()を使用して定義された定数は、PHPではかなり遅いです。人々は実際にパフォーマンスを向上させるために拡張機能(hidefなど)を書きました。

しかし、多くの定数がある場合を除き、これは大きな違いはありません。

PHP 5.3以降では、const NAME = VALUE;を使用してコンパイル時定数を使用することもできます。それらははるかに高速です。

+4

荷物の確定は何ですか?私はページあたり1回100秒を参照している約30個を持っています – David

+1

@David 30はあまりありません。数百もの定数で問題が発生する可能性があります。 – NikiC

11

違いは非常に小さくなります(マイクロ最適化)。アプリケーションのグローバル名前空間を汚染しないように、Classname::CONSTANTでアクセスできるように、いくつかの定数をクラスにカプセル化する方がよいでしょう。

-1

また、スピードの差が必然的であるとは想像もできません。確かに本当のことは、変数は多くの場合定数よりもはるかに使いやすいということです。

しかし、実際の問題は、構成データがたくさんあり、関数に多数の変数を渡す必要がないか、すべての変数をグローバルにする必要があるということです。

誰もがうまくいく答えはありませんが、一般的な解決策は、レジストリクラスを使用するか、自分で作成することです。これはphp配列を宣言することで簡単に行うことができます。次に、レジストリオブジェクトを初期化し、関数とクラスは静的メソッド呼び出しによってアクセスします。スニペットを提供するのではなく、例としてzend_configzend_registryを紹介します。 ZFはこれらの機能を提供していますが、プロジェクトでZFを使用しないようにするために、簡単な形式で再作成することは特に難しくありません。

7

は、簡単なテストを定義定数(define('FOO', 'bar');)が変数($foo = 'bar';)を定義するが、定義された使用よりも約16〜18倍遅いことが示されました(定数)値は約4〜6倍速くなります。

関連する問題