为什么如果运行两次,[find] 的运行速度会非常快?

为什么如果运行两次,[find] 的运行速度会非常快?

在我的 Ubuntu/Linux 系统的 Dash 中存在同一个程序的两个版本。

初始问题

找到相应的。桌面文件位于我使用

find / -type f -name 'Sublime Text.desktop' 2> /dev/null

我没有找到任何结果,所以我成功了

find / -type f -name '[s,S]ublime*.desktop' 2> /dev/null

我很惊讶地发现,它在大约三秒钟后就完成了,因为搜索词应该比第一个大得多。由于这对我来说不太合适,我再次运行了第一个命令,令我惊讶的是,现在它也只花了大约三秒钟就完成了。

为了验证这一行为,我启动了第二个 Linux 机器并再次运行第一个命令,但这次使用time

time find -type f -name 'Sublime Text.desktop' 2> /dev/null 

证明


find不仅加快了对同一搜索词的搜索,还加快了所有搜索(在同一路径内?)。甚至对“不相关”字符串的搜索也不会减慢速度。

time find / -type f -name 'Emilbus Txet.Potksed' 2> /dev/null

使用 find 之前和之后分析 RAM

find 做了什么让搜索过程如此快速?

答案1

find 第二次更快的原因是 linux 不执行文件缓存。每当第一次访问文件时,它都会将文件的内容保存在内存中(当然,只有当您有可用的 RAM 时才会这样做)。如果稍后再次读取该文件,它就可以从内存中获取内容,而不必再次读取文件。由于内存访问比磁盘访问快得多,因此这可以提高整体性能。

因此,首先find,大多数文件尚未进入内存,因此 Linux 必须执行大量磁盘操作。这很慢,因此需要一些时间。

再次执行时find,大多数文件和目录已经在内存中,而且速度更快。


您可以自己测试一下,如果您清除缓存在两次 find 执行之间。那么第二次 find 不会比第一次快。在我的系统上它看起来是这样的:

# This clears the cache. Be careful through, you might loose some data (Although this shouldn't happen, it's better to be sure)
$ sync && echo 3 | sudo tee /proc/sys/vm/drop_caches
3

$ time find /usr/lib -name "lib*"
find /usr/lib/ -name "lib*"  0,47s user 1,41s system 8% cpu 21,435 total

# Now the file names are in the cache. The next find is very fast:
$ time find /usr/lib -name "lib*"
find /usr/lib/ -name "lib*"  0,19s user 0,28s system 69% cpu 0,673 total

# If we clear the cache, the time goes back to the starting time again
$ sync && echo 3 | sudo tee /proc/sys/vm/drop_caches
3
$ time find /usr/lib -name "lib*"
find /usr/lib/ -name "lib*"  0,39s user 1,45s system 10% cpu 16,866 total

相关内容