[英]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.13
秒0.16
秒是完全沒有意義的,並且由開銷決定。
您必須運行要測試的代碼片段數千次,然后比較數據以排除開銷。
確實沒有, 0.03
秒的差異可以很容易地通過您的進程被關閉等來解釋。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.