C++几种内存分配方法的效率测试与比较

这几天做的一个项目要频繁new许多对象,对于频繁调用new对效率的影响只停留在理论上,没有一个直观的认识,故做了一个小测试。本次测试只对比了三种内存分配方式:

1. 频繁调用new

2. 一次性new足够的内存,再用placement new产生对象到已分配的内存

3. 用vector

测试代码如下

#include 
#include 
#include 
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 testVec(MAX_CYCLE);
}

int main()
{
	time_t timer1, timer2;

	time(&timer1);
	//use_new();
	time(&timer2);
	cout<< difftime(timer2, timer1)<

测试结果:

分配方式 耗时
频繁调用new 117s
一次new足够内存 3s
用vector 9s

结论:

1. 用一次new足够内存的方式其实也就相当于使用内存池,三种方式耗时排序为:内存池 < vector < 频繁new。

2. 要实例化的类的大小对效率的影响并不大。CTest类的声明中,是否注释掉前3个成员变量并不影响对时间的消耗。

你可能感兴趣的:(C/C++)