memcpy 与new 开销,在大数据处理时谨慎使用指针
2013-12-09 13:09
239 查看
因为最近做些基本文本处理工作,主要是IP地址的处理,开始没有在意 对象在堆上 与对象在栈上分配上的时间开销,觉得用new会更加方便但是,在处理数据时候,我要处理的数据有3亿条数据,存在文本文件中,后来发现效率特备低。
拥有15G大小IP信息文件,一共大概3亿条数据。
每条消息 IP,地区,服务商
把这些消息处理合并成 起始IP:结束IP 地区 ,服务商
1. 反复调用new,和 一次new一个大空间,把栈上的对象拷贝到new的空间 时间开销对比
在处理的工程中发现当处理1万条数据时,花费时间居然是6S左右,我觉得这个太慢了开始排查到底是哪里导致程序慢了
现在问题没有找全,但是有个问题已经很明显了,那就是对象在栈上分配,与堆的开销。在原来的程序中,每读取一行数据,就new一个数据结构,然后加入链表。
现在来看看 他们的区别吧
上面是一个小的测试,看看结果吧:
cout::::
memcpy used : 1;
new used :13
上面两段程序都是干一件事情,生成很多对象实例,然后加入数组中管理。
这个是一个感性的认识。对象在堆上分配花费的时间 是 栈上分配对象然后拷贝到原先申请的大块堆内存花费时间的13倍,
new 到底干了什么事情
1.申请内存
2.初始化
其中申请内存,这个开销比较大,需要系统调用,根据操作系统内存管理策略不同,分配空间。可能一次调用看不出来,但是达到2^24次的时候累计开销时间是很大的哦,这个就是上面为什么new used 13秒。
在这个项目开发工程多,然我认识到c++ string 实际上是很危险的,string会动态增加内存使用量,但是不会自动减少!!!,导致在执行程序的时候内存被吃掉的越来越大。
2. 关键问题还是在和平算法上
在IP合并过程中,实际上主要的时间开销还是在合并算法上,
拥有15G大小IP信息文件,一共大概3亿条数据。
每条消息 IP,地区,服务商
把这些消息处理合并成 起始IP:结束IP 地区 ,服务商
1. 反复调用new,和 一次new一个大空间,把栈上的对象拷贝到new的空间 时间开销对比
在处理的工程中发现当处理1万条数据时,花费时间居然是6S左右,我觉得这个太慢了开始排查到底是哪里导致程序慢了
现在问题没有找全,但是有个问题已经很明显了,那就是对象在栈上分配,与堆的开销。在原来的程序中,每读取一行数据,就new一个数据结构,然后加入链表。
现在来看看 他们的区别吧
const long size=0x11fffff; AA * pArray=new AA[size](); AA * *ppArray=(AA **)malloc(sizeof(AA*)*size); time_t time1=time(0); for( long i=0; i<size;i++) { AA tem(i,i); pArray[i]=tem; } time_t time2=time(0); cout<<" memcpy used:"<<(time2- time1)<<endl; for(long i=0;i<size;i++) { AA *temP=new AA(i,i); ppArray[i]=temP; } time_t time3=time(0); cout<<"new used: "<<time3-time2<<endl;
上面是一个小的测试,看看结果吧:
cout::::
memcpy used : 1;
new used :13
上面两段程序都是干一件事情,生成很多对象实例,然后加入数组中管理。
这个是一个感性的认识。对象在堆上分配花费的时间 是 栈上分配对象然后拷贝到原先申请的大块堆内存花费时间的13倍,
new 到底干了什么事情
1.申请内存
2.初始化
其中申请内存,这个开销比较大,需要系统调用,根据操作系统内存管理策略不同,分配空间。可能一次调用看不出来,但是达到2^24次的时候累计开销时间是很大的哦,这个就是上面为什么new used 13秒。
在这个项目开发工程多,然我认识到c++ string 实际上是很危险的,string会动态增加内存使用量,但是不会自动减少!!!,导致在执行程序的时候内存被吃掉的越来越大。
2. 关键问题还是在和平算法上
在IP合并过程中,实际上主要的时间开销还是在合并算法上,
相关文章推荐
- 大规模数据运行时,可以考虑使用多线程处理!
- 使用tshark处理ns3仿真数据
- 使用LitJSON.dll处理json格式的数据示例
- 【重复行处理1】删除重复数据的另类方法,使用exceptions into
- SQL SERVER2000教程-第五章 处理数据 第十五节 使用TRUNCATE TABLE快速删除表中的所有数据
- 基因数据处理18之基因序列生成工具wgsim安装和使用
- Java的Struts2框架配合Ext JS处理JSON数据的使用示例
- 一步步学习SPD2010--第五章节--处理数据视图(6)--使用XSLT
- 在SSIS中使用XML任务处理XML数据或文档
- Thinkphp框架中使用数据对象自动处理添加数据库数据时,关于在数据库表中添加新列时出现新列的数据添加不上去?
- JS使用tofixed与round处理数据四舍五入的区别
- 有一字符串,包含数字与字母,编程去除数字。要求:1、要求在原字符串中操作2、使用指针处理
- Cognos函数(十八) - 使用rank时处理为NULL的数据
- 使用void指针给函数传递不同的数据类型
- 实战c++中的智能指针unique_ptr系列-- std::unique_ptr的构造(尽量使用C++14中的std::make_unique,而不是new)
- OpenCV Mat数据类型指针ptr的使用
- javaweb学习总结(三十四)——使用JDBC处理MySQL大数据
- 使用Access做为导出数据的中间介质时,时间和长整型字段要特殊处理
- Node.js使用Buffer类处理二进制数据(二)
- mybatis 处理数组类型及使用Json格式保存数据 JsonTypeHandler and ArrayTypeHandler