5

MyOrderクラスのカスタム演算子newと演算子deleteを作成しました。boost::singletonプールを使用してメモリを割り当てています。これがパフォーマンスをテストするプログラムです、

#include <boost/pool/singleton_pool.hpp>
#include <boost/progress.hpp>
#include <iostream>
#include <new>
#include <vector>


class MyOrder{
    std::vector<int> v1_;
    std::vector<double> v2_;

    std::string s1_;
    std::string s2_;

public:
    MyOrder(std::string s1, std::string s2): s1_(s1), s2_(s2) {}

    ~MyOrder(){}

    static void * operator new(size_t size); 
    static void operator delete(void * rawMemory) throw();
};

struct MyOrderTag{};
typedef boost::singleton_pool<MyOrderTag, sizeof(MyOrder)> MyOrderPool; 

void* MyOrder:: operator new(size_t size)
{
    if (size != sizeof(MyOrder)) 
        return ::operator new(size);

    while(true){
        void * ptr = MyOrderPool::malloc();
        if (ptr != NULL) return ptr;

        std::new_handler globalNewHandler = std::set_new_handler(0);
        std::set_new_handler(globalNewHandler);

        if(globalNewHandler)  globalNewHandler();
        else throw std::bad_alloc();

    }
}

void MyOrder::operator delete(void * rawMemory) throw()
{
    if(rawMemory == 0) return; 
    MyOrderPool::free(rawMemory);
}

int main()
{
    MyOrder* mo = NULL; 
    std::vector<MyOrder*> v;
    v.reserve(100000);

    boost::progress_timer howlong;
    for(int i = 0; i< 100000; ++i)
    {
        mo = new MyOrder("Sanket", "Sharma");
        v.push_back(mo);
    }

    for (std::vector<MyOrder*>::const_iterator it = v.begin(); it != v.end(); ++it)
    {
        delete *it;
    }
    return 0;
}

-O2フラグを使用して上記のプログラムをコンパイルし、2.26 GHz Intel Core 2 Duoを搭載したMacbookで実行したところ、0.16秒かかりました。次に、カスタム演算子newとoperator deleteを宣言して定義し、-O2フラグを使用して再コンパイルし、同じマシンで実行した行をコメント化し、0.13秒かかりました。

同じサイズのオブジェクトにsingleton_poolを使用してメモリを割り当てたり、割り当てを解除したりすると、メモリが高速化されます。なぜ遅くなるのですか?または、この小さなプログラムで得られるパフォーマンス上の利点を無効にするプールを作成するオーバーヘッドはありますか?

アップデート:

2つのstd::string変数をintとdoubleに置き換え、今回は2つのプログラムを3.0 GHZ AMD Phenom(tm)II X4 945プロセッサでそれぞれ100000000(つまり1000回前)の反復で実行しました。カスタムメモリ割り当てを使用するものは3.2秒かかりますが、デフォルトのメモリ割り当てを使用するものは8.26秒かかります。したがって、今回はカスタムメモリ割り当てが優先されます。

4

1 に答える 1

5

あなたの数字は無意味だと思います。ランタイムを 1 回だけチェックし、0.13vs0.16秒よりも少ないことがわかった場合、それはまったく意味がなく、オーバーヘッドが支配的です。

テストするスニペットを何千回も実行してから、データを比較してオーバーヘッドを排除する必要があります。

いいえ、その0.03秒の違いは、プロセスが切り替えられるなどによって簡単に説明できます。

于 2012-05-05T23:36:18.103 に答える