2012-01-21 4 views
2

オブジェクトを扱う際のパフォーマンスに関してかなりの質問です。現在ZF2を使用していて、私のゲームで物事を複製しようとしています。PHPでの高性能なOOP

私には地形の地図があります。各地形には名前と説明があります。

説明は200〜500語の長さの間である可能性があります。私が何百、何千ものこれらのオブジェクトのマップを構築している場合は、パフォーマンスの面では、どこに記述するのが良いでしょうか。

それがあった場合はそのようなプロパティ:私はをループしてマップ上にこれらのオブジェクトを置くか、PHPの最適化を行いますよ、それは言う作成します

public $description = 'Blah blah blah.... 500 chars long'; 

....千×500バイトの説明と例えば、説明は、要求されるまで$obj->descriptionまで作成されません。その場合は、それは

public getDescription() { 
    return "Blah blah blah.... 500 chars long"; 
} 

.....のような方法であることだった場合、それはオブジェクトの作成上のメモリに追加されませんので、その後、これはより少ないメモリを使用しているだけで、それを呼び出すことでそれを要求しますか?

私はこれらを別々のビューファイルに入れることができると思いますので、HTMLを使用して何か面白いことをすることができます。私はこれが究極の解決策だと思いますが、私はPHPがメモリをどのように処理するかを見ています...どこにいても私は何か情報を見つけることができますか?

ありがとう、Dom

+0

オブジェクトごとに別々のクラスがありますが、その中には何千ものものがありますか?それは効率的なデザインのようには聞こえません... – lonesomeday

+1

すべての説明は異なりますか? –

+0

"これは、オブジェクトの作成時にメモリに追加されず、呼び出し時にのみ要求するため、メモリを少なくしているのですか?" - テストしましたか? – TimWolla

答えて

1

同じクラスのオブジェクト間で説明は同じですか?同じクラスのオブジェクト間で共通の値に静的属性を使用します。

+0

私はむしろ説明オブジェクトを使用して、説明が必要なオブジェクトに渡したいと思っています – Gordon

+0

Gordonと同意します。 *異なる属性値*ではなく、異なる*動作*に対して異なるクラスを使用する必要があります。メモリフットプリントの面では、各オブジェクトに説明をコピーするよりもまだ軽量です。 –

+0

私はマット・ザンドラのOOPのパターンとプラクティスを読んできましたが、それまでは理論レベルでしか実際には得られませんでした。構成の異なるユニットタイプからなる軍隊のように。理論レベルでは理にかなっており、私は多分PHPが物事の記憶面を担当していると考えました。あなたが5,000人の足跡オブジェクトタイプの軍隊を言うならば、それは本当に1を作成し、まったく同じならそのタイプのtheres 5,000を言うためにそれを最適化するだけです。 –

0

私は確かに言うことはできませんが、文字列はコード内に存在するためメモリに存在する必要があるため、提案した内容に違いがあるとは思われません。関数が呼び出されるまで変数に代入されません。 (ただし、100の異なる変数に対して同じ関数を100回呼び出すと、になります。関数呼び出しによってその領域の一部を保存することができますが、処理時間)。

あなたはsome documentation on memory management in PHP

に興味がある可能性がありここでカップル迅速な思考interesting book

です:

  • パフォーマンスがRAM以上のものです。処理時間です。簡単に言えば、関数呼び出しを行うと処理時間が増えます(アセンブリ言語トレーニングをお持ちの場合は、プロセッサ・サイクルが数回かかることがわかります)。現代のプログラマにとってはこれは比較的控え目ですが、mallocのようなCの関数は実行に時間がかかりますので、メモリを割り当てるための呼び出しを減らす方が良いでしょう。
  • 静的なデータの場合は、staticキーワードを使用してください。急速に変更された場合は、MySQLなどのデータベースを調べるか、XMLまたはJSONでデータを解析する方法を調べます。
+0

「メモリ管理に関する公式のPHPドキュメント」*として書かれているリンクは、実際には「コアでのPHP:Zend Engineへのハッカーの手引」* –

+1

meh、「php.com」を見て、使い慣れたレイアウトで、私はちょうど... – cegfault

+0

クールで、どのようにコアで動作しているかを知ることは良いでしょう。現在、私は読んだことのベストプラクティスのみを使用しようとしていますが、私が完全に理解していないか、それがどのように深く働くかを知ることができないため、自分の決定を下すのが難しい場合があります –

0

これらが同時にあなたのPHPのメモリ内の記述の何千ものを避けるには、2つの方法があります。

同じ説明を共有する別のステレオタイプの(限られた)数がある場合、あなたは整数定数を使用することができますステレオタイプを識別し、説明が必要なときに定数を説明に変換する関数(通常は静的メンバ)を作成します。

各オブジェクトの説明が異なるが、一部の外部データソース(PHPメモリではない)から取得されたオブジェクトの場合は、必要なときにそのデータソースから記述を取得することを検討することもできます。

さらに、各ページリクエストで同じ記述をメモリにロードする必要がある場合は、MemcacheまたはRedisなどのいくつかのタイプのキャッシュの使用を検討し、必要に応じて関連する説明を取得することもできます。

0

フライウェイトとプロキシのパターンを調べます。