在模块内对内存的分配过早优化的缺点
2012-03-10 22:53
344 查看
最近看了一个同事写的模块,他为了提高程序执行的效率,对内存的使用做了很大的优化。
通常的做法是,根据自己的需求预先分配了一个大的内存块,然后分割开来,用链表或者数组管理起来,需要的时候只需要取出来用就可以,不用的时候就放回去。可以很大程度的减少从glibc分配和释放内存的操作,大大加快了处理时间。
但是真心不建议这样做,这种做法虽然提高了程序的效率,但是也限制了以后程序可修改的灵活性。提高了代码的复杂度,要花更多的时间和精力去调试。即使是复用以前成熟的内存池,也会让代码更难被他人读懂。
如果操作系统的内存分配方式确实不能满足你的性能要求,不做优化的程序效率得不到满足。我的建议是,如果程序不是很特别的应用Hoard和TCmalloc这些第三方内存管理库就很好了,只要在链接时稍微费点心思就能解决内存性能的问题。
如果你膝盖中了一箭后,程序的可靠性或者应用场景有特殊的要求,非得用自己的代码进行内存管理,也可以自己写内存池,但这这个内存池一定要对其它透明,也就是说使用内存管理的函数不需要知道你内存管理的细节,管你是用哈希表、链表还是神马堆,它只要malloc和free就可以了。再考虑到内存管理的瓶颈可能不是在一个模块上,这种做法对整体的内存优化也是很方便的。
通常的做法是,根据自己的需求预先分配了一个大的内存块,然后分割开来,用链表或者数组管理起来,需要的时候只需要取出来用就可以,不用的时候就放回去。可以很大程度的减少从glibc分配和释放内存的操作,大大加快了处理时间。
但是真心不建议这样做,这种做法虽然提高了程序的效率,但是也限制了以后程序可修改的灵活性。提高了代码的复杂度,要花更多的时间和精力去调试。即使是复用以前成熟的内存池,也会让代码更难被他人读懂。
如果操作系统的内存分配方式确实不能满足你的性能要求,不做优化的程序效率得不到满足。我的建议是,如果程序不是很特别的应用Hoard和TCmalloc这些第三方内存管理库就很好了,只要在链接时稍微费点心思就能解决内存性能的问题。
如果你膝盖中了一箭后,程序的可靠性或者应用场景有特殊的要求,非得用自己的代码进行内存管理,也可以自己写内存池,但这这个内存池一定要对其它透明,也就是说使用内存管理的函数不需要知道你内存管理的细节,管你是用哈希表、链表还是神马堆,它只要malloc和free就可以了。再考虑到内存管理的瓶颈可能不是在一个模块上,这种做法对整体的内存优化也是很方便的。
相关文章推荐
- 浅谈SUN JVM内存管理与应用服务器的优化之 服务器内存分配与优化
- [C++应用程序性能优化]内存分配失败处理
- [经验之谈]C/C++的一个内存分配记录模块
- OLTP和OLAP模式下的内存分配 [对数据仓库优化指明了纲领方向]
- 浅谈SUN JVM内存管理与应用服务器的优化之 服务器内存分配与优化二
- 晓说智能指针shared_ptr为何可以实现跨模块分配和释放内存
- Windows编程 在一个模块中分配的内存在另外一个模块释放?
- TWAIN扫描识别工具Dynamic Web TWAIN发布v13.3,优化内存、扫描模块
- 跨模块中的分配内存问题
- 35、C++ Primer 4th笔记,特殊工具与技术,优化内存分配(2)
- C++中小对象内存分配的优化与封装
- android bitmap的内存分配和优化
- Android 优化二 Java内存分配机制及内存泄漏
- 内存分配模块编译出错
- android bitmap的内存分配和优化
- 关于VS编译的程序内存分配只能用1.5~2G上限的优化方案
- sds(简单动态字符串) 内存预分配优化策略
- JVM配置优化和内存分配情况查看
- 浅谈SUN JVM内存管理与应用服务器的优化之 服务器内存分配与优化
- xen环境下的内存与CPU分配:性能优化