当前位置 : 主页 > 网络安全 > 测试自动化 >

性能 – 内存映射文件在巨大的顺序读取上更快?为什么?

来源:互联网 收集:自由互联 发布时间:2021-06-22
与仅调用ReadFile相比,我使用下面的代码来衡量读取内存映射文件的大型顺序读取之间的性能差异: HANDLE hFile = CreateFile(_T("D:\\LARGE_ENOUGH_FILE"), FILE_READ_DATA, FILE_SHARE_READ | FILE_SHARE_WRITE, NUL
与仅调用ReadFile相比,我使用下面的代码来衡量读取内存映射文件的大型顺序读取之间的性能差异:

HANDLE hFile = CreateFile(_T("D:\\LARGE_ENOUGH_FILE"),
    FILE_READ_DATA, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING,
    FILE_FLAG_NO_BUFFERING, NULL);
__try
{
    const size_t TO_READ = 32 * 1024 * 1024;
    char sum = 0;
#if TEST_READ_FILE
    DWORD start = GetTickCount();
    char* p = (char*)malloc(TO_READ);
    DWORD nw;
    ReadFile(hFile, p, TO_READ, &nw, NULL);
#else
    HANDLE hMapping = CreateFileMapping(hFile, NULL, PAGE_READONLY,
        0, 0, NULL);
    const char* const p = (const char*)MapViewOfFile(hMapping,
        FILE_MAP_READ, 0, 0, 0);
    DWORD start = GetTickCount();
#endif
    for (size_t i = 0; i < TO_READ; i++)
    {
        sum += p[i]; // Do something kind of trivial...
    }
    DWORD end = GetTickCount();
    _tprintf(_T("Elapsed: %u"), end - start);
}
__finally { CloseHandle(hFile); }

(我只是改变了TEST_READ_FILE的值来改变测试.)

令我惊讶的是,ReadFile的速度降低了约20%!为什么?

FILE_FLAG_NO_BUFFERING致残ReadFile.内存映射文件可以自由使用它想要的任何预读算法,并且您已禁止ReadFile执行相同的操作.您只在ReadFile版本中关闭了缓存.没有文件缓存,内存映射文件无法工作.
网友评论