1. 程式人生 > >memcpy 與new 開銷,在大資料處理時謹慎使用指標

memcpy 與new 開銷,在大資料處理時謹慎使用指標

因為最近做些基本文字處理工作,主要是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合併過程中,實際上主要的時間開銷還是在合併演算法上,