序:
之前在一篇關於vector的push_back和resize()等方式讀取資料的效率對比中,我們發現最快的是通過讀入優化。這次將測試四種讀入方式的效率對比:
兩種讀入優化,scanf與fscanf。
測試資料採用隨機生成的10000000個int型整數,在windows環境下執行。
測試時間由time.h中的函式計算。
四種讀取方式:
int input;
inline
void read1(int &curr)
return ;
}inline
void read2()
//return input;
return ;
}void init1()//傳位址
int endtime = clock();
ans[1] += (double)(endtime-starttime)/clocks_per_sec;
//cout << "totle time : " << (double)(endtime-starttime)/clocks_per_sec << endl;
fclose(stdin);
}void init2()//利用全域性變數
int endtime = clock();
ans[2] += (double)(endtime-starttime)/clocks_per_sec;
//cout << "totle time : " << (double)(endtime-starttime)/clocks_per_sec << endl;
fclose(stdin);
//fclose(stdout);
}void init3()//檔案讀入
int endtime = clock();
ans[3] += (double)(endtime-starttime)/clocks_per_sec;
//cout << "totle time : " << (double)(endtime-starttime)/clocks_per_sec << "s"
}void init4()//普通
int endtime = clock();
ans[4] += (double)(endtime-starttime)/clocks_per_sec;
//cout << "totle time : " << (double)(endtime-starttime)/clocks_per_sec << "s"
}
很顯然後兩種相對較慢,所以分兩組進行測試:(1,2)和(3,4)。對於兩種讀入優化,我們的測試方法是迴圈50次算總時間與平均時間。
結果如下:
看來相比於傳位址,設定乙個全域性變數還是更快一些。平均快18ms。
對於3,4的讀入,我們迴圈10次。
結果如下:
38.773s
37.575s
看得出相比於檔案讀入,scanf還是更勝一籌。
那麼小資料哪?
測試5000個int型整數的讀入時間(迴圈10次)。
結果如下:
結果依然。
100個(10次)。
突然fscanf變得很快。
總而言之,小資料讀入優化並沒有什麼用,當總資料超過百萬的時候會體現出較大差距
(100000*10的時候:
0.059000 0.005900
0.057000 0.005700
0.393000 0.039300
0.372000 0.037200)讀入時間相差300+ms
十萬時是30+ms。若達到千萬那麼前兩種只是後兩種的零頭,差距巨大(3.3s)。
以此可見,讀入越大的資料的時候讀入優化越重要,乙個讀入優化可能就能將tle的程式ac(前提是你演算法是對的…)。
箜瑟_qi 2017.04.15 14:19
c List四種查詢方式的效率對比
對list進行查詢的時候,會有多種方法供我們使用,但是在追求 簡潔和效率的情況下,哪種方法才是我們的最優選擇呢?先把我的測試結果擺出了吧 查詢方式 單位 ms debug模式 release模式 for4.2 1.6foreach 73.2 firstordefault119 find4.41.8 ...
XML檔案四種解析方式對比
dom在解析時,會將xml檔案中的所有內容一次性載入到記憶體中,並形成乙個dom樹。優點形成了樹結構,直觀好理解,更易於編寫 解析過程中樹的結構儲存在記憶體中,方便修改。缺點 當xml檔案較大時,記憶體消耗比較大,容易影響解析效能並造成記憶體溢位。sax解析是基於事件驅動的解析方式。優點採用事件驅動...
四種定址方式
直接在指令中給出運算元,不需要儲存單元,執行速度快,但是顯然資料也不能冗長,通用型性差,一般用來指定一些要求不高的整形整數。運算元 於暫存器,結果也寫回暫存器。顯然這個主要用到暫存器,這也是他的名字的由來。指令給出有效位址,這使得位址碼會很長,通用性也差。指令中給出的是運算元位址的位址,顯然就是要根...