嵌入式分享#61:为什么find 首次搜索慢? 正文
两个问题:
(1)为什么find 首次搜索慢?
(2)频繁使用 find 会吃内存吗?
最近在调试 RK3576 Android 系统时,经常需要使用 find -iname XXX 搜索文件,发现了两个有意思的现象:
第一次全局搜索,足足等了 几分钟才出结果;紧接着再执行一遍相同的命令,居然几秒就搞定了!

当时我心里就打了个问号:为啥同一个命令,第一次这么慢,第二次却快到离谱?
更让我有点慌的是 —— 我这一天下来,为了找各种配置文件、安装包,反复执行了几十次 find 命令。这频繁操作,会不会把系统内存 “吃” 掉?
相信不少嵌入式开发、Linux 运维的朋友,都遇到过类似的疑惑。今天就一起看看这是怎么回事?!
1 为什么 find 首次搜索慢?
核心原因:这是 Linux 系统页缓存(Page Cache) 和目录项缓存(Dentry Cache) 共同作用的结果,也是系统刻意做的性能优化。(之前也写过一篇文章《为什么要sync?》)
第 1 次 find:find 命令需要遍历目录、读取文件元数据(文件名、inode、路径等),这些数据原本只存在于硬盘中,磁盘 IO 是慢速操作(毫秒级),所以耗时久;
第 2 次 find:第一次遍历后,Linux 会自动把这些磁盘数据加载到内存的「页缓存」和「目录项缓存」中,第二次搜索直接从内存读取(纳秒/微秒级),速度提升几十到上百倍。

2 频繁使用 find 会不会导致内存空间减少?
结论先行:短期会占用少量内存,但不会“永久减少”,系统会自动回收,无需担心内存耗尽。
1. find 占用内存的本质
find 执行时,系统会把遍历过的文件元数据(不是文件内容)加载到「页缓存」中,目的是加速后续同类操作;
这些缓存属于「可回收内存」——Linux 会优先用空闲内存做缓存(反正内存闲着也是闲着),不会占用应用程序的“活跃内存”。
2. 内存不会被永久占用的原因
Linux 内核有一套智能的缓存回收机制:
当系统有其他程序(比如你的应用、apt 安装软件)需要内存时,内核会自动释放「页缓存」占用的内存,分配给需要的程序;
即使频繁执行 find,缓存也只会缓存“最近访问的目录/文件元数据”,不会无限制增长(比如反复搜索同一个目录,缓存不会重复占用更多内存);
可以通过 free -h 查看内存状态:buff/cache 列就是缓存占用的内存,这部分内存是“可用的”,并不是“被占用且无法释放的”。

3 实用优化建议
缩小搜索范围(最有效):不要全局搜索 /,而是指定具体目录,既减少遍历耗时,也减少缓存占用的内存;
排除无关目录:搜索时排除 /proc、/sys、/dev 等虚拟文件系统(这些目录无实际文件,遍历纯耗时间):
find / -path /proc -prune -o -path /sys -prune -o -path /dev -prune -o -iname LedControl.apk -print 2>/dev/null

4 总结
第一次 find 慢的核心原因 第一次遍历需从磁盘读取文件元数据,第二次直接读内存缓存,这是 Linux 正常的性能优化机制;
频繁用 find 对内存的影响 短期会占用少量内存做缓存,但缓存是可回收的,系统会自动释放,不会导致内存永久减少或耗尽;
优化建议 缩小搜索范围,既能提升速度,也能减少不必要的缓存占用。
你有更好的find优化建议吗?或者你在使用find时遇到过哪些性能问题? 欢迎在评论区交流分享~
(完)
本人专注 Linux 驱动 & Linux/Android BSP 开发调试,可接外包项目/技术支持/问题定位。有需求或交个朋友可加微信:【Chen_WeChat2025】。
审核编辑 黄宇
全部0条评论
快来发表一下你的评论吧 !