在 Debian(以及其它 Linux 发行版)上,readdir() 读取目录“慢”通常不是 readdir 本身的问题,而是使用方式 + 文件系统 + 目录规模共同导致的。下面按常见原因从高到低说明。
很多人写的是:
while ((ent = readdir(dir)) != NULL) {
stat(ent->d_name, &st); // ❌ 这里很慢
}
问题不在 readdir,而在:
stat() 会触发 额外磁盘 IO✅ 正确做法:
readdir() + d_type(如果文件系统支持)scandir()getdents64()(底层系统调用)Debian 上 ext4 / xfs 一般支持 d_type:
if (ent->d_type == DT_REG) { ... }
readdir 本身是顺序读目录项,但:
表现:
✅ 优化:
getdents64 批量读老代码常见:
readdir() // 32 位接口
在大型目录、inode 很大时:
✅ 推荐:
readdir64getdents64 性能最好| 文件系统 | readdir 性能 |
|---|---|
| ext4 | 一般 |
| xfs | 好 |
| btrfs | 慢(大量小文件) |
| NFS | 非常慢 |
| overlayfs | 慢 |
如果你是在:
那 readdir 慢是必然的
可以验证:
free -h
cat /proc/sys/vm/vfs_cache_pressure
第一次慢、第二次快 → 说明是 page cache / dentry cache
第一次:
time ls dir
第二次:
time ls dir
如果第二次快很多 → 不是代码问题,是缓存问题
strace -e trace=readdir,getdents64 ls dir
ls dir | wc -l
df -T dir
syscall(SYS_getdents64, fd, buf, size);
find dir -maxdepth 1
Debian 上 readdir 慢,90% 不是 readdir 慢,而是在循环里 stat / 目录太大 / 文件系统不行。
如果你愿意,可以:
我可以直接帮你定位瓶颈并给优化方案。