2009-10-05 9 views
7

ここ数日間、私は標準malloc()以外のメモリアロケータに関するいくつかの情報を得ました。多くのスレッドを持つアプリケーションでは、malloc()よりも優れているような実装がいくつかあります。たとえば、tcmallocptmallocの方がパフォーマンスが良いと思われます。既存のコードで新しいメモリアロケータを置き換える最良の解決策は何ですか?

多くの場所でmallocnewの両方の演算子を使用するC++アプリケーションがあります。私はそれらをptmallocのようなものに置き換えることがパフォーマンスを向上させるかもしれないと考えました。しかし、私はLinux上で動作するC++アプリケーションで、newオペレータがどのように動作するのでしょうか? mallocなどの標準的な動作を使用していますか?

newメモリアロケータをコード内の古いものに置き換える最も良い方法は何ですか?行動を無効にする方法はありますか?newmallocか、それともすべての呼び出しを1つずつ置き換える必要がありますか?

+0

あなたのプログラムがメモリ管理にかなりの時間を費やしていると判断しましたか? – rpg

+0

はい、そうです。私はすでにそれについて確信しています –

答えて

2

TCmallocを使用するには、単に "-ltcmalloc" リンカーフラグを経由して、アプリケーションにtcmallocをリンクします。

$ LD_PRELOAD = "は/ usr/libに/ libtcmalloc.so"

ptmallocは、同様の(ただし、場合のようだ: あなたはLD_PRELOADを使用することによって、自分自身をコンパイルしていないアプリケーションでtcmallocを使用することができますLinux上では、既にそれを使用している可能性がありますbecause it's part of the GNU C library)。

私はmallocを呼び出すためにoperator newを期待していますが、簡単に、その後、mallocにブレークポイントを設定newを呼び出すことによって、自分自身のためにチェックすることができます。 newmallocyou can redefine it so that it doesを呼び出さない場合。

+1

彼らは言う部分をスキップしました:LD_PRELOADはやりにくく、このモードを必ずしも推奨しません。 – rpg

+0

それは正しい、私がした - 私は本質よりも何も引用したくないので。詳細なドキュメントはリンクの後ろにあります。 –

0

オーバーライディングが間違いないと思います。あなたはあなたが望む新しい実装ライブラリにあなたのアプリケーションをリンクすることができ、新しいmallocへのすべての呼び出しは上書きされます。私はそれをしていない。しかし、valgrindを使用するときには、アプリケーションのメモリ使用量統計を追跡するために独自のメモリアロケータを使用し、結果が最終的に生成されるため、可能性は高いと思います。それができれば、間違いなく道があるはずです。

これをチェックするlinkそれは同様の種類のスマートヒープライブラリに関する情報を含んでいます! TCMalloc documentationから

1

プログラムがマルチスレッドの場合は、Hoardアロケータが高く評価されます。 glibcのptmallocはすでにかなり良いので、私は個人的にはLinux上で気にする価値はないと思っています。

+0

私が話しているコードでは、新しいmalloc呼び出しが多すぎます。 ptmallocはコードがLinux用にコンパイルされたときに実際に呼び出されますか? –

+1

はい、Linuxで作業している場合は、既にptmallocを使用しています。 –

0

あなたのアプリはメモリ割り当てにどれくらいの時間を費やしますか?

関連する問題