我有一个应用程序可以创建数千个小对象(超过 500,000 个)。有一个对象工厂在堆上分配这些对象。
我遇到的问题是,当持有这些较小对象的对象超出范围(驱动程序)时,65% 的处理时间都花在了销毁这些小对象上。
map
, entries
, 和 fields
持有指向抽象基类的指针,每个基类都有许多子类。
应用程序架构遵循以下格式:
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 应用程序的性能。
我首先使用了一个带有普通指针的数据结构,然后在类的析构函数中显式删除了对象。
然后我尝试将数据结构与 boost::shared_ptr<>
结合使用但我确定引用计数导致了巨大的开销并且没有提供任何大的好处。
我现在的解决方案是使用 boost::ptr_container
因此它获得堆对象的所有权,并在容器超出范围时自动销毁它们。使用此解决方案,大量时间仍花费在销毁对象上。
我能做些什么来防止一直破坏对象吗?
最佳答案
我建议使用内存池来分配元素,例如使用 Boost Pool图书馆。
如果您实际上不需要每个元素的销毁(即元素本身具有微不足道的析构函数,尽管它们显然不能是 POD,因为它们具有虚拟成员)您可以避免完全销毁元素,并一举释放整个池子。这消除了等式中的动态分配瓶颈。
相关:
作为一个简单的措施(容易的成果)考虑使用一个嵌入式快速堆库,例如来自 google-perftools 的 libtcmalloc
。
相关:
关于c++ - 增加破坏速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25997464/