PHPクラスオブジェクトとメモリ使用量
1つのクラスのインスタンスが多数ある場合、クラス自体のサイズ(コードの行数、メソッドの数)は、必要なメモリに影響しますか?
使用頻度の低いメソッドの一部を他の場所に移動することで、メモリ使用量とパフォーマンスが向上するかどうか疑問に思っています。
答え :
解決策:
クラス定義は、 include() が実行されるときに、コンパイラによって1回だけ読み取られます。多くのクラスインスタンスをインスタンス化する場合、メソッドの数とコードの行数が、使用されるメモリの量に意味のある影響を与えることはありません。ただし、メンバー変数の数はもちろんメモリ使用量に影響します。
答え :
解決策:
この提案を嫌う人もいます。ただし、インスタンスに固有ではないメソッド/属性がクラスにある場合は、それらを静的メソッド/属性にします。非静的クラスのメソッド/属性は、インスタンス固有のもののみにする必要があります。
一般的に、これはメモリ使用量にはあまり役立ちません(属性を静的にするとメモリに役立ちます)。個々のインスタンスは非静的クラス属性のみを保持し、クラスメソッドはインスタンスの数に関係なく一度だけメモリに保持されます。静的属性はグローバルレベルで保持されるため(グローバルワークスペースと混同しないでください)、インスタンスの数に関係なく、メモリに保持されるのは1回だけです。
答え :
解決策:
オブジェクトのメモリ使用量は、配列のメモリ使用量と同等です。クラスは少し多くのバイトを食べます。ただし、一度に数千のオブジェクトを作成しない限り、これは測定できません(この場合、実際の問題は別の問題です)。
舞台裏では、常にクラス属性のディクショナリがあり、クラス定義には既存のメソッドに関連付けられたディクショナリがあります。後者はどちらの場合にも存在し、別のメソッドを追加するだけで数バイトが追加されます。実際、それはメイン関数ディクショナリにグローバル関数を登録するのと同じくらいです。
いいえ、クラス宣言でメソッドを避けてもメモリは節約されません。そのため、オブジェクト自体がより多くのメモリを使用しないため、これは賢明ではありません。メソッドリストはオブジェクトインスタンスに関連付けられていません。
同様の質問
私たちのウェブサイトで同様の質問で答えを見つけてください。