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\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函数。还有什么更好的方法欢迎大家一起讨论!
C++ STL copy函数效率分析的更多相关文章
- 一个在字符串中查找多个关键字的函数strstrs(三种不同算法实现及效率分析)
平时项目中有时需要用到在字符串中搜索两个或更多的关键字的情景.例如:将字符串"ab|cd#ef|"按竖线或者井号做分隔 如果是大项目,一般会采用正则表达式做处理.但有时写个小程序, ...
- [GIt] 团队工作效率分析工具gitstats
copy : http://www.cnblogs.com/ToDoToTry/p/4311637.html 如果你是团队领导,关心团队的开发效率和工作激情:如果你是开源软件开发者,维护者某个repo ...
- (转)x264源码分析(1):main、parse、encode、x264_encoder_open函数代码分析
转自:http://nkwavelet.blog.163.com/blog/static/2277560382013103010312144/ x264版本: x264-snapshot-2014 ...
- mySql执行效率分析
1.关于SQL查询效率,100w数据,查询只要1秒,与您分享: 机器情况p4: 2.4内存: 1 Gos: windows 2003数据库: ms sql server 2000目的: 查询性能测试, ...
- 1.Go语言copy函数、sort排序、双向链表、list操作和双向循环链表
1.1.copy函数 通过copy函数可以把一个切片内容复制到另一个切片中 (1)把长切片拷贝到短切片中 package main import "fmt" func main() ...
- POJ1833 排列 调用全排列函数 用copy函数节省时间 即使用了ios同步代码scanf还是比较快
排列 Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 21268 Accepted: 8049 Description 题 ...
- copy()函数技术推演
/*** str_copy.c ***/ #include<stdio.h> void copy_str21(char *from, char *to) { for(; *from != ...
- 标准C IO函数和 内核IO函数 效率(时间)比较
前言 标准C提供的文件相关的IO函数,除标准错误输出是不带缓冲的(可以尽快的将错误消息显示出来)之外,所有与终端相关的都是行缓冲,其余都是全缓冲的. 我们可以使用setbuf,setvbuf改变指定流 ...
- php不使用copy()函数复制文件的方法
本文实例讲述了php不使用copy()函数复制文件的方法.分享给大家供大家参考.具体如下:下面的代码不使用php内置的copy函数,直接通过文件读取写入的操作方式复制文件 <?php funct ...
随机推荐
- 更改ORACLE 用户的 expired状态
oracle中, 经常用户的状态会变成locked, expired 等状态, 这种情况下怎么处理呢? 首先, 如果是locked状态还好办, DBA直接执行alter user scott acco ...
- PHP - 遍历文件夹下的所有文件名
/** * * 函数名:myreaddir($dir) * 作用:读取目录所有的文件名 * 参数:$dir 目录地址 * 返回值:文件名数组 * * */ function myreaddir($di ...
- VC动态轨迹画线
分类: 2.4 线程/图形学2010-04-30 22:14 1878人阅读 评论(0) 收藏 举报 文档null 这是一个绘制直线的简单绘图程序,能过实现动态轨迹画线,在拖动时产生临时线来表示可能画 ...
- DOM querySelector选择器
原生的强大DOM选择器querySelector 在传统的 JavaScript 开发中,查找 DOM 往往是开发人员遇到的第一个头疼的问题,原生的 JavaScript 所提供的 DOM 选择方法并 ...
- 继承Application实现Android数据共享
Application类 在Android中,启动一个应用,首先会初始化Application,然后再通过它检查AndroidManifest.xml清单文件,选择须要首先启动的Activi ...
- Java 异常分类
1.java异常层次结构: 粉红色的是已检查异常(checked exceptions),其必须被 try{}catch语句块所捕获,或者在方法签名里通过throws子句声明.已检查异常必须在编译时被 ...
- Cookie例子
马士兵老师的~~ cookie是服务器将信息保存在客户端的一个表示方式 名-值 服务器只能写入文档文件 每个浏览器都有唯一的标识号 且每个浏览器只允许访问与自身相关的cookie的内容 cookie分 ...
- Python全栈开发
Python全栈开发 一文让你彻底明白Python装饰器原理,从此面试工作再也不怕了. 一.装饰器 装饰器可以使函数执行前和执行后分别执行其他的附加功能,这种在代码运行期间动态增加功能的方式,称之为“ ...
- 同一个form里,不管哪个 submit 都是直接提交form表单里的内容
要达到你的目的,就不能用类型为 submit 的按钮,要用 button,然后加onclick 方法来自定义预处理参数,然后再调用 submit 方法提交表单,比如 <script type=& ...
- 深入浅出Hive企业级架构优化、Hive Sql优化、压缩和分布式缓存(企业Hadoop应用核心产品)
一.本课程是怎么样的一门课程(全面介绍) 1.1.课程的背景 作为企业Hadoop应用的核心产品,Hive承载着FaceBook.淘宝等大佬 95%以上的离线统计,很多企业里的离线统 ...