【发布时间】: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 创建期间?
文件数据何时真正加载到主存中?
非常感谢。
【问题讨论】:
标签: c++ performance boost ipc filemap