首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >FILE_FLAG_IO_BUFFERING减慢同步读取操作

FILE_FLAG_IO_BUFFERING减慢同步读取操作
EN

Stack Overflow用户
提问于 2013-07-22 06:32:54
回答 1查看 92关注 0票数 0

使用标志FILE_FLAG_IO_BUFFERING读取一组没有缓冲(跳过文件缓存)的文件应该比正常读取更快(不使用此标志)。这样做的原因是“没有缓冲”机制将跳过系统文件缓存,并将直接读入应用程序的缓冲区。

应用程序在冷环境中运行(磁盘碎片整理后,机器重新启动),以便在运行之前系统文件缓存不会与相关文件一起缓存。

这来自于有关这些API和标志的msdn文档。

然而,我经历了完全不同的表现行为。在使用FILE_FLAG_IO_BUFFERING标志创建文件句柄之后,我一个接一个地读取一组文件。读取这组文件所需的时间是29秒。比如,如果我在正常情况下没有使用此标志(在应用程序冷运行时,当文件缓存不包含相关文件时),则所花费的时间大约为24秒。

Details

档案总数:1939年

文件总大小(所有文件的总和):57 MB

FLAG_IO_NO_BUFFERING: 29秒(阅读时间)

无FLAG_IO_NO_BUFFERING: 24秒(阅读时间)

下面是实现读取的代码:

代码语言:javascript
复制
DWORD ReadFiles(std::vector<std::string> &filePathNameVectorRef)
{
    long totalBytesRead = 0;    
    for(all file in filePathNameVectorRef)
        totalBytesRead += Read_Synchronous(file);           
    return totalBytesRead;
}

DWORD Read_Synchronous(const char * filePathName)
{
    DWORD accessMode = GENERIC_READ;
    DWORD shareMode = 0;
    DWORD createDisposition = OPEN_EXISTING;
    DWORD flags = FILE_FLAG_NO_BUFFERING;
    HANDLE handle = INVALID_HANDLE_VALUE;
    DWORD fileSize;
    DWORD bytesRead = 0;
    DWORD bytesToRead = 0;
    LARGE_INTEGER li;
    char * buffer;  
    BOOL success = false;


    handle = CreateFile(filePathName, accessMode, shareMode, NULL, createDisposition, flags, NULL);
    if(handle == INVALID_HANDLE_VALUE)
          return 0;

    GetFileSizeEx(handle, &li);
    fileSize = (DWORD)li.QuadPart;

    bytesToRead = (fileSize/g_bytesPerPhysicalSector)*g_bytesPerPhysicalSector;
    buffer = static_cast<char *>(VirtualAlloc(0, bytesToRead, MEM_COMMIT, PAGE_READWRITE));

    if(buffer == NULL)
         goto RETURN;

    success = ReadFile(handle, buffer, bytesToRead, &bytesRead, NULL);

    if(!success){
        fprintf(stdout, "\n Error occured: %d", GetLastError());
        return 0;
    }

    free(buffer);

RETURN:
    CloseHandle(handle);
    return bytesRead;
}

请分享您认为这段代码运行速度比不使用FILE_FLAG_NO_BUFFERING时慢的原因。谢谢。

EN

回答 1

Stack Overflow用户

发布于 2013-07-23 13:58:06

我希望您正在测量的是打开和关闭文件的时间。有很多文件。您应该能够在大约一秒钟内从磁盘读取57 in。因此,开销似乎是文件的打开而不是读取。您应该使用更少但更大的文件再试一次。例如,创建20 100 20文件并读取这些文件。看起来,至少在您的系统上,用FILE_FLAG_NO_BUFFERING打开文件比不打开文件要慢。

无论如何,不要指望FILE_FLAG_NO_BUFFERING会加快速度。将文件句柄的缓冲区复制到缓冲区中所花费的时间与将数据从磁盘中取出相比微不足道。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17781277

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档