2

始める前に、標準的なコーディング方法や「エチケット」について質問しているわけではありません。私の質問は、PHP の内部構造に対する好奇心からのものです。これまでの私の調査では、ほとんどの人が PHP のスコープについて混乱しているようです。

変数を再利用すると、メモリまたは速度のいずれかで、PHP に利点/不利益が生じますか? 科学について。

スクリプト全体で複数のファイルに順番にアクセスしているとします。

  • シナリオ A: ハンドルにはそれぞれ $file1、$file2、$file3 などの変数があります。
  • シナリオ B: すべてのハンドルが変数 $fp を再利用します

この理論的なシナリオでは、それぞれリソースを集中的に使用するスクリプトが問題になる必要がありますか? B はガベージ コレクションが古いハンドルを取り除くことを許可しますが、A は許可しませんか? いずれにせよ、Zend による最適化により、これは問題になりませんか?

4

2 に答える 2

4

この質問に対する簡単な答えはありません。最適化とパフォーマンスは、特定のコードベース、コードベースが実行されているプラ​​ットフォーム、サーバーで実行されている他のコードベースなどに大きく依存します。

シナリオから始めるには、曖昧すぎて適切な答えを提供できません。しかし、以前のコメント/懸念のいくつかに触れるために...

PHPには、ガベージコレクションに関する明確に定義されたルールがありません。THEORYシナリオでは、ガベージコレクションのおかげで関数が終了すると、Aはメモリを解放します。実際には、これはめったに起こりません。ガベージコレクションがそのメモリを解放する原因となるトリガーは多数ありますが、舞台裏では、実際の低レベルのfree()とmallocs()はカットアンドドライではありません。メモリスタックを注意深く観察すると、関数が$ file1、$ file2、$file3のメモリスペースを終了した後も残っていることがわかります。アプリケーション全体が終了するまで時々。

アプリケーションの構築によって、どちらが高速であるかも判断され、$ file1、$ file2、$ file3のシンボルテーブルに新しいエントリが作成されるか、$fpが何度も再利用されます。$ fpを再利用することは、理論上、通常、メモリスペースを再割り当てする必要がなく、新しいシンボルテーブルエントリと対応する管理オブジェクトを再作成する必要がないことを意味します。ただし、これが常に当てはまるとは限りません。$ fpの再利用は、destroyを最初に呼び出してからオブジェクトを再作成する必要があるため、実際には遅くなる場合があります。場合によっては、反復プロセスで新しい$ file1、$ file2、$ file3を作成し、ガベージコレクションを一度に実行する方が速い場合があります。

だから、このすべての一番下の行....

自分の遊び場で物事がどのように動作するかを学ぶには、ネイティブ環境で自分のアプリを分析してテストする必要があります。「常にこれを行う」または「決してそれを行わない」シナリオになることはめったにありません。

于 2012-06-20T00:35:57.873 に答える
0

私の答えには自信がありませんが、変数を再利用するとメモリが節約されることがわかりました。特に、クエリ結果に変数を再利用する場合は、それらの変数が他の多くの不要なものでいっぱいになることがよくあります。

使用できます

echo memory_get_usage()コード実行のさまざまな段階で違いを確認して比較します。

しかし、コードが大きくなり、人々が読みにくくなるにつれて、混乱を招く可能性があります。

また、スクリプトが完了すると、PHP はガベージ コレクションを実行します。したがって、変数の名前はおそらく関係なく、実行中に使用するメモリの量に影響します。

于 2012-06-20T00:20:22.083 に答える