windows - 具有部分对象(CreateFileMapping)的 I/O 是否比基本 api(Read/WriteFile)更快?

标签 windows file-io filesystems virtual-memory memory-mapped-files

  1. CreateFileMapping 和 MapViewOfFile,然后我们使用类似 memcpy 的函数进行 I/O。
  2. 只需使用读/写文件。

第一个比第二个快吗? 我不明白。

为什么更快?
如果我们使用节对象,那么我们可以从 VMM 或缓存​​管理器中获得更多的缓存优势吗?

最佳答案

发生页面调出时,文件内存映射速度更快,因为文件本身用作分页存储。

如果内存映射文件中的内存未更改,则无需将页面刷新到页面文件,因为数据已经在文件中,Windows 可以从磁盘重新读取页面。 .EXE 和 .DLL 文件使用此机制加载,因此是它们自己的页面存储。

如果内存映射文件中的内存被写入,那么page out就好像已经使用过分页文件一样。可能更快,因为使用了磁盘上的相同位置(取决于 NTFS 优化)。

普通 API 使用页面文件支持的内存来保存内存中的文件内容。

从略微不同的角度来看,这两个 API 都进行了优化,因为内存映射文件实际上可能会在后台使用读/写文件 API,因此您可以在使用较低的抽象时获得微优化

这两种机制都将使用 VMM/缓存管理器。

关于windows - 具有部分对象(CreateFileMapping)的 I/O 是否比基本 api(Read/WriteFile)更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4142125/

相关文章:

c++ - 查找堆损坏

c++ - 命令提示符可以显示unicode字符吗?

python - 无需 PowerShell 即可获取 WmiObject

R - 将数据帧写入/读取到文件,包括属性

macos - OSX - 在哪里放置我的命令行二进制 launchdaemon 和相关的 dylibs

C++多语言字符串输出

perl - 有没有更有效的方法在 Perl 中生成随机文件?

java - 文件写入 : String to Bytes

java - 是否有针对 Java 中的 XA 事务文件访问的开源解决方案?

ruby - 如何判断一条路径是否是另一条路径的祖先?