现在有个功能需要,用户会大量频繁地访问文件,于是我在程序启动时先将众多文件读入内存(1~2G的规模),用户访问文件时直接提供内存地址。
现在有个问题:我实现了两个方案,1个是用mmap系统调用,另一个是自己new出每个文件大小的空间,再将文件内容拷贝到申请的空间中,测试时发现两个方案是以下结果:
10000个文件,总共1.6G:
mmap用时:3秒
自己缓存用时:130秒
差距如此之大让我没有想到,因为怀疑是自己频繁地new和memcpy导致的性能下降,故在自己缓存时注释了new和memcpy的代码,只留read,再次测试,似乎没啥大改变,因此觉得主要是read时间占用。
可是mmap用时只有3秒,是不是太快了点?查了一些资料,还是有个疑问:mmap映射了文件内容到虚拟内存,是不是并没有实际去读磁盘,而是用到的时候才去读的?如果是这样的话,是不是我用new的方法更好,虽然启动慢点,但不会在运行过程中浪费时间去读磁盘?