我在代码优化方面遇到了一些问题。我会尽力解释我所处的情况。如果不清楚,请询问。
问题很直接。以前,我有2个单独的文件,分别在同一过程中打开并分别对两个文件分别调用mmap(2)
。与第二个映射相比,第一个映射的访问频率更高。
我认为可以进一步优化代码,而不是使用2个单独的文件,我可以将第一个文件的内容(与第二个文件相比,其大小确实很小)放置在第二个文件的开头,然后将第二个文件的根目录向前移动所需的偏移量。
这样可以避免使用2个文件,从而避免调用open(2)
和mmap(2)
。由于此设置代码(调用open(2)
和mmap(2)
)将至少被调用100,000次以上,因此删除这两个调用应该很重要。但是我不知道为什么我移动到第二个文件开头的部分的访问速度变慢了。在google上,我读到某处可能是某些页面缓存的情况,但是我不确定是否是这种情况,因为写入操作的速度几乎慢了10到20倍。请建议我该如何改善呢?
答案 0 :(得分:0)
您可以使用来自同一映射的两个指针:
int len = 1300,
off = 600,
prot = PROT_READ | PROT_WRITE,
flags = MAP_SHARED,
fd = open("file", O_RDWR);
char *map = mmap(NULL, len, prot, flags, fd, 0),
*map2 = map + off;
*map = 'a';
*map2 = 'b';
除非页面大小的倍数(通常为4096),否则不要使用offset
参数。
答案 1 :(得分:-1)
为使单个文件获得与两个文件相同的I / O模式,请确保文件的第二部分从页面边界(4K)开始。您可能需要填补第一部分才能做到这一点。