![什么缓存使得文件第二次搜索的速度更快?](https://linux22.com/image/1358048/%E4%BB%80%E4%B9%88%E7%BC%93%E5%AD%98%E4%BD%BF%E5%BE%97%E6%96%87%E4%BB%B6%E7%AC%AC%E4%BA%8C%E6%AC%A1%E6%90%9C%E7%B4%A2%E7%9A%84%E9%80%9F%E5%BA%A6%E6%9B%B4%E5%BF%AB%EF%BC%9F.png)
在装有 Total Commander 的 Windows 硬盘分区上,如果我在文件系统根目录上进行文件搜索C:\
,则会花费相当长的时间:它会显示遍历整个目录结构(似乎是深度优先)。
但是,如果我在完成第一次搜索后再次从同一根目录进行搜索,速度会快得多。根据缺失的(物理)噪声,我认为这次没有涉及 HDD,因此目录/文件结构被缓存了。
我认为不是 Total Commander 在缓存目录结构,是吗?对我来说,这似乎是操作系统的功能,或者是硬盘缓存。
那么它到底被缓存在哪里、如何缓存?(即通过哪个组件的哪种机制、在哪个结构中?)系统如何知道缓存是否是最新的?如果可以完全缓存,为什么不默认缓存?
答案1
我认为不是 Total Commander 缓存了目录结构,或者是?
可能不会。如果您有大量文件,打开命令提示符并输入类似“dir c:\abc.def /s
您不太可能有任何具有该名称的文件”的内容,您会看到相同的效果,但第一次运行所需的时间比您紧接着第二次运行所需的时间要长得多。
在我看来,这似乎是操作系统的一个功能,或者是硬盘缓存。那么它究竟在哪里以及如何缓存呢?(即通过哪个组件的哪种机制,在哪个结构中?)
Windows/NTFS 将会缓存这些项目,并且您的硬盘控制器中也会有一个缓存。
系统如何知道缓存是否是最新的?
因为写入硬盘的唯一方法是使用了解并因此更新或使缓存无效的例程。对于 Windows,例程可能是 NTFS 设备驱动程序,而对于硬盘,则是磁盘控制器。
如果可以完全缓存,为什么默认不缓存?
因为缓存更适合用于其他用途。默认缓存意味着
每次计算机启动时,它都必须读取并存储硬盘上每个文件的信息,无论是否需要。这会让您的启动时间增加几秒钟。拥有数百万个文件也很常见,这意味着启动时间可能会更长。
该内存不能用于缓存其他任何内容,尤其是您正在处理的文件。
如果您的个人资料/文档存储在服务器上,会发生什么情况?您是否希望系统在通过网络提取所有文件的信息时等待?
还要记住,仅仅因为一切能被缓存,并不意味着应该缓存。有时,访问非常大的缓存中的信息所需的时间要比访问较小的缓存中的信息所需的时间更长,这意味着缓存太多实际上会降低您的速度。(我的意思是,它比使用较小的缓存时要慢,但仍然比不使用缓存要快)
答案2
你提到的是索引。大多数搜索内容都有一个索引,这个索引是随着时间的推移而建立的,以加快搜索速度。开始 -> 搜索有一个索引,TotalCommander 似乎使用它自己的索引,Google 有一个索引,用于你可以通过 Google 找到的所有网页。
有多种方法可以加快索引和文件系统搜索速度。不过,索引比重新搜索和新递归调用来挖掘目录要快。