memcpy 與new 開銷,在大資料處理時謹慎使用指標
阿新 • • 發佈:2019-01-08
因為最近做些基本文字處理工作,主要是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合併過程中,實際上主要的時間開銷還是在合併演算法上,