readdir 在 Linux 下“卡顿 / 很慢”通常不是函数本身的问题,而是目录内容或底层文件系统状态导致的。下面按常见原因从高到低说明:
readdir 内部是顺序遍历目录项:
opendir + readdir 都要扫描大量 entry✅ 验证:
ls -1 | wc -l
✅ 解决:
readdir 后逐个 stat很多人这样写:
while ((entry = readdir(dir))) {
stat(entry->d_name, &st); // ❌ 极慢
}
readdir 只返回名字stat 会触发 磁盘 IO✅ 解决:
readdir + d_type(仅 ext4/xfs 支持)getdents64 直接拿信息不同 FS 性能差异巨大:
| 文件系统 | readdir 性能 |
|---|---|
| ext4 | 快 |
| xfs | 快 |
| NFS | ❌ 非常慢 |
| FUSE | ❌ 极慢 |
| overlayfs | 中等 |
✅ NFS / 网络盘:
readdir 都可能网络往返✅ 解决:
如果:
create / unlinkreaddir 需要保证一致性会导致:
readdir 需要读目录 inode + 数据块:
✅ 检查:
iostat -x 1
free -h
readdir 是 glibc 封装:
getdents64 高效✅ 高性能替代:
syscall(SYS_getdents64, fd, buf, size);
少见但存在:
✅ 检查:
dmesg | tail
fsck(卸载后)
time ls -1 | wc -l
strace -T your_program
iostat -x 1
如果你愿意,可以告诉我:
stat我可以给你具体优化代码或架构方案。