c – 连续调用mmap,任何缓存?
发布时间:2020-12-16 09:49:19 所属栏目:百科 来源:网络整理
导读:我在矢量中读到: int readBytes(string filename,vectoruint32_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::vectoruint32_t(filebuf,filebuf+numrecords);
我在矢量中读到:
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,MAP_PRIVATE,3,0) = 0x7fe843ac8000 mmap(NULL,4,0) = 0x7fe843ac7000 为什么第二次通话更快?巧合?什么,如果有的话,缓存? 解决方法
假设你在谈论* NIX-ish,可能还有一个页面缓存,它的工作就是缓存这种数据以获得这种加速.除非在从缓存中逐出这些页面的调用之间出现其他问题,否则它们仍将存在.
因此,第一次调用可能需要: >分配页面 第二个调用可能会发现页面仍然在缓存中,并且只需要: >将页面映射到您的进程地址空间 事实上,我已经跳过了一个步骤:评论中的open / fstat步骤可能也会通过inode缓存加速. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |