使用标志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秒(阅读时间)
下面是实现读取的代码:
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时慢的原因。谢谢。
发布于 2013-07-23 13:58:06
我希望您正在测量的是打开和关闭文件的时间。有很多文件。您应该能够在大约一秒钟内从磁盘读取57 in。因此,开销似乎是文件的打开而不是读取。您应该使用更少但更大的文件再试一次。例如,创建20 100 20文件并读取这些文件。看起来,至少在您的系统上,用FILE_FLAG_NO_BUFFERING打开文件比不打开文件要慢。
无论如何,不要指望FILE_FLAG_NO_BUFFERING会加快速度。将文件句柄的缓冲区复制到缓冲区中所花费的时间与将数据从磁盘中取出相比微不足道。
https://stackoverflow.com/questions/17781277
复制相似问题