这是 Windows 7, 64 位, Professional 使用
考虑一个非常简单的循环
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);
}
如果我在一个有 863 个文件的目录上运行它,它需要略多于 22 秒,或 25 毫秒/文件。下一次 169 毫秒或 0.19 毫秒/文件。如果我只是在新目录上使用 find_file 时间非常快,大约 0.2 毫秒/文件。虽然我在这里使用了 CreateFile,但其他方法产生相同的结果。
答案当然是文件缓存:Windows 必须缓存有关文件打开的信息。而且必须是磁盘访问,就好像目录在SSD上一样,第一次和第二次打开差不多。
现在这些硬盘上的寻道时间只有 9 毫秒,所以有谁知道 WINDOWS 在用 25 毫秒打开/关闭一个只读而不读的文件时在做什么。但更重要的是,是否有可能加快速度。你可能会说25ms很快,但我是播放视频文件,需要33ms左右读取,实际读取数据在30ms左右,所以打开成本太高。
如有任何关于如何快速打开**加载文件的建议,我们将不胜感激。
最佳答案
当您打开一个文件时,Windows 在幕后做了很多很多。我不是专家,但我可以将文件系统维护(更新访问时间、日志记录等)和访问权限检查作为两个重要项目提及。不幸的是,我不认为你可以让它更快。
当然,如果您不打算从文件中读取任何内容,而只是检查文件是否存在或读取一些元数据(例如其修改时间),则有更快的方法可以在不打开文件的情况下执行此操作。
关于c++ - 为什么 Windows 第一次打开文件这么慢,有没有更快的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21733836/