四種讀入方式的效率對比

2022-05-16 21:19:57 字數 2359 閱讀 9721

序:

之前在一篇關於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解析是基於事件驅動的解析方式。優點採用事件驅動...

四種定址方式

直接在指令中給出運算元,不需要儲存單元,執行速度快,但是顯然資料也不能冗長,通用型性差,一般用來指定一些要求不高的整形整數。運算元 於暫存器,結果也寫回暫存器。顯然這個主要用到暫存器,這也是他的名字的由來。指令給出有效位址,這使得位址碼會很長,通用性也差。指令中給出的是運算元位址的位址,顯然就是要根...