在 Linux 下,readdir(以及相关的 opendir / readdir / closedir 系列接口)的性能表现取决于文件系统类型、目录大小、缓存状态以及使用方式。下面从几个关键角度说明。
readdir 是什么readdir 是 glibc 提供的目录遍历接口getdents / getdents64 系统调用readdir 从内核缓冲区取一个目录项注意:
readdir是逐条返回条目,但内核是批量读取的
性能会明显下降,原因包括:
stat 调用(如果你遍历时还 stat)示例:
readdir:几秒~十几秒readdir + stat:可能几十秒甚至更久| 文件系统 | 大目录性能 |
|---|---|
| ext4 | 一般(依赖哈希目录) |
| xfs | 较好 |
| btrfs | 一般 |
| tmpfs | 极快 |
| overlayfs | 取决于底层 |
ext4 对大目录有 hash 索引,但仍不如专业存储
stat最大性能杀手
while ((de = readdir(dir))) {
stat(de->d_name, &st); // 慢!
}
stat 一次系统调用✅ 优化:
readdir + d_type(如果支持)statx(Linux 4.11+)vmtouch /path/to/dir
readdir 本身不是线程安全的opendir 可以并行readdir vs 其他方案对比| 方法 | 性能 | 说明 |
|---|---|---|
readdir |
⭐⭐⭐ | 通用、简单 |
getdents64 |
⭐⭐⭐⭐ | 更少系统调用 |
find |
⭐⭐ | 方便但慢 |
ls |
⭐ | 排序、stat,最慢 |
ftw / nftw |
⭐⭐ | 封装好但慢 |
statif (de->d_type == DT_REG) {
// 普通文件
}
getdents64(高级)/data/2025/01/...cat /path/* > /dev/null
readdir本身不慢,慢的是“大目录 + stat + 磁盘 IO”的组合。
如果你愿意,可以告诉我:
stat我可以给你针对性的性能优化方案或代码示例。