gpt4 book ai didi

c++ - Win32 内存映射文件与 CRT fopen/fread 的性能

转载 作者:IT老高 更新时间:2023-10-28 21:43:32 26 4
gpt4 key购买 nike

我需要按顺序读取(扫描)文件并处理其内容。文件大小可以从非常小(一些 KB)到非常大(一些 GB)。

我在 Windows 7 64 位上使用 VC10/VS2010 尝试了两种技术:

  1. Win32 内存映射文件(即 CreateFile、CreateFileMapping、MapViewOfFile 等)
  2. fopen 并从 CRT 读取。

我认为内存映射文件技术可能比 CRT 函数更快,但一些测试表明两种情况下的速度几乎相同。

以下 C++ 语句用于 MMF:

HANDLE hFile = CreateFile(
filename,
GENERIC_READ,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
FILE_FLAG_SEQUENTIAL_SCAN,
NULL
);

HANDLE hFileMapping = CreateFileMapping(
hFile,
NULL,
PAGE_READONLY,
0,
0,
NULL
);

文件被顺序读取,逐 block 读取;每个 block 的大小为 SYSTEM_INFO.dwAllocationGranularity

考虑到 MMF 和 CRT 的速度几乎相同,我会使用 CRT 函数,因为它们更简单且多平台。但我很好奇:我是否正确使用了 MMF 技术?这种按顺序扫描文件的情况下MMF性能与CRT一样正常吗?

谢谢。

最佳答案

如果您按顺序访问该文件,我相信您不会看到太大的不同。由于文件 I/O 被大量缓存,可能还会使用 + 预读。

如果您在文件数据处理过程中有许多“跳跃”,情况会有所不同。然后,每次设置一个新的文件指针和读取一个新的文件部分可能会杀死 CRT,而 MMF 会给你最大可能的性能

关于c++ - Win32 内存映射文件与 CRT fopen/fread 的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3980035/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com