readdir 本身不算特别耗资源,但在某些场景下确实可能成为性能瓶颈。是否“耗资源”主要取决于目录大小、文件系统类型、使用方式等因素。
下面分点说明:
readdir 本身做了什么readdir 是 逐条读取目录项 的接口(glibc 封装了 getdents 系统调用):
struct dirent)✅ 单次调用开销很低
例如:
问题点:
readdir 需要遍历整个目录表现:
ls 卡住readdir 很慢⚠️ 这是设计问题,不是 readdir 的锅
readdir例如:
while ((entry = readdir(dir))) {
...
}
如果:
会吃 CPU 和上下文切换
在 NFS 上:
readdir 可能触发多次网络往返❌ 非常不建议在大目录上频繁 readdir
opendir -> readdir -> closedir
频繁这样做:
| 操作 | 资源消耗 |
|---|---|
stat 单文件 |
低 |
readdir 小目录 |
很低 |
readdir 大目录 |
高 |
find 大目录 |
高 |
inotify |
低(推荐) |
/data/2026/01/15/
/data/a/b/c/
getdents64 批量读(高级)比 readdir 更高效
inotify 代替轮询如果是“监听变化”,不要用 readdir 扫描
readdirls | wc -lls 会 stat 每个文件
readdir不耗资源,但“大目录 + 频繁遍历”很耗资源。
如果你愿意,可以告诉我:
我可以给你更具体的优化方案。