windows檔案讀取效率對比

2021-06-19 21:37:47 字數 2176 閱讀 6821

readfile1.cpp是使用記憶體對映檔案讀取檔案,readfile2.cpp是普通readfile

readfile1.cpp**

char buf[10001];

const char *env = getenv("data_dir");

char wsp[255];

sprintf(wsp, "%s/demo.dbf", env);

//const char *wsp = "wan.log";

int a = gettickcount();

handle h = createfile(wsp, generic_read, 0, null, open_always, file_attribute_normal, null);

char *p = (char *)mapviewoffile(h2, file_map_read, 0, 0, 0);

for(int j = 0; j < 1000; j++)

}printf("time used %d\n", gettickcount() - a);

buf[10000] = 0;

//printf(buf);

unmapviewoffile(p);

closehandle(h2);

closehandle(h);

scanf("%s", buf);

return 0;

readfile2.cpp**

char buf[10001];

const char *env = getenv("data_dir");

char wsp[255];

sprintf(wsp, "%s/demo.dbf", env);

int a = gettickcount();

ulong r;

handle h = createfile(wsp, generic_read, 0, null, open_always, file_attribute_normal, null);

for(int j = 0; j < 1000; j++)

}printf("time used %d\n", gettickcount() - a);

buf[10000] = 0;

closehandle(h);

scanf("%s", buf);

return 0;

效能對比1,任務管理器中各項指標

2,速度對比

任務管理器中各項指標效能對比:隨機訪問時1比2快多了

2.1 如果把2中setfilepointer注釋掉

結論

1.頻繁的setfilepointer與readfile會非常費勁。就算setfilepointer呼叫是多餘的。

2.去掉setfilepointer後與2原來io讀取量對比可知,readfile其實本身就有快取;

setfilepointer會使readfile的快取機制失去作用。

3.使用記憶體對映隨機讀取檔案會比readfile快多了,但是順序讀取檔案時readfile快(估計是記憶體對映機制有太多的頁面錯誤,效能有損耗)

4.記憶體對映檔案其實就是建立起虛擬記憶體與物理磁碟間的對映關係。訪問建立起記憶體對映檔案的虛擬記憶體時,如果那塊檔案沒有裝進記憶體,會引起缺頁中斷,自動把那部分檔案裝進記憶體以供訪問。因此1的頁面錯誤比2多很多。但是1的io讀取量又比2少很多,推測是由缺頁中斷導致的io讀取並沒有在任務管理器體現。

5.用記憶體對映檔案讀檔案,記憶體**去了?為何1跟2比他不比2佔記憶體?看看1的缺頁次數與2對比,多了2453次,在windows上預設乙個頁面就是4k大小,2453*4k大約就是9.5m其實大約就是10m,就是我實際讀了這麼多的檔案,這解釋了說明了1.其實記憶體對映檔案不佔記憶體,2.io量雖然在io讀取位元組裡面看不出來,但是在缺頁次數上面可以推算出來。

Mat 讀取資料 及效率對比

1 mat mat 2 mat mat int rows,int cols,int type 3 mat mat size size,int type 4 mat mat int rows,int cols,int type,constscalar s 5 mat mat size size,int...

python統計檔案行數效率對比

我們現在有乙個檔案exp data,想統計它的行數 現在有四種方法 1 直接把檔案通過readlines 讀入為乙個大list,然後統計list的長度 2 每一行計數 3 直接借助os包呼叫shell函式 usr bin python coding utf 8 import time,os answ...

union in 效率對比

對於索引列來最好使用union all,因複雜的查詢 包含運算等 將使or in放棄索引而全表掃瞄,除非你能確定or in會使用索引 對於只有非索引字段來說你就老老實實的用or 或者in,因為 非索引字段本來要全表掃瞄而union all 只成倍增加表掃瞄的次數 對於既有索引字段 索引字段有效 又包...