简短结论:在 Debian(及大多数 Linux 发行版)上,readdir 本身不一定慢,但在“大目录”(几万~几百万文件)下确实容易变慢,原因主要在文件系统、缓存和调用方式,而不是 readdir 这个系统调用名字本身。
下面分层说明。
readdir 在 Debian 上是什么在 glibc + Linux 上:
readdir() / readdir_r()getdents64 系统调用所以慢不慢,取决于:
目录里有多少文件 + 文件系统怎么存目录 + 页缓存是否命中
(inode, name) 列表readdir 需要扫描更多数据如果目录内容不在 page cache:
ls 很慢,第二次快,就是缓存原因readdir 被“错误使用”常见问题:
while ((de = readdir(dir))) {
stat(de->d_name, &st); // ❌ 每个文件一次 stat
}
readdir 不慢stat 才是性能杀手✅ 改进:
scandirgetdents64 + 批量处理statx(按需)| 文件系统 | 大目录表现 |
|---|---|
| ext4 | 一般(默认线性目录) |
| xfs | 较好(支持大目录优化) |
| btrfs | 目录大时可能更慢 |
| tmpfs | 很快(内存中) |
| overlayfs | 取决于底层 |
ext4 在 未开启 dir_index(hash tree) 时,大目录尤其慢
检查:
tune2fs -l /dev/sdX | grep "Filesystem features"
应有:
dir_index
100 万:强烈不建议单目录
✅ 不要在一个目录放太多文件
data/ab/cd/abcd1234
✅ 用:
scandiropendir + readdir + 批量处理ls | while✅ 如果是日志 / 缓存 / 上传:
Debian 的
readdir不慢,但“大目录 + 冷缓存 + 错误用法”会让你觉得它很慢。
如果你愿意,可以告诉我:
我可以直接给你针对性的优化方案或代码示例。