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 ...
随机推荐
- 如何在myeclipse有个项目文件很多,我想找一段代码,怎么查找?
然后输入要找的文字 然后在File name pathherns 中写 *.java 如果有多个就可以用逗号分隔! 然后 search
- 开始着手Oracle中Scott用户的管理系统
准备好长时间,一直想把最近所学用于实践,正好想到Oracle的Scott用户的表设计还算合理,且自己也很熟悉,现将整个系统的架构设定如下: 1.数据库不用说,Oracle 11g 的 Scott 用户 ...
- VC 对话框背景颜色、控件颜色
系统环境:Windows 7软件环境:Visual C++ 2008 SP1本次目的:为对话框设置背景颜色.控件颜色 既然MFC对话框不好开发,那么现在我们来开始美化我们的对话框.为对话框设置背景颜色 ...
- 使用tmux [FreeBSDChina Wiki]
使用tmux [FreeBSDChina Wiki] 使用tmux tmux是一个优秀的终端复用软件,类似GNU Screen,但来自于OpenBSD,采用BSD授权.使用它最直观的好处就是,通过一个 ...
- Android 调整屏幕分辩率
Android 可设置为随着窗口大小调整缩放比例及设定fixed的窗口大小. 对于surface的控制在SurfaceHolder类中进行 而Android 屏幕分辩率中已经有一个类DisplayMe ...
- Android开发之大位图二次採样压缩处理(源码分享)
图片有各种形状和大小.在很多情况下这些图片是远远大于我们的用户界面(UI)且占领着极大的内存空间,假设我们不正确位图进行压缩处理,我们的程序会发生内存泄露的错误. MainActivity的代码 pa ...
- HDU 4882 ZCC Loves Codefires(贪心)
ZCC Loves Codefires Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/O ...
- EasyUI - Tree 树组件
效果: 数据库设计: 使用的数据: 其中的字段,是跟据要生成的树节点的属性定义的. text:代表要显示的字段名称. state:是否是目录节点. iconCls:节点的图标是什么. url:跳转的链 ...
- c语言, objective code(new 2)
参考: 1. C中的继承和多态 http://www.cnblogs.com/skynet/archive/2010/09/23/1833217.html
- Windows Azure入门教学系列 (一): 创建第一个WebRole程序
原文 Windows Azure入门教学系列 (一): 创建第一个WebRole程序 在第一篇教学中,我们将学习如何在Visual Studio 2008 SP1中创建一个WebRole程序(C#语言 ...