毁灭的速度越来越快
Increasing Speed of Destruction
我有一个应用程序,它可以创建数千个小对象(超过500000个)。有一个对象工厂在堆上分配这些对象。
我遇到的问题是,当容纳这些较小对象的对象超出范围(Driver)时,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::shared_ptr<>
一起使用,但我确定引用计数会造成很大的开销,并且不会带来任何好处。
我现在得到的解决方案是使用boost::ptr_container
,这样它就拥有堆对象的所有权,并在容器超出范围时自动销毁它们。使用此解决方案,仍然需要花费大量时间来销毁对象。
我能做些什么来防止这些时间破坏物体吗?
我建议使用内存池来分配元素,例如使用Boost pool库。
如果实际上不需要对每个元素进行销毁(即元素本身有琐碎的销毁器,尽管它们显然不能是POD,因为它们有虚拟成员),则可以避免完全销毁元素,并一举释放整个池。这消除了等式中的动态分配瓶颈。
相关:
- boost.pool如何实现已分配内存的重用?(提示:没有必要)
作为一个简单的措施(低挂果实),可以考虑使用一个放入式快速堆库,例如来自googleperftools的libtcmalloc
。
相关:
- 多线程是否强调内存碎片
- linux x64 c++为链表分配了太多内存;为什么
相关文章:
- 为什么在读取文件大小时文件IO速度会发生变化
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- 文件系统:复制功能的速度秘诀是什么
- 学习多线程C++:添加线程不会使执行速度更快,即使它看起来应该
- 在C++中使用并行化的预期速度是多少(不是 OpenMp,而是 <thread>)
- 两个连续的 OpenMP 并行区域会相互减慢速度
- 查找标准::hash_map与标准::矢量的速度
- 加快在C++中读取/处理日志文件的速度
- 为什么这些算法的运行速度比它们应该的要快?
- 如何提高文件的读取速度?
- 通过libpqxx提高PostgreSQL数据库的更新速度
- 使用 IMFSinkWriter 编码的视频的播放速度会根据宽度而变化
- 计算车辆之间的距离并设置速度,使距离保持不变,例如 5 米
- 如何加快大字符串的解析速度?
- 如何比较两个函数的速度和性能
- 线程相互减慢速度
- 多线程减慢程序速度:无错误共享,无互斥锁,无缓存未命中,无小工作量
- 使用 Unity 构建加快C++构建速度,并减少标头依赖项
- 随着线程数量的增加,OpenMP的实现速度越来越慢
- 毁灭的速度越来越快