这几天做的一个项目要频繁new许多对象,对于频繁调用new对效率的影响只停留在理论上,没有一个直观的认识,故做了一个小测试。本次测试只对比了三种内存分配方式:
1. 频繁调用new
2. 一次性new足够的内存,再用placement new产生对象到已分配的内存
3. 用vector
测试代码如下
#include <iostream>
#include <time.h>
#include <vector>
using namespace std;
#define MAX_CYCLE 30000000
class CTest
{
private:
//int ID;
//int ID2;
//double ID3;
char a[3];
};
inline void use_new()
{
for(int i = 0; i < MAX_CYCLE; i++)
delete new CTest();
}
inline void use_pool()
{
CTest* pTest = new CTest[MAX_CYCLE];
int len = sizeof(CTest);
memset(pTest, 0, MAX_CYCLE * len);
for(int i = 0; i < MAX_CYCLE; i++)
new(pTest + i * len) CTest;
delete [] pTest;
}
inline void use_vector()
{
vector<CTest> testVec(MAX_CYCLE);
}
int main()
{
time_t timer1, timer2;
time(&timer1);
//use_new();
time(&timer2);
cout<< difftime(timer2, timer1)<<endl;
time(&timer1);
//use_pool();
time(&timer2);
cout<< difftime(timer2, timer1)<<endl;
time(&timer1);
use_vector();
time(&timer2);
cout<< difftime(timer2, timer1)<<endl;
system("pause");
return 0;
}
测试结果:
分配方式 | 耗时 |
频繁调用new | 117s |
一次new足够内存 | 3s |
用vector | 9s |
结论:
1. 用一次new足够内存的方式其实也就相当于使用内存池,三种方式耗时排序为:内存池 < vector < 频繁new。
2. 要实例化的类的大小对效率的影响并不大。CTest类的声明中,是否注释掉前3个成员变量并不影响对时间的消耗。