使用ReadFile/WriteFile可以具有确定性的错误处理语义。当使用内存映射文件时,错误通过抛出异常来返回。此外,如果内存映射文件需要访问磁盘(甚至更糟的是网络),您的内存读取可能需要几秒钟(甚至几分钟)才能完成。根据您的应用程序,这可能会导致意外的停顿。如果使用ReadFile/WriteFile,您可以使用API的异步变体来控制此行为。如果使用ReadFile,您还可以获得更确定性的性能,特别是如果您的I/O模式是可预测的 - 内存映射I/O通常是随机的,而ReadFile几乎总是串行的(因为ReadFile在当前文件位置读取并推进当前文件位置)。
文件映射的一个重要优势在于它不会影响系统缓存。如果您的应用程序通过ReadFile进行过多的I/O操作,那么您的系统缓存将增长,消耗越来越多的物理内存。如果您的操作系统是32位的,并且您拥有超过1GB的内存,那么您很幸运,因为在32位Windows上,系统缓存的大小被限制为1GB。否则,系统缓存将消耗所有可用的物理内存,并且内存管理器很快就会开始将其他进程的页面清除到磁盘上,加剧磁盘操作而不是减轻它们。这种影响在64位Windows上尤其明显,因为缓存大小仅受可用物理内存的限制。另一方面,文件映射不会导致系统缓存过度增长,同时也不会降低性能。
对于建立文件映射,您需要比仅打开和读取更复杂的代码。文件映射旨在随机访问文件的某个部分。如果您不需要这个功能,就不要费心使用文件映射。 此外,如果您需要将代码移植到另一个平台上,如果不使用文件映射,您将更容易且更快地完成该操作。