C++ STL copy函数效率分析

长平狐 发布于 2013/12/25 17:25
阅读 222
收藏 0

          在C++编程中,经常会配到数据的拷贝,如数组之间元素的拷贝,一般的人可能都会用for循环逐个元素进行拷贝,在数据量不大的情况下还可以,如果数据量比较大,那么效率会比较地下。而STL中就提供了一个专门用来进行容器元素拷贝的函数copy。

         copy的函数原型如下:

        

template<class InIt, class OutIt>
    OutIt copy(InIt first, InIt last, OutIt x);

第一个参数是要拷贝元素的首地址,第二个参数是元素最后一个元素的下一个位置,第三个参数是拷贝的目的地址,首地址。

下面写一个简单的测试程序分析copy的效率。

vector<int> iVec;
	for (int i = 0; i < 1000; i ++)
	{
		iVec.push_back(i+1);
	}

	int* pInt = new int[iVec.size()];

	DWORD t1 = GetTickCount();
	std::copy(iVec.begin(),iVec.end(),pInt);
	DWORD t2 = GetTickCount();
	DWORD tcopy = t2 - t1;

	DWORD t3 = GetTickCount();
	for (int i = 0; i < 1000; i ++)
	{
		pInt[i] = iVec[i];
	}
	DWORD t4 = GetTickCount();
	DWORD tcopy2 = t4 - t3;

	printf("copy拷贝的时间为:%d\n",tcopy);
	printf("for循环拷贝的时间为:%d\n",tcopy2);


运行截图如下:

 

可以看出来,数据量比较小的情况下,时间没有差别,那现在我将数组元素的个数改为1000000看看如何。

vector<int> iVec;
	for (int i = 0; i < 1000000; i ++)
	{
		iVec.push_back(i+1);
	}

	int* pInt = new int[iVec.size()];

	DWORD t1 = GetTickCount();
	std::copy(iVec.begin(),iVec.end(),pInt);
	DWORD t2 = GetTickCount();
	DWORD tcopy = t2 - t1;

	DWORD t3 = GetTickCount();
	for (int i = 0; i < 1000000; i ++)
	{
		pInt[i] = iVec[i];
	}
	DWORD t4 = GetTickCount();
	DWORD tcopy2 = t4 - t3;

	printf("copy拷贝的时间为:%d\n",tcopy);
	printf("for循环拷贝的时间为:%d\n",tcopy2);


截图如下:

从图中可以看出,现在差距开始扩大,copy的时间几乎是for循环的20分之一。对数据量稍微大一点,优势逐渐显示出来。

 

当增加到500万个元素,看看效果如何:

可以看到差距更大了,居然copy的效率是for循环的30倍。

 

经过这个实验可以看出,当需要拷贝时,如果数据量比较小,两者效率差不多;但是随着数量的增大,copy函数的效率逐渐显现出来。因此,我在这里推荐用copy函数。还有什么更好的方法欢迎大家一起讨论!


原文链接:http://blog.csdn.net/zhouxuguang236/article/details/10834567
加载中
返回顶部
顶部