memcpy 与new 开销,在大数据处理时谨慎使用指针
来源:互联网 发布:pdm 软件 编辑:程序博客网 时间:2024/06/06 02:52
因为最近做些基本文本处理工作,主要是IP地址的处理,开始没有在意 对象在堆上 与对象在栈上分配上的时间开销,觉得用new会更加方便但是,在处理数据时候,我要处理的数据有3亿条数据,存在文本文件中,后来发现效率特备低。
拥有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合并过程中,实际上主要的时间开销还是在合并算法上,
- memcpy 与new 开销,在大数据处理时谨慎使用指针
- 选择线程数目时谨慎考虑线程切换开销
- 大型项目开发:谨慎使用智能指针
- Perl 程序在做多线程时async使用一定要谨慎
- 【大数据处理架构】3. kafka安装与使用
- new、delete 与指针
- new与指针
- rinetd 在生产环境要谨慎使用
- 大数据处理与并行计算
- 条款7.使用包含由new产生的指针容器时,切记在容器销毁前delete指针
- 条款7:当使用new得指针的容器时,记得在销毁容器前delete那些指针
- 注意!!一定要谨慎使用c/c++原生指针
- BEA的Oracle JDBC驱动与Oracle的JDBC驱动区别如此之大,请谨慎选择、使用和调整!
- 值传递开销大
- 这些Linux命令,使用时需谨慎
- 云计算与大数据处理技术
- 云计算与大数据处理技术
- 云计算与大数据处理技术
- Linux下回传码自结
- matlab中读取、播放视频的方法
- 随笔-20131209
- C#实现资源管理器
- 互联网网站的反爬虫策略浅析
- memcpy 与new 开销,在大数据处理时谨慎使用指针
- 多种方法访问局域网中的计算机
- Teradata tools
- shell_文件列表
- Oracle 如何修改表中字段顺序?
- 关于wince 电源管理的一些帖子收集
- 网页设计初学者!如何开始?怎样坚持?
- 基于visual Studio2013解决C语言竞赛题之1031猜数
- oracle表之间的连接