我在向量中读到:
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
为什么第二个电话打得更快?巧合?什么,如果有的话,是缓存的?
发布于 2013-12-09 08:41:30
假设你在谈论什么*NIX-ish,可能有一个页面缓存,它的工作就是缓存这类数据以获得这种加速。除非在调用之间有其他东西将这些页面从缓存中删除,否则它们仍然存在。
因此,第一个呼叫可能必须:
第二个调用可能会找到缓存中的页面,并且只需要:
实际上,我跳过了一个步骤:您的注释中的open/fstat步骤可能也是通过inode缓存加速的。
发布于 2013-12-09 08:36:37
记住,您的程序会看到虚拟内存。有一个映射表(“页面表”),它将程序看到的虚拟地址映射到实际的物理内存中。操作系统将确保两个mmap()调用map程序看到的两个不同的虚拟地址到相同的物理内存中。因此,数据只需从磁盘加载一次。
更多的死亡:
https://stackoverflow.com/questions/20475666
复制相似问题