1.我仿照sgi-STL的空间配置器,实现了一个内存池,基本跟其完全一样,但是我写完之后,测试其分配回收内存的速度并不快,要比直接用malloc free还慢一些。
2.是否内存池主要解决的是内存碎片问题,而对效率的提升并不明显,还是我实现的有问题?
使用内存池要1.5s左右,直接用malloc free是1s左右,这是测试用的代码:
#include <iostream>
#include <cstdlib>
#include <vector>
#include <ctime>
#include "memorypool.h"
using namespace std;
//#define USEPOOL
int main(){
MemoryPool pool(10);
clock_t start,end;
int sum=0;
vector<int> randnum(20005);
for(int i=0;i<20000;i++){
randnum[i]=rand()%128;
}
#ifdef USEPOOL
for(int i=0;i<80;i++){
start=clock();
for(int i=0;i<20000;i++){
char *p=(char*)pool.allocate(randnum[i]);
pool.deallocate(p,randnum[i]);
}
end=clock();
sum+=(end-start);
}
cout<<"MemoryPool:20000次申请释放内存(0-128bytes)用时:"<<sum/80<<"毫秒"<<endl;
#else
sum=0;
for(int i=0;i<80;i++){
start=clock();
for(int i=0;i<20000;i++){
char *p=(char*)malloc(randnum[i]);
free(p);
}
end=clock();
sum+=(end-start);
}
cout<<"原生api:20000次申请释放内存(0-128bytes)用时:"<<sum/80<<"毫秒"<<endl;
#endif
return 0;
}
boost 的我在实际项目中用过,效率还是很高的。不过内部逻辑没仔细看过。
memory pool 应该通常都是放大量 同样 的对象的。这样分配回收就非常简单。你这样想分配任意长度的内存,效率可能不容易写得特别快。