我在读向量为:连续调用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