我在矢量中读到:
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);
}
在main()中我有两个连续的调用(纯粹作为测试):
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
查看系统调用表明内存块是不同的:
mmap(NULL, 40000, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fe843ac8000
mmap(NULL, 40000, PROT_READ, MAP_PRIVATE, 4, 0) = 0x7fe843ac7000
为什么第二次通话更快?巧合?什么,如果有的话,缓存?
答案 0 :(得分:4)
假设你在谈论某些事情* NIX-ish,可能有一个页面缓存,其工作正是缓存这种数据以获得这种加速。除非在从缓存中逐出这些页面的调用之间出现其他内容,否则它们仍将存在。
因此,第一个电话可能需要:
第二次调用可能会发现页面仍在缓存中,只需要:
事实上,我已经跳过了一个步骤:评论中的open / fstat步骤可能通过inode缓存也加速。
答案 1 :(得分:3)
请记住,您的程序会看到虚拟内存。有一个映射表(“页表”),它将程序看到的虚拟地址映射到真实的物理内存。操作系统将确保两个mmap()调用将程序看到的两个不同的虚拟地址映射到同一个物理内存。因此,只需从磁盘加载一次数据。
更多信息: