首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么windows第一次打开文件的速度这么慢,并且有一个更快的方法?

为什么windows第一次打开文件的速度这么慢,并且有一个更快的方法?
EN

Stack Overflow用户
提问于 2014-02-12 16:33:36
回答 3查看 2.8K关注 0票数 4

这是Windows 7,64位,专业使用

考虑一个非常简单的循环

代码语言:javascript
运行
复制
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 ms,所以当打开/关闭文件只需25毫秒时,任何人都不知道WINDOWS在做什么。但更重要的是,是否有可能加快这一进程。你可能会说25毫秒速度快,但我正在播放视频文件,所以我需要在33毫秒左右阅读,而实际读取的数据在30毫秒范围内,所以打开的成本太高。

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-02-12 16:50:48

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

当然,如果您不打算从文件中读取任何内容,并且只是检查文件是否存在或读取一些元数据(比如修改时间),那么有更快的方法可以做到这一点,而无需打开文件。

票数 5
EN

Stack Overflow用户

发布于 2016-08-18 16:46:43

我认为这个答案不应该被确认为已被接受。最初的问题是:“为什么它第一次打开时就慢下来了?”无论是第一次还是第二十次,操作系统都必须对文件执行相同的维护/日志/检查/检查等操作。

我在java下看到了完全一样的东西。第一次打开4000个文件的时候运行一个程序,分析器显示我在sun.nio.fs.WindowsNativeDispatcher.CreateFile0native.中花费了程序96.4%的时间

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

我怀疑OP是类似的东西,而不是常规的操作系统维护需求。

票数 0
EN

Stack Overflow用户

发布于 2020-05-01 11:59:52

有几件事你可以做。一是,如果您知道即将再次读取文件,请在初始文件打开后继续打开它们。另一种方法是将它们的数据缓存在内存中,并且只打开它们以保存更改。只有当您不期望其他程序更改这些文件时,这才能工作。

如果您期望其他程序对其进行更改,则仍然可以将其内容保存在内存中的第二种方法,然后定期检查修改时间。如果它已经改变了,再次加载它们。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21733836

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档