まず、ここからアイデアを得ました。
かつて私が書いた、たくさんの小さなメモリの塊を使用し、それぞれがmalloc()で割り当てられたアプリがありました。正しく動作しましたが、低速でした。私はmallocへの多くの呼び出しを1つだけに置き換えてから、アプリ内でその大きなブロックをスライスしました。それははるかに速かった。
アプリケーションのプロファイリングを行っていましたが、malloc呼び出しの数を減らすと、パフォーマンスが予想外に向上しました。ただし、まだ同じ量のメモリを割り当てています。
だから、私はこの男がしたことをしたいのですが、それを行うための最良の方法がわかりません。
私の考え:
// static global variables
static void * memoryForStruct1 = malloc(sizeof(Struct1) * 10000);
int struct1Index = 0;
...
// somewhere, I need memory, fast:
Struct1* data = memoryForStruct1[struct1Index++];
...
// done with data:
--struct1Index;
落とし穴:
- 10000を超えないようにする必要があります
- 占有したのと同じ順序でメモリを解放する必要があります。(私の場合、再帰を使用しているので大きな問題ではありませんが、可能であればそれを避けたいと思います)。
Mihai Maruseacからのインスピレーション:
int
まず、基本的にどのメモリインデックスが空いているかを示すリンクリストを作成します。次に、呼び出された構造にプロパティを追加しましたint memoryIndex
。これは、占有されているメモリを任意の順序で返すのに役立ちます。そして幸いなことに、私のメモリの必要量はいつでも5 MBを超えることはないと確信しているので、その量のメモリを安全に割り当てることができます。解決しました。