经常访问文件映射的内存

时间:2017-01-15 12:24:15

标签: c++ c file memory memory-mapped-files

频繁访问大型(1~2 GB)文件映射内存会导致性能下降吗? (在一个紧凑的循环中,比如游戏的更新循环)

据我所知,内存映射文件由操作系统缓存(使用页面错误),这使得它似乎可以安全访问,因为它已加载到内存中。

但是,我还认为,由于它是缓存,而不是已加载,因此可能会导致性能下降。

请帮助我得到正确的答案,我们将不胜感激。如果可能的话,我想知道Linux和Windows的答案,但我怀疑他们的行为 不同。

注意:当我说“访问”时我会读写。

2 个答案:

答案 0 :(得分:1)

您要求重复访问1-2 GB范围的内存映射文件。简短的回答是,它会有性能下降,特别是如果你的页面很小。

第一个问题是,重复访问1 GB的任何内存将(默认情况下)倾向于驱逐您拥有的任何其他数据,并且CPU数据缓存命中率将受到影响。请考虑典型的CPU数据高速缓存大小只有几兆字节。

第二个问题是翻译旁视缓冲区。如果您使用的默认页面大小为4 KB,那么1 GB就是250k页面。在Linux上,您应该启用“大页面”以减少访问如此大的内存区域所带来的TLB负载。

第三个问题是你似乎还没有测试过它。测试对于这类事情非常重要。没有它,你永远不会知道你是否有真正的问题或只是假设的问题。

答案 1 :(得分:-1)

这主要是系统特定的。一个考虑因素是操作系统是否可以直接将内存映射到磁盘或是否需要一些中间转换。某些OS /文件系统组合允许将映射文件完全视为页面文件(提供良好的性能和读取大文件的最快方法,尤其是在磁盘上连续时)。其他人没有。

  

我怀疑他们会表现得那么不同。

他们实际上是完全不同的。 Windows使用支持连续文件的硬文件系统。经典Unix没有连续文件的概念