天天看点

关于new的效率(《编程珠玑》第13章)

在写程序中,不可避免的会用到new来在堆上开辟一块内存,如何高效的new和delete是很值得思考的。比如在链表或者树中,不断插入新元素,则需要不断用new进行空间开辟,庆幸的是《编程珠玑》第十三章课后题中提出了一个有效的方法,即开辟一个大的空间,然后如果需要用到新空间,则从已经开辟好的空间取就行了。

这不仅在new的时候节省了大量的时间,而且这样开辟出来的内存时连续的,也就是说能够都存储在高速缓存中来提高访问速度和命中率,这会大大提高效率,下面的一段代码显示了两种new方法的时间开销。

#include<iostream>
#include<time.h>
using namespace std;

int main()
{
	const int N=1000000;
	clock_t start,stop;
	start=clock();
	int *A=new int[N];
	stop=clock();
	cout<<stop-start<<endl;
	start=clock();
	for(int i=0;i<N;i++)
		int *p=new int;
	stop=clock();
	cout<<stop-start<<endl;

	cout<<CLOCKS_PER_SEC<<endl;

	system("pause");
	return 0;
}
           

输出结果是1,750,1000。1000表示CLOCKS_PER_SEC即每秒1000次,相当于是1ms,也就是说当开辟10^6个int型的空间时,如果用一个数组开辟,只需要1ms,但是如果开辟10^6次,则需要750ms,这可是实实在在的时间!!!注:我电脑的CPU是Intel Core i5的处理器,主频3.1GHz。

由此可见,一次开辟多个空间比多次开辟小空间能够节省大量的时间!如果预先能够大概知道所用空间的大小,可以用这种方法,当然也可以用静态内存。