c++ - 为什么 Windows 第一次打开文件这么慢,有没有更快的方法

标签 c++ windows performance file-io

这是 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/

相关文章:

C++自定义排序 vector

windows - 如何在不损坏字符的情况下输出exec.Command的输出数据

performance - 分析分布式系统

c++ - float 和 double 之间的输出值(+/-)细微差异

android - 这个C++代码是什么意思? 'const ResTable& res = am->getResources();'

java - File.isDirectory() 对于同一目录返回 true 和 false

c# - 我需要使用MS Debug Diagnostic Tool来分析CPU使用率较高的C#应用​​程序的帮助

java - 最小化 Java 进程中的应用程序数据内存开销

c++ - 如何更改字符的值?

c++ - 如何以普通用户身份启动进程?