何千ものオブジェクトを作成および破棄するアプリケーションがあります。オブジェクトをキャッシュして再利用する価値がありますか、それともDelphiのメモリマネージャが十分に高速であるため、オブジェクトを複数回作成および破棄することは、(キャッシュを追跡するのではなく)それほど大きなオーバーヘッドではありません。パフォーマンスを向上させます。
7 に答える
最近のテストによると、オブジェクトの作成に費用がかからない場合 (つまり、外部リソースに依存しない場合 - ファイル、レジストリ、データベースへのアクセスなど)、Delphi のメモリ マネージャーを打ち負かすのは難しいでしょう。それは速いです。
もちろん、最近の Delphi を使用している場合も同様です。使用していない場合は、 SourceForgeから FastMM4 を入手して、Delphi の内部 MM の代わりに使用してください。
メモリ割り当ては、キャッシュが必要な理由のごく一部にすぎません。意味的に有効なオブジェクトを構築するための全コストを把握し、それをキャッシュから項目を取得するためのコストと比較する必要があります。これは、マイクロベンチマークのためだけではありません。実際に実行中のアプリケーションで。
別の言い方をすれば、それを測定して調べます。測定していない場合は、エンジニアリングではなく、推測にすぎません。
プロファイラーだけが教えてくれます。タイトなループで両方のアプローチを試して、上に何が出るかを確認してください:-)
このような質問に答えるには、実際の負荷で測定する必要があります。それらのオブジェクトに保持されているリソース、リソースの競合、構築コスト、サイズなどによっては、答えが驚くかもしれません。また、負荷の性質によっても変わる可能性があります。
通常、測定せずにパフォーマンスの問題がどこにあるかを判断することは非常に困難です。
これは、作成および破棄中にオブジェクトが実行するコードに依存すると思います。TObject.CreateおよびTObject.Destroyによる影響は通常無視でき、キャッシングのオーバーヘッドによって簡単に大きくなる可能性があります。
また、オブジェクトを作成した直後と再利用した場合、オブジェクトの状態が異なる場合があることも考慮する必要があります。
多くの場合、それを伝える唯一の方法は、それを試すことです。
現在のパフォーマンスが適切である場合、それを向上させるための呼び出しはあまりありません。ただし、パフォーマンスの問題がある場合は、キャッシュ(または実際には他の戦略)が役立つ場合があります。
また、特定のオブジェクト(インスタンス)が使用されている頻度に関する統計も必要になります。同じデータセットを定期的に参照している場合、キャッシュによってパフォーマンスが大幅に向上する可能性がありますが、アクセスがすべての可能なオブジェクトに分散されている場合は、キャッシュのミス率が高すぎて価値がない可能性があります。