allocatorを関数のポインタにしたら・・・

ranking_tiemr / clock type : RealCPUClock /compile mode : DEBUG
1 / MemoryPool deallocate / プールに戻す / 529877.000000
2 / object_pool recycle / プールに戻す / 699042.000000
3 / MemoryPool allocate / プールから確保 / 2192181.000000
4 / object_pool allocate / プールから確保 / 2311246.000000
5 / object_pool deallocate / free()を使い開放 / 118126154.000000

なんか、遅くなっちゃいました^^;
前の状態に戻すか?
まぁ、イイか。この位だったら・・・


さらに・・・ boost::poolとも勝負しました。

ranking_tiemr / clock type : RealCPUClock / compile mode : RELEASE
1 / boost::pool deallocate / free / 37041.000000
2 / MemoryPool deallocate / プールに戻す / 91047.000000
3 / object_pool recycle / プールに戻す / 97376.000000
4 / MemoryPool allocate / プールから確保 / 706405.000000
5 / object_pool allocate / プールから確保 / 724847.000000
6 / boost::pool allocate / malloc / 1042658.000000
7 / object_pool deallocate / free()を使い開放 / 54364155.000000

なんか、object_poolが遅くなったなぁ〜
多分allocate系をinline展開ではなく関数のポインタにしたのがなぁ〜。
まぁ、イイか。この位だったら・・・
それにしても、boost::poolが遅いなぁ・・・なんでだろ?


やっぱり、速度が遅いのが許せなかったので・・・
デフォルトアロケータの場合はインライン展開されるコードが使われるように修正・・・

ranking_tiemr / clock type : RealCPUClock / compile mode : RELEASE
1 / boost::pool deallocate / free / 37208.000000
2 / MemoryPool deallocate / プールに戻す / 89253.000000
3 / object_pool recycle / プールに戻す / 98001.000000
4 / object_pool allocate / プールから確保 / 714171.000000
5 / MemoryPool allocate / プールから確保 / 736834.000000
6 / boost::pool allocate / malloc / 1199485.000000
7 / object_pool deallocate / free()を使い開放 / 60298349.000000

それにしても、boost::pool のdeallocation(freeメンバ関数)はメチャクチャ速い
ちとソースを見てみよう。


void free(void * const chunk)
{
nextof(chunk) = first;

first = chunk;
}
// for the sake of code readability :)
static void * & nextof(void * const ptr)
{
return *(static_cast<void **>(ptr));
}

上手い!!!非常に上手い!!!特にnextofの所。
次へのポインタが格納されているのはメモリの先頭なのでいちいちアロー演算子を使ってアクセスしていない。
でも、速度アップの効果あるのかな?
アセンブラ読めないから良く分からない・・・むぅ

メモリプール最終計測

small test(16 byte )
ranking_tiemr / clock type : RealCPUClock / compile mode : RELEASE
1 / boost::pool deallocate / free / 35287.000000
2 / object_pool recycle / プールに戻す / 97255.000000
3 / MemoryPool deallocate / プールに戻す / 109396.000000
4 / object_pool allocate / プールから確保 / 684469.000000
5 / MemoryPool allocate / プールから確保 / 722633.000000
6 / boost::pool allocate / malloc / 1203381.000000
7 / object_pool deallocate / free()を使い開放 / 54946018.000000
big test(5120 byte )
ranking_tiemr / clock type : RealCPUClock / compile mode : RELEASE
1 / boost::pool deallocate / free / 39627.000000
2 / object_pool recycle / プールに戻す / 217613.000000
3 / MemoryPool deallocate / プールに戻す / 274475.000000
4 / boost::pool allocate / malloc / 1216813.000000
5 / object_pool allocate / プールから確保 / 2407761.000000
6 / MemoryPool allocate / プールから確保 / 2421483.000000
7 / object_pool deallocate / free()を使い開放 / 1790078212.000000

なんかboost::poolはデカイデータにはめっぽう強いみたいなんですけど!!!?
むぅ〜。

と、言う事で、
各プールクラスの使いどころ

  • boost::pool は5120byteのような大きめのデータに向いている
  • MemoryPool,object_pool(私のライブラリ)は16byteくらいの小さいデータに向いている

で、いいのかなぁ?
むぅ〜。