1つのオプションは一般的に他のオプションよりも高速ですか?
オプションA:$var = $_GET['param'];
次にスクリプトを参照$var
します。
オプションB:$_GET['param']
スクリプトを介して各オカレンスを参照します。
ありがとう!
6 に答える
パフォーマンスの違いは無視できる程度であり、努力する価値はありません。マイクロタイムを試みたとしても、その違いはランダムな要因によって消費されます。
ただし、オプションAは、より持続可能なコードを作成するという点で優れています。たとえば、値を変更したい場合$var
は、コード内の1つの位置から変更できます。
簡単に言えば、これがプログラムのボトルネックになることは決してありません。
10000000
ループでベンチマーク
$var = "bleh";
for ($i=0; $i<10000000; $i++) {
strlen($var);
}
と
$array = array();
$array['blah'] = "bleh";
for ($i=0; $i<10000000; $i++) {
strlen($array['blah']);
}
結果:
- Var: ループあたり 8.563 秒 - 856.3 ナノ秒
- 配列: ループあたり 8.699 秒 - 869.9 ナノ秒
1.6% の速度差。
この種のマイクロ最適化について考える価値はほとんどありません。一般的には、コードをどのように構築するのが最善かを考え、そのような問題は言語のランタイムを書いている人々に任せるのが最善です。
どれがより効率的かを本当に知りたい場合、関連する多くの要因があります。
['param']
配列アクセスが1 回または複数回実行する仕組み- などのスーパーグローバルがどのよう
$_GET
に実装されているか - 代入の実装方法 (PHP では「copy on write」を使用)
- コードを渡す方法
$var
(関数パラメーターなど) とその実装方法 - 変数から読み取る必要がある頻度
- 変数に書き込む頻度
他にもたくさんあると思います。もちろん、プログラムとその実行中の PHP ランタイムの両方が、これらすべての点で変更される可能性があります。
間違ったレベルの最適化について心配していると言う人たちに同意しました。(ただし、本当にこの種のことに執着したい場合は、http://www.phpbench.com/をチェックしてください)
最適化の最初のレベルは、コードの可読性と保守性を最適化することです。人間の時計の周期は、コンピューターの時計の周期よりもはるかに価値があり、高価です(一般的に言えば)。追加のボーナスとして、人間の時計サイクルを最適化することでコードが非常に高速になる頻度に非常に驚かれることでしょう。
コーディングスタイルの優れたガイドとして、RobertC.MartinによるCleanCodeを強くお勧めします。
A:
$var = $_GET['param']; // and then referencing $var through the script.
コンピューター サイエンスではゼロに等しい一定の時間が必要です。
B: 参照
$_GET['param']; // in each occurrence through the script.
醜いアプローチであり、「ずさんな」プログラマーによってのみ行われます。
1 つのページまたは複数のページで 10 回使用する必要が$_GET['param']
あり、'param' を 'p' または 'parameter' に変更することにしたとします。
'マジック ナンバー' と 'マジック バリュー' を変数 (または定数) に初期化して、後で編集できるようにしたい場合、プログラマー (それがあなたであろうと他の誰かであろうと) は、それが何であるかを正確に知る必要はありません。 .
プログラマーが使用するかどうか想像してみてください
if($number == 3.1415)
それ以外の
if($number == $pi)
それは同様の基礎に帰着します。
したがって、いいえ、どちらのオプションも一般的に理論的には高速ですが、オプション B は後で地獄をもたらし、醜いです。
可能な限り $_GET['param'] を使用してください。PHP は $_GET['param'] を覚えておく必要があります。$_GET['param'] に等しい変数を作成することで、PHP はまったく同じ 2 つの変数を記憶する必要があります。
新しい変数の値を変更しない限り、$_GET['param'] を使用する方が高速です。(単に読みやすくするために新しい変数を作成することを好む人もいることに注意してください)