我爲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秒。所以這次自定義內存分配獲勝。
既然你不辭辛苦調用* *一個新的處理程序,你應該寫一個循環來試試*所有*新的處理程序。 –
你的測試包括'std :: string'的分配,它們不受你的自定義分配器控制,所以你得到的任何結果都會誤導_at best_。 – Chad
@Chad我用double和int替換了std :: string。這一次我迭代10000000次。結果默認爲1.95秒,定製爲2.29秒。仍然使用緩衝池分配/釋放緩慢。 – sank