您的位置:首页 > 编程语言 > C语言/C++

提高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

结论: 从测试结果可以明显看出,在频繁的大量进行内存操作时,使用内存池可以获取性能数量级的提升
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐