10

この質問は以前にここで尋ねられましたが、実際に尋ねられた質問に実際に答えようとした回答はなかったので、別の方法で質問しています。数百の関数を含む 20,000 行の単一のクラスをロードすることは、コードをそれぞれの関数が少ない小さなクラスに分割し、必要に応じてこれらの小さなクラスをロードするよりも、リソースを集中的に使用しますか?

4

2 に答える 2

6

スクリプトまたはクラスが大きいほど、インスタンスごとにより多くのメモリが使用されます。デフォルトでは、PHP にはライブラリとクラスのメモリ空間を共有する方法がないため、Web サイト用の大規模なスクリプトを作成することはお勧めできません。

典型的なアプローチは、スクリプトを実行するために実際に必要なものだけをスクリプトごとに含める必要があるように、クラスをブロックに分割することです。

また、大量のトラフィックがない限り、パフォーマンスの問題が発生する可能性は低く、クラスをリファクタリングするよりも簡単に問題を解決できる可能性があります。

スクリプトが読み込まれると、それを解析するために一定量のメモリが必要になります。サイズが大きいほど、より多くのメモリが必要になります。次に、スクリプト自体が実行され、トップレベル コード (クラスまたはグローバル関数ではない) が実行されます。これに require/include ステートメントが含まれている場合、それらのスクリプトが読み込まれます (必要な場合)。オブジェクトを作成すると、より多くのメモリが必要になります。

ただし、クラスの各インスタンスのサイズは、格納されているデータによってのみ影響を受けます。この修正はさておき、ここでのアドバイスは的を射ています: 責任に基づいてクラスを分けてください。この理由は、パフォーマンスよりも開発の容易さに関係しています。静的メソッドで満たされた 1 つのモンスター クラスがあるとします。アプリケーションがリクエストごとにこれらのメソッドのほとんどを使用する場合、両方のスクリプトがロードされることになるため、分割してもパフォーマンスは向上しません。ただし、メソッドを論理サブシステムにグループ化できれば、理解しやすく、操作しやすくなります。

于 2010-12-26T19:57:43.823 に答える
4

1つの大きなクラスは、バイナリコード(オペコード)にコンパイルするために1サイクルを必要とします。

より少ないメモリを使用するが、より多くのコンパイルを必要とする多くの小さなクラス、およびコンパイルのためのメモリ使用量は蓄積されます。

実行時に含まれているクラス/ファイルの数に実際に依存します。

したがって、これに対する解決策は、複数のクラスに分割して、APCまたは同等のものを使用します。

PS: PHPはソースをオペコードに再コンパイルする必要がないため、大きなファイルのメモリ消費量ははるかに少なくなります(大きなクラスを小さなものに分割するのを嫌がる場合)

于 2010-12-26T20:26:29.400 に答える