std :: allocator如何如此之快?

时间:2013-05-10 18:16:03

标签: c++ performance memory-management performance-testing allocator

我认为访问C ++标准库的实现是不切实际的,因为它依赖于平台(如果这句话错误,纠正我!)。好吧,我想在C ++中练习一些非常低级别(至少可以用C ++编程的低级别)。所以,我开始写一个Allocator课程,只是为了练习,学习,如果我创造了一些有用的东西,我打算在我的实际项目中使用它。

我的班级看起来还不错。它与经典Base* pointer = new Derivative;pointer->~Base(); ::operator delete[] (pointer);分配,构建,销毁和解除分配策略一样快。事实上,对于10000000次迭代,我的课程慢了0.1秒。

我问这个问题的原因是:std :: allocator。对某些人来说,由于特定原因,它可能很慢;但仅仅与我的实施相比,非常快。请注意我的代码:

int main()
{
    for(int x=0; x<10000000; x++)
    {
        /* TEST 1: Using my Allocator class
        A* a = Allocator<B>::construct(10,3.2);
        Allocator<A>::destruct(a);
        //*/

        /* TEST 2: Using operators 'new' and 'delete[]' 
        A* a = new B(10,3.2);
        delete a;
        //*/

        /* TEST 3: std::allocator
        std::allocator<B> allocator;
        std::allocator<A> deallocator;
        A* a = allocator.allocate(1);
        allocator.construct(a,10,3.2);
        deallocator.destroy(a);
        deallocator.deallocate(a,1);
        //*/
    }
}

关于我的代码的其他重要说明: A类是B类的基础。Allocator<T>::construct(args...)Allocator<T>::destruct(pointer)是静态内联方法。第一个都分配内存(足够只有一个对象)并在此内存位置构造对象(通过使用参数)。第二个首先破坏对象然后释放内存位置。所有三个测试结果(据我调试)完全相同并且有效。我使用这个循环与这3个单独的测试(每次一个测试)。

以下是10000000次迭代的结果:
测试1:app。 1.550秒
测试2:app。 1.450秒
测试3:app。 1.200秒
(注意:这些数字是近似数字)

好吧,std :: allocator比两者都快。也许没有太大的区别,但我想知道这种区别的原因。我对std :: allocator的实现很好奇。感谢您的帮助和时间。



附加信息:我在Ubuntu Quantal Quetzal下使用GCC 4.7.2。

2 个答案:

答案 0 :(得分:1)

您将不得不学习分支预测和CPU流水线,内部实现的低时间复杂度算法以及缓存一致性,以便进行高度优化。我不了解std::allocator的实施情况,但从你的问题来看,我提到的事情是大幅改善绩效的领域。

编辑:如果std::allocator使用newdelete,就像评论建议的那样,那么使用一些内存池来制作更加具体和优化的分配器非常容易。

答案 1 :(得分:1)

std:allocator将保留一个内存池,并且每次调用construct时都不需要进行系统调用每次我们执行系统分配的新内存时