use*_*327 3 c++ windows performance file-io
这是Windows 7,64位,专业使用
考虑一个非常简单的循环
for (i = 0; i < names->size(); i++)
{
std::string Name = names->at(i);
HANDLE fileHandle = CreateFile(Name.c_str(), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
if (fileHandle == INVALID_HANDLE_VALUE)
{
throw "Failed";
}
CloseHandle(fileHandle);
}
Run Code Online (Sandbox Code Playgroud)
如果我在具有863个文件的目录上运行此文件,则将花费超过22秒,即25毫秒/文件。下一次169毫秒或0.19毫秒/文件。如果仅使用find_file,则在新目录上的时间非常快,大约为0.2 ms / file。尽管我在这里使用了CreateFile,但其他方法也会产生相同的结果。
当然答案是文件缓存:Windows必须缓存有关文件打开的信息。此外,必须是磁盘访问,就像目录位于SSD上一样,第一次打开和第二次打开大致相同。
现在这些硬盘驱动器上的查找时间仅为9毫秒,因此没有人知道WINDOWS在打开/关闭仅读取且不读取的文件时花费25毫秒时会做什么。但更重要的是,是否有可能加快这一步。您可能会说25毫秒很快,但是我正在播放视频文件,因此我需要大约33毫秒来读取,而实际读取的数据在30毫秒范围内,因此打开的成本太高。
如何打开任何建议*文件*快速加载,将不胜感激。
当您打开文件时,Windows会做很多事情。我不是专家,但是我可以提到文件系统维护(更新访问时间,日志记录等)和访问权限检查是两个重要项目。不幸的是,我认为您不能更快地做到这一点。
当然,如果您不打算从文件中读取任何内容,而只是在检查文件是否存在或正在读取一些元数据(如修改时间),则可以使用更快速的方法来打开文件。