我有一个文件解析器,它将文件作为文件映射对象加载,然后根据调用者的需求映射区域。可以在本地或通过网络访问这些文件。
此文件读取是顺序的。
我有两种方法 -
方法1
创建一个file_mapping对象,比如f。
使用'f'创建映射区域,其中一次只有一个mapped_region处于活动状态。
方法2
每次创建mapped_region时,创建新的file_mapping对象(对于同一文件)。
方法2基于file_mapping设计用于进程间通信的假设,因此为同一文件创建多个file_mapping对象不会成为问题。
在本地访问文件时,性能基准测试显示两种方法中的相似时序(对于3GB文件)
但是,当通过网络访问文件时,方法2与方法1相比,执行速度慢约5倍。
在这两种方法中,mapped_region在创建新的之前被破坏。
方法2的唯一区别是file_mapping对象是为每个mapped_region创建和销毁的。
基准标记顺序文件读取操作的过程: - 文件大小:3GB - 创建的映射区域数量:8600 - 映射区域大小:可变,范围为9KB - 900KB - 映射区域访问:创建后立即访问所有区域。 - 映射区域创建频率:一个接一个地循环,对从映射区域提取的数据进行一些处理。处理涉及递归结构填充,但深度最大为10.它不是非常密集。
我想明白:
为什么时间上存在如此巨大的差异?
创建file_mapping对象时到底发生了什么?
创建一个mapped_region对象时究竟发生了什么?
OS在创建file_mapping期间或在创建mapped_region期间是否搜索了大量内存?
文件数据何时实际加载到主内存中?
非常感谢。
在不知道你的基准程序的情况下回答这个问题是不可能的,即你创建mapped_region
对象的频率,映射部分有多大,以及实际访问它们的哪些部分。
还不清楚在您的实现中,文件映射对象(boost::file_mapping
)是否也显式打开文件句柄,或者文件是否由您打开。
我只能猜测在网络文件系统中创建文件和映射对象可能需要更多的PC间通信(用于同步)。