2

私のプロジェクト (Delphi 6 で実行中!) には、メモリ割り当てのリスト (TMemoryAllocation) が必要です。このリストは、割り当てのサイズ (FSize) と、割り当てが使用中か解放されているか (FUsed) に関する情報も保持するオブジェクト内に保存します。 . 私はこれを基本的に GarbageCollector として使用し、メモリの割り当て/割り当て解除のアプリケーションを常に維持する方法として使用します (そして、必要な割り当て/割り当て解除がたくさんあります)。

私のプロジェクトで割り当てが必要になるたびに、リストを検索して、必要なサイズに適合する空き割り当てを見つけます。それを実現するために、単純な for ループを使用します。

for I := 0 to FAllocationList.Count - 1 do
begin
  if MemoryAllocation.FUsed and (MemoryAllocation.FSize = Size) then
...

アプリケーションの実行時間が長くなるほど、このリストは数千項目に増え、非常に頻繁に (1 秒あたり数回) 実行するため、速度が大幅に低下します。

このソリューションを加速する方法を見つけようとしています。割り当てのサイズで TList をソートすることを考えました。その場合、すべての呼び出しで必要な特定のサイズのリストにアクセスするためのインテリジェントな方法を使用する必要があります。これを行う簡単な方法はありますか?

私が考えていた別の方法は、2 つの TList を持つことでした。1 つは未使用の割り当て用で、もう 1 つは使用済みの割り当て用です。つまり、あるリストから TList.Items を抽出し、常に別のリストに追加する必要があります。そして、(現在は) 小さいリストを調べるには、for ループを使用する必要があります。これは正しい方法でしょうか?

他の提案も歓迎です!

4

1 に答える 1

5

いくつかの可能性があります:

  • もちろん、実績のあるメモリ マネージャーをFastMM4として使用するか、マルチスレッド アプリケーションの拡張性を向上させる専用のものを使用してください。
  • 車輪の再発明。

アプリケーションがメモリ割り当てに非常に敏感な場合は、おそらく車輪の再発明に関するフィードバックがあります。

  • たとえば 16 バイトの倍数ごとにブロック サイズを活用し、ブロック サイズごとに 1 つのリストを維持します。これにより、適切なブロックの「ファミリー」にすばやく到達でき、個々のブロック サイズをメモリに格納する必要がなくなります (32 バイトに独自のブロック サイズがある場合)。バイトリスト、これは 32 バイトのブロックです);
  • 再割り当てが必要な場合は、メモリ コピーを減らすための最適な増加要因を推測してみてください。
  • ブロックをサイズごとに並べ替えてから、バイナリ検索を使用します。これは、単純な for i := 0 to Count-1 ループよりもはるかに高速です。
  • リストに削除されたアイテムのブロックを保持し、新しいアイテムが必要なときに検索します (アイテムを削除する必要はありません。無料としてマークするだけです。リストが巨大な場合、これにより大幅に高速化されます) ;
  • リストを使用する代わりに (膨大な数のアイテムを含む並べ替えられたアイテムを削除または挿入するときに速度の問題が発生します)、アイテムと解放されたアイテムの両方にリンク リストを使用します。

それほど単純ではないので、既存のコードを調べたり、既存のライブラリに頼ったりすることをお勧めします。FastMM4 が十分に高速でない限り、アプリケーションでこのメモリ割り当てをコーディングする必要はないと思います。

于 2011-09-23T11:01:57.980 に答える