提高C++性能编程学习之内存池技术(一)
2015-05-09 22:02
393 查看
提高C++性能编程学习之内存池技术( 单线程固定大小内存池设计)
内存池作用: 内存池是为了帮助我们解决软件在频繁申请和释放内存时的效率问题。
内存池分类: 根据条件不同,内存池分类也不同,本文主要涉及四种内存池技术,单线程环境固定大小内存池设计,单线程环境可变大小内存池设计,多线程环境固定大
小内存池设计,多线程环境可变大小内存池设计。
单线程固定大小内存池设计:
内存池源码:
#ifndef SINGLETHREADFIXSIZEMEMPOOL_H #define SINGLETHREADFIXSIZEMEMPOOL_H #define EXPANSION_SIZE 32 template <class T> class MemoryPool { public: MemoryPool(size_t size = EXPANSION_SIZE) { expandTheFreeList(size); } ~MemoryPool() { MemoryPool<T> *nextPtr = next; for (nextPtr = next; nextPtr != NULL; nextPtr = next) { next = next->next; delete[] nextPtr; } } public: inline void *allocMemory(size_t size)//从空闲列表中分配元素 { if (!next) { expandTheFreeList(); } MemoryPool<T> *head = next; next = head->next; return head; } inline void freeElement(void *someElement)//回收元素到空闲列表 { MemoryPool<T> *head = static_cast<MemoryPool<T>*>(someElement); head->next = next; next = head; } private: MemoryPool<T> *next;//空闲列表下一个元素 void expandTheFreeList(int nExpandElements = EXPANSION_SIZE)//扩展空闲列表大小 { size_t size = (sizeof(T) > sizeof(MemoryPool<T>*)) ? sizeof(T) : sizeof(MemoryPool<T>*); MemoryPool<T> *runner = reinterpret_cast<MemoryPool<T>*>(new char[size]); next = runner; for (int i = 0; i < nExpandElements; ++i) { runner->next = reinterpret_cast<MemoryPool<T>*>(new char[size]); runner = runner->next; } runner->next = 0; } }; #endif
测试类源码:
#ifndef TESTMEMORYPOOL_H #define TESTMEMORYPOOL_H #include "SingleThreadFixSizeMemPool.h" class TestMemoryPool { public: TestMemoryPool(int a = 0, int b = 1) : m_a(a), m_b(b){} public: void *operator new(size_t size){return memPool->allocMemory(size);} void operator delete(void *element, size_t size){memPool->freeElement(element);} static void newMemPool(){memPool = new MemoryPool<TestMemoryPool>;} static void deleteMemPool(){delete memPool;} private: int m_a; int m_b; static MemoryPool<TestMemoryPool> *memPool; }; #endif
主函数源码:
#include <iostream> #include <Windows.h> #include "TestMemoryPool.h" MemoryPool<TestMemoryPool> *TestMemoryPool::memPool = 0; int _tmain(int argc, _TCHAR* argv[]) { TestMemoryPool *pTestMemoryPoolArray[1000]; TestMemoryPool::newMemPool(); DWORD dStartTime = GetTickCount(); for (int i = 0; i < 500; ++i) { for (int j = 0; j < 1000; ++j) { pTestMemoryPoolArray[j] = new TestMemoryPool(j); } for (int j = 0; j < 1000; ++j) { delete pTestMemoryPoolArray[j]; } } DWORD dEndTime = GetTickCount(); std::cout << "time is : " << dEndTime - dStartTime << std::endl; getchar(); return 0; }
测试环境: VS2010,Win7系统,分别进行50W次申请内存和50W次释放内存操作
测试结果: 使用 new 和 delete 在Debug下耗费 2699 ms,在Release下耗费2168 ms
使用内存池在Debug下耗费 46 ms,在Release下耗费16 ms
结论: 从测试结果可以明显看出,在频繁的大量进行内存操作时,使用内存池可以获取性能数量级的提升
相关文章推荐
- 改善C++ 程序的150个建议学习之建议35:使用内存池技术提高内存申请效率与性能
- 【内存池系列】提高C++性能的编程技术 学习笔记(二) 内存池
- 【技术门诊128期】从C/C++学习谈编程能力的培养与提高!
- 游戏编程精粹学习 - 使用Bloom过滤来提高计算性能(BloomFilter)
- 使用SIMD技术提高C++程序性能
- 专注C++的STD库,STL库,更深入的学习C++的编程技术。
- 你应当如何学习C++以及编程(细节是必要的,但不是重要的,把时间用在集中精力去解决问题,而不是学习新技术,那样练不成高手。在实践中提高才是最重要的。最最重要的内功还是长期学习所磨练出来的自学能力)good
- [C/C++]使用epoll提高网编编程性能
- 使用SIMD技术提高C++程序性能
- 浅谈编程能力的培养与提高——学习C++的一些建议1
- C++ 现在一些人动不动就要挽起袖子自己写内存池,号称能提高性能,真当 Ulrich Drepper 是水货?
- C++性能的编程技术
- 使用SIMD技术提高C++程序性能
- C++ 应用程序性能优化---内存池技术
- 提高ASP.NET Web应用程序性能的一些常规技术建议
- Android 学习笔记——利用JNI技术在Android中调用、调试C++代码
- 提高PHP编程效率 引入缓存机制提升性能
- C++ Primer 学习笔记_106_特殊工具与技术 --局部类
- 随便举个例子,说明单线程比多线程编程提高性能
- 用缓冲技术提高JSP应用的性能和稳定性