在 Ubuntu(Linux)里 readdir() 慢,通常不是函数本身慢,而是目录规模、文件系统、元数据开销或调用方式导致的。下面按常见原因逐个说明。
ls 慢、find 慢、readdir() 也慢readdir() 需要逐个读取目录项(dentry)ls | wc -l
你不仅是 readdir(),还做了:
while ((ent = readdir(dir))) {
stat(ent->d_name, &st); // 很慢
}
readdir() 只返回文件名stat() 要访问 inodestat() 会非常慢(尤其网络文件系统)readdir64() + getdents()scandir()(一次性读取)statx()(可控字段)stat| 文件系统 | readdir 性能 |
|---|---|
| ext4 | 一般(大目录慢) |
| xfs | 大目录更好 |
| btrfs | 元数据操作偏慢 |
| NFS | 非常慢 |
| overlayfs | 慢(容器常见) |
| tmpfs | 很快 |
free -h
cat /proc/slabinfo | grep dentry
opendir()
readdir() 一个一个读
scandir() // 一次性加载
getdents64() // 系统调用级
示例:
struct dirent **namelist;
int n = scandir(path, &namelist, NULL, alphasort);
dmesg | grep audit
iostat -x 1
strace -T ./your_program
看:
getdents64 耗时stat 耗时Ubuntu 下 readdir 慢,90% 是因为“目录太大 + 大量 stat + 文件系统或缓存问题”,而不是 readdir 本身。
如果你愿意,可以告诉我:
我可以直接给你优化方案或改代码。