2012-05-05 42 views
5

我爲MyOrder類編寫了自定義操作符new和操作符delete。我正在使用boost :: singleton池分配內存。下面是該程序的測試性能,自定義分配使用提升singleton_pool比默認值更慢

#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; 
} 

我編譯使用-02標誌上面的程序,並與2.26 GHz的英特爾Core 2 Duo我的MacBook上跑,花了0.16秒。然後,我評論了我已經聲明的行,並定義了自定義操作符new和操作符delete,並使用-O2標誌重新編譯,並在0.13秒的同一臺計算機上運行。

使用singleton_pool爲相同大小的對象分配和釋放內存應該加快速度。爲什麼它會讓它變慢?或者,創建一個池會使這個小程序中獲得的性能優勢無效?

更新:

我更換兩個的std :: string變量有一個int和double和這段時間跑了兩個方案與億(即1000年前次)上的迭代各一個3.0 GHZ的AMD Phenom(TM )II X4 945處理器。使用自定義內存分配的需要3.2秒,而使用默認內存分配的需要8.26秒。所以這次自定義內存分配獲勝。

+1

既然你不辭辛苦調用* *一個新的處理程序,你應該寫一個循環來試試*所有*新的處理程序。 –

+1

你的測試包括'std :: string'的分配,它們不受你的自定義分配器控制,所以你得到的任何結果都會誤導_at best_。 – Chad

+0

@Chad我用double和int替換了std :: string。這一次我迭代10000000次。結果默認爲1.95秒,定製爲2.29秒。仍然使用緩衝池分配/釋放緩慢。 – sank

回答

5

我認爲你的數字毫無意義。如果你只檢查一次運行時間,並且發現了0.130.16秒比,那完全沒有意義,並且由開銷占主導地位。

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

沒有真的,0.03秒差別很容易被你的流程來解釋得到轉出等