boost::file_mapping 对象的创建成本?
Posted
技术标签:
【中文标题】boost::file_mapping 对象的创建成本?【英文标题】:Cost of creation of boost::file_mapping object? 【发布时间】:2019-03-20 06:31:22 【问题描述】:我有一个文件解析器,它将文件作为文件映射对象加载,然后根据调用者的需求映射区域。 这些文件可以在本地访问,也可以通过网络访问。
这个文件读取是顺序的。
我有两种方法 -
方法 1
创建一个 file_mapping 对象,比如 f。
使用创建映射区域 'f',其中一次只有一个 mapped_region 处于活动状态。
方法 2
创建新的 file_mapping 对象(对于同一个文件),每次 mapped_region 将被创建。
方法 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 对象时究竟会发生什么?
操作系统是否在文件映射期间搜索大块内存 创建或在 mapped_region 创建期间?
文件数据何时真正加载到主存中?
非常感谢。
【问题讨论】:
【参考方案1】:如果不知道您的基准测试程序,即您创建mapped_region
对象的频率、映射部分有多大以及实际访问了哪些部分,就不可能回答这个问题。
还不清楚在您的实现中文件映射对象 (boost::file_mapping
) 是否也显式打开文件句柄,或者文件是由您打开的。
我只能猜测在网络文件系统中创建文件和映射对象可能需要更多的PC间通信(用于同步)。
【讨论】:
我将在我的问题中添加这些详细信息 file_mapping 对象打开文件句柄。我没有通过任何其他调用打开文件。以上是关于boost::file_mapping 对象的创建成本?的主要内容,如果未能解决你的问题,请参考以下文章
设计模式代理模式 ( 动态代理使用流程 | 创建目标对象 | 创建被代理对象 | 创建调用处理程序 | 动态创建代理对象 | 动态代理调用 )