デフォルトのメモリアロケートは遅いので、 小さいオブジェクトに特化したアロケータを作ってやったぜ、 と、著者は自信まんまんなんですが、 これ、結論から言うと、遅いです。 デフォルトの new & delete よりも。
まあ、一応、使い方。
class Class : public Loki::SmallObject<>{};
これでおしまい、すごくカンタンです。
以下の内容が、 普通のメモリマネージャの使われかたを反映していない、 SmallObj の方はロック有りなのでは、 という2点で間違ってるのではないかという指摘を受けました。 特に前者はきちんと確認していませんが、 恐らく両方とも全くその通りだと思われますので 以下の結果は無視してやって下さい… すいません。
で、お楽しみの速度比較です。
速度比較のソースデフォルトアロケータとだけ比較するのは寂しいので、 Efficient C++ なる C++ の最適化に関する本から持ってきた、 MemoryPool クラスにちょこっと手を入れたものもゲストとして比較してみました。 結果。
default | Loki::SmallObj | MemoryPool | |
---|---|---|---|
16byteのオブジェクト | 4.3 | 8.92 | 0.14 |
4000byteのオブジェクト | 4.06 | 5.1 | 0.15 |
なんて言いますか、論外ですね。 なんで大規模オブジェクトのアロケートの方が速いのかも謎ですし。 一応環境は Linux-2.5.6, gcc-2.96, Duron800MHz, オプションは -O2 です。 仮に凄く空間効率が良いのだとしても、この遅さでは使う気が起きないです。 本に速度比較が載っていないのは故意なのではないだろうか、 とまで邪推してしまいます。
それよりも、MemoryPool のすばらしいこと。 これはすぐにでも使っていけます。 やっぱり、速度の専門家にはかなわんのですかねえ。
もし何かこの結果が私の手違いであるようでしたら、ご指摘お願いします。
全てリンクフリーです。 コード片は自由に使用していただいて構いません。 その他のものはGPL扱いであればあらゆる使用に関して文句は言いません。 なにかあれば下記メールアドレスへ。