toge's diary

コンピュータ関連の趣味をつらつらと。

smalloc

http://freshmeat.net/projects/smalloc/

あらかじめ大きな領域をとっておいて、その領域内で確保・開放を繰り返す・・・というライブラリを探していたのですが、案外みつかりません。boost::poolは単一型のみだし。
みつかった数少ないライブラリがこれです。とりあえず・・・うまく動いているみたい。

> ./mtest 1
mtest: 21121067 malloc calls in 10.07 seconds = 2096522.83 calls/second
mtest: 21120620 free calls in 29.17 seconds = 724037.43 calls/second
mtest: interrupted!
> ./sys-mtest 1
mtest: 77973464 malloc calls in 66.29 seconds = 1176256.79 calls/second
mtest: 77972843 free calls in 33.66 seconds = 2316166.26 calls/second
mtest: interrupted! 

上がsmallocのmalloc/freeで動かした場合、下がglibcmalloc/freeで動かした場合。
mallocはsmallocの方が2倍速いですが、freeは1/3以下ですね。mallocとfreeの呼び出し回数が同一と考えると、トータルで見た場合glibcの方が1.4倍速い計算になります。

1.4倍程度で収まっているのなら、ものによってはsmallocを使った方が良い場合もあるし、そもそもベンチマークでのメモリ確保の手順がどんなものか、まだ見てないのでなんとも言えませんけど。