我在讀向量爲:連續調用mmap,任何緩存?
int readBytes(string filename, vector<uint32_t> &v)
{
// fstat file, get filesize, etc.
uint32_t *filebuf = (uint32_t*)mmap(0,filesize,PROT_READ,
MAP_FILE|MAP_PRIVATE,
fhand,0);
v = std::vector<uint32_t>(filebuf,filebuf+numrecords);
munmap(filebuf, filesize);
}
在主
()我有兩個連續調用(純粹作爲測試):
vector<uint32_t> v(10000);
readBytes(filename, v);
readBytes(filename, v);
// ...
第二個電話幾乎總是給人一種更快的時鐘時間:
Profile time [1st call]: 0.000214141 sec
Profile time [2nd call]: 0.000094109 sec
一看系統調用指示塊被differend內存:
mmap(NULL, 40000, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fe843ac8000
mmap(NULL, 40000, PROT_READ, MAP_PRIVATE, 4, 0) = 0x7fe843ac7000
第二次調用爲什麼更快?巧合?什麼,如果有的話,被緩存?
是的 - linux - 我剛剛添加上面的標籤。所以這個過程爲第一個呼叫建立頁表,而不是第二個呼叫。我鬆散地將此與創建新的虛擬內存區域聯繫起來。這是否總是隻在這個過程中進行第一次調用,或者是因爲調用的相似性而在此處執行了一次? –
進程擁有的頁表由每個mmap/munmap調用修改。插入/從表中插入的頁面由內核頁面緩存擁有,並保留在調用之間。 – Useless