簡體   English   中英

使用boost singleton_pool進行自定義分配比默認速度慢

[英]Custom allocation using boost singleton_pool slower than default

我為MyOrder類編寫了自定義運算符new和operator 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標志編譯了上述程序,並在Macbook上使用2.26 GHz Intel Core 2 Duo運行,花了0.16秒。 然后,我在聲明和定義自定義運算符new和operator delete的行中注釋掉,並用-O2標志重新編譯,並在同一台機器上運行,耗時0.13秒。

使用singleton_pool為相同大小的對象分配和取消分配內存應加快速度。 為什么會使其變慢? 還是創建一個池的開銷抵消了在這個小程序中獲得的性能收益?

更新:

我用一個int和一個double替換了兩個std :: string變量,這一次在3.0 GHZ AMD Phenom(tm)II X4 945處理器上分別運行了100000000次(即之前1000次)迭代的兩個程序。 使用自定義內存分配的內存占用3.2秒,而使用默認內存分配的內存占用8.26秒。 因此,這一次自定義內存分配獲勝。

我認為您的電話號碼沒有意義。 如果只檢查一次運行時,發現0.130.16秒是完全沒有意義的,並且由開銷決定。

您必須運行要測試的代碼片段數千次,然后比較數據以排除開銷。

確實沒有, 0.03秒的差異可以很容易地通過您的進程被關閉等來解釋。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM