在 Linux 下,readdir(以及底层的 getdents / getdents64 系统调用)“慢”通常不是函数本身慢,而是由目录结构、文件系统、内核实现和使用方式共同决定的。下面按常见原因系统梳理一下。
ls 卡住、readdir 循环很慢readdir 并不是一次性返回整个目录struct dirent目录不是“索引结构”,而是“线性表”(传统 ext4 / xfs 也类似)
readdir 依赖:
此时:
磁盘 I/O → 读目录块 → 填充 dirent
free -h
cat /proc/slabinfo | grep dentry
| 文件系统 | readdir 性能 |
|---|---|
| ext4 | 一般 |
| xfs | 较好 |
| btrfs | 可能较慢 |
| overlayfs | 明显慢(容器常见) |
| NFS | 非常慢 |
readdir 要跨网络while ((entry = readdir(dir))) {
stat(entry->d_name, &st); // ❌
}
readdir 只给文件名stat 要:
readdir + d_type(如果支持)scandir、getdents 自己解析如果你:
那自然慢。
create / unlink此时:
readdir 可能被阻塞readdir 问题readdir 是 线程不安全readdir_r 已废弃readdir 内部有锁高并发程序中:
readdirtime ls -1 /huge_dir | wc -l
strace -T ls /huge_dir
关注:
getdents64(...) = ... <0.123456>
a/, b/)getdents64 直接读statd_type 就用Linux 的
readdir慢,通常不是函数慢,而是“目录太大 + cache 未命中 + stat 滥用 + 文件系统特性”共同造成的。
如果你愿意,可以告诉我:
我可以给你针对性的优化方案或代码示例。