zoukankan      html  css  js  c++  java
  • C++ STL copy函数效率分析

              在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
    ",tcopy);
    	printf("for循环拷贝的时间为:%d
    ",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
    ",tcopy);
    	printf("for循环拷贝的时间为:%d
    ",tcopy2);


    截图如下:

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

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

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

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

  • 相关阅读:
    【RAC】 RAC For W2K8R2 安装--RDBMS软件的安装(五)
    【RAC】 RAC For W2K8R2 安装--grid的安装(四)
    【RAC】 RAC For W2K8R2 安装--共享磁盘的配置(三)
    【RAC】 RAC For W2K8R2 安装--操作系统环境配置 (二)
    【RAC】 RAC For W2K8R2 安装--总体规划 (一)
    【OGG】 RAC环境下管理OGG的高可用 (五)
    【OGG】RAC环境下配置OGG单向同步 (四)
    【OGG】OGG简单配置双向复制(三)
    【OGG】OGG的单向复制配置-支持DDL(二)
    【OGG】OGG的单向DML复制配置(一)
  • 原文地址:https://www.cnblogs.com/pangblog/p/3297305.html
Copyright © 2011-2022 走看看