Пользовательское распределение с использованием boost singleton _пул медленнее, чем по умолчанию

Я написал собственный оператор new и оператор delete для класса MyOrder. Я выделяю память с помощью одноэлементного пула boost ::. Вот программа, тестирующая производительность.

#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 с процессором Intel Core 2 Duo 2,26 ГГц, и это заняло 0,16 секунды. Затем я прокомментировал строки, где я объявил и определил пользовательский оператор new и оператор удаления, перекомпилировал с флагами -O2 и запустил на той же машине, что заняло 0,13 секунды.

Выделение и освобождение памяти с использованием одноэлементного _пула для объектов одинакового размера должно ускорить это. Почему это делает его медленным? Или накладные расходы на создание пула сводят на нет выигрыш в производительности, полученный в этой небольшой программе?

Обновление:

Я заменил две строковые переменные std ::на int и double и на этот раз запустил две программы с 100000000 (, т.е. 1000 раз до )итераций каждая на процессоре AMD Phenom с частотой 3,0 ГГц. (тм )II X4 945 Процессор. Тот, который использует пользовательское выделение памяти, занимает 3,2 секунды, а тот, который использует выделение памяти по умолчанию, занимает 8,26 секунды. Так что на этот раз побеждает пользовательское выделение памяти.

5
задан sank 6 May 2012 в 00:35
поделиться