加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

memcpy 与new 开销,在大数据处理时谨慎使用指针

发布时间:2020-12-14 03:54:12 所属栏目:大数据 来源:网络整理
导读:因为最近做些基本文本处理工作,主要是IP地址的处理,开始没有在意 对象在堆上 ?与对象在栈上分配上的时间开销,觉得用new会更加方便但是,在处理数据时候,我要处理的数据有3亿条数据,存在文本文件中,后来发现效率特备低。 拥有15G大小IP信息文件,一共大

因为最近做些基本文本处理工作,主要是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合并过程中,实际上主要的时间开销还是在合并算法上,

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读