特定のデータ構造が消費するメモリ量を知りたいです。したがって、同時リンクリストがあるとします。リストのサイズを知りたいです。私にはいくつかのオプションがあります: malloc_hooks
、これはスレッドセーフではないと思います。誰かが実際にこの方法でメモリ消費を測定したかどうか知りたいです。これを行うツールはありますか?料金はどうですか?getrusage
ru_maxrss
massif
2 に答える
malloc
リンクされたリストノードのような構造に実際にかかるバイト数を知るには、数千のそれらを割り当てる分離されたテストケース (非同時!) を作成し、プログラムのメモリ使用量のデルタ値を調べます。それにはさまざまな方法があります。GNU/Linux システムにある GNU C ライブラリのように、ライブラリにmallinfo
構造がある場合は、前後の統計を見ることができます。もう 1 つの方法は、プログラムのシステム コールをトレースして、OS からの割り当てのパターンを監視することです。たとえば、10,000,000 個のリスト ノードを割り当て、プログラムがsbrk()
呼び出しを約 39,000 回実行し、呼び出しごとにプロセスのサイズが 8,192 バイト増加すると、リスト ノードが 32 バイト、オーバーヘッド、およびすべてを占めることになります。
単一のスレッドに同じサイズの何千ものオブジェクトを割り当てることは、断片化を含む現実的なプログラムでの実際のメモリ使用量を現実的に表していないことに注意してください。
小さな構造体を割り当てて、1 バイトも無駄にしないように (または、知らない、制御できない無駄を発生させないように)、断片化を制御したい場合は、malloc
(またはシステム アロケータから) オブジェクトの大きな配列を割り当てます。選択)、それらを自分で分割します。には不明なオーバーヘッドがまだありますがmalloc
、多数のオブジェクトに分割されているため、無視できます。
または、一般に、動作とオーバーヘッドを詳細に理解し、それ自体がシステムから大きなチャンクを取得する独自のアロケーターを作成します。
概念的に言えば、作業しているアイテムの数を知る必要があります。次に、データ構造で使用される各データ型のサイズを知る必要があります。また、ポインタのサイズや、ある種のメモリを多少使用しているものも考慮する必要があります。
次に、次のような式を考え出すことができます。
消費量= N *(sizeof(data types) )。
言い換えれば、データ型を一緒に追加し (データ型のサイズ)、項目の数を掛けることを確認する必要があります。