提高销毁速度

时间:2014-09-23 14:16:57

标签: c++ boost polymorphism shared-ptr boost-ptr-container

我有一个应用程序可以创建数千个小对象(超过500,000)。有一个对象工厂在堆上分配这些对象。

我遇到的问题是,当持有这些较小对象的对象超出范围(驱动程序)时,65%的处理时间用于销毁这些小对象。

mapentriesfields保存指向抽象基类的指针,每个基类都有许多子类。

应用程序架构遵循以下格式:

class Driver {

    boost::ptr_map<std::string, Class1-Base> map;
}

class Class1-Base {

    boost::ptr_vector<Class2-Base> entries;
}

class Class2-Base {
    boost::ptr_vector<Class3-Base> fields;
}

class Class3-Base {
    unsigned long value;
}

我尝试了几种不同的方法来提高应用程序的性能。

我首先使用带有普通指针的数据结构,然后显式删除了类的析构函数中的对象。

然后我尝试使用boost::shared_ptr<>的数据结构,但我确定引用计数导致了很大的开销,并没有带来任何好处。

我现在遇到的解决方案是使用boost::ptr_container,因此它获取堆对象的所有权,并在容器超出范围时自动销毁它们。使用此解决方案,仍然需要花费大量时间来销毁对象。

我能做些什么来阻止所有这些时间来摧毁物体?

1 个答案:

答案 0 :(得分:2)

我建议使用内存池来分配元素,例如:使用Boost Pool库。

如果你实际上 需要每个元素的销毁(即元素本身都有微不足道的析构函数,尽管它们显然不能是POD,因为它们有虚拟成员)你可以避免破坏元素一共,并一举释放整个游泳池。这消除了等式中的动态分配瓶颈。

相关:


作为一个简单的衡量标准(低挂水果),请考虑使用快速堆库,例如来自google-perftools的libtcmalloc

相关: