这是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秒,即25毫秒/文件。下一次,169毫秒或0.19毫秒/文件。如果我只是在一个新的目录上使用find_file时间非常快,大约是0.2毫秒/文件。虽然我在这里使用了CreateFile,但其他方法也得到了相同的结果。
当然,答案是文件缓存: windows必须缓存有关文件打开的信息。而且,它必须是磁盘访问,就好像该目录位于SSD上一样,第一次打开和第二次打开大致相同。
现在,在这些硬盘上的查找时间只有9 ms,所以当打开/关闭文件只需25毫秒时,任何人都不知道WINDOWS在做什么。但更重要的是,是否有可能加快这一进程。你可能会说25毫秒速度快,但我正在播放视频文件,所以我需要在33毫秒左右阅读,而实际读取的数据在30毫秒范围内,所以打开的成本太高。
任何关于如何快速打开**加载文件的建议将不胜感激。
发布于 2014-02-12 16:50:48
当您打开一个文件时,Windows在引擎盖下做了很多事情。我不是专家,但我可以提到文件系统维护(更新访问时间、日志记录等)。和访问权限检查作为两个重要项目。不幸的是,我不认为你能让这件事变得更快。
当然,如果您不打算从文件中读取任何内容,并且只是检查文件是否存在或读取一些元数据(比如修改时间),那么有更快的方法可以做到这一点,而无需打开文件。
发布于 2016-08-18 16:46:43
我认为这个答案不应该被确认为已被接受。最初的问题是:“为什么它第一次打开时就慢下来了?”无论是第一次还是第二十次,操作系统都必须对文件执行相同的维护/日志/检查/检查等操作。
我在java下看到了完全一样的东西。第一次打开4000个文件的时候运行一个程序,分析器显示我在sun.nio.fs.WindowsNativeDispatcher.CreateFile0native.中花费了程序96.4%的时间
然后,如果我立即再次运行它,它的运行速度将提高20倍,分析器显示我甚至没有使用CreateFile。实际上,JVM正在选择完全不同的对象和方法来完成Files.readAllLines调用。
我怀疑OP是类似的东西,而不是常规的操作系统维护需求。
发布于 2020-05-01 11:59:52
有几件事你可以做。一是,如果您知道即将再次读取文件,请在初始文件打开后继续打开它们。另一种方法是将它们的数据缓存在内存中,并且只打开它们以保存更改。只有当您不期望其他程序更改这些文件时,这才能工作。
如果您期望其他程序对其进行更改,则仍然可以将其内容保存在内存中的第二种方法,然后定期检查修改时间。如果它已经改变了,再次加载它们。
它们第二次加载速度更快的原因是,它们的数据被放入缓存中,要么是硬盘本身,要么是操作系统,或者两者的某种组合,这取决于硬件和设置,所以第二次打开它们时,不是从驱动器读取数据,而是从内存读取数据。
https://stackoverflow.com/questions/21733836
复制相似问题