为什么Windows第一次打开文件的速度如此之慢,并且有更快的方法

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毫秒范围内,因此打开的成本太高。

如何打开任何建议*文件*快速加载,将不胜感激。

Typ*_*eIA 5

当您打开文件时,Windows会做很多事情。我不是专家,但是我可以提到文件系统维护(更新访问时间,日志记录等)和访问权限检查是两个重要项目。不幸的是,我认为您不能更快地做到这一点。

当然,如果您不打算从文件中读取任何内容,而只是在检查文件是否存在或正在读取一些元数据(如修改时间),则可以使用更快速的方法来打开文件。