为什么Windows第一次打开文件时这么慢,是否有更快的方法

时间:2014-02-12 16:33:37

标签: 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);
}

如果我在一个包含863个文件的目录上运行它,则需要略多于22个SECONDS或25毫秒/文件。下次169毫秒或0.19毫秒/文件。如果我只是在新目录上使用find_file时间非常快,大约0.2毫秒/文件。虽然我在这里使用了CreateFile,但其他方法会产生相同的结果。

当然答案是文件缓存:windows必须缓存有关文件打开的信息。此外,它必须是磁盘访问,就像目录在SSD上一样,第一次和第二次打开大致相同。

现在这些硬盘上的寻道时间只有9毫秒,所以有人知道什么是WINDOWS在打开/关闭文件时只需要25毫秒才能读取NO读数。但更重要的是,是否有可能加快速度。您可能会说25毫秒速度很快,但我正在播放视频文件,所以我需要在大约33毫秒读取数据并且实际读取的数据在30毫秒范围内,因此打开成本太高。

有关如何快速打开 * *文件的任何建议,我们将不胜感激。

3 个答案:

答案 0 :(得分:5)

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

当然,如果您不打算从文件中读取任何内容,并且只是检查文件是否存在或者读取某些元数据(如修改时间),则可以通过更快的方式在不打开文件的情况下执行此操作。< / p>

答案 1 :(得分:0)

我不认为应该接受这个答案。最初的问题是问:&#34;为什么它在第一次打开时会变慢。&#34;操作系统必须进行相同的维护/日志/检查/等。在文件上,无论是第一次还是第二十次。

我在java下看到了完全相同的东西。第一次打开4000个文件时运行一个程序,探查器显示我在sun.nio.fs.WindowsNativeDispatcher.CreateFile0 [native](long,int,int)中花费96.4%的时间。 ,long,int,int)。

然后,如果我再次运行它会立即运行20倍,并且分析器显示我甚至不使用CreateFile。事实上,JVM正在选择完全不同的对象和方法来完成Files.readAllLines调用。

我怀疑OP的体验类似,而不是常规的OS维护要求。

答案 2 :(得分:0)

您可以做一些事情。一种是,如果您知道将很快再次读取它们,请在打开初始文件后保持文件打开。另一个方法是将其数据缓存在内存中,仅打开它们以保存更改。仅当您不希望文件被其他程序更改时,此功能才起作用。

如果希望它们被其他程序更改,则仍然可以使用第二种方法将其内容保存在内存中,然后定期检查修改时间。如果已更改,请再次加载它们。

它们第二次加载速度更快的原因是,它们的数据是通过硬盘驱动器本身还是通过操作系统,或者是两者的某种组合而放入缓存中,具体取决于您的硬件和设置,因此第二次打开它们,它不是从驱动器中读取,而是从内存中读取。