在 Linux 下 readdir() 慢,通常不是函数本身慢,而是目录规模、文件系统、缓存状态或调用方式导致的。下面按常见原因和对应解决办法说明。
readdir() 会非常慢ls 都会卡解决办法
data/ab/cd/ef/filereaddir 能高效处理百万级单目录不同文件系统对大目录支持差异很大:
| 文件系统 | 大目录表现 |
|---|---|
| ext4 | 一般(大目录会变慢) |
| xfs | 较好 |
| btrfs | 一般 |
| tmpfs | 很快(内存) |
| NFS | 非常慢 |
建议
第一次 readdir 需要读磁盘:
解决办法
ls -f /bigdir >/dev/null
vmtouch 锁定目录到内存(可选)常见错误写法:
stat()优化建议
opendir + 连续 readdirstatreaddir 批量处理,再统一 stat很多时候不是 readdir 慢,而是:
readdir → stat → 慢
解决办法
readdir + d_type(不需要 stat)entry->d_type == DT_REG
lstat/statgetdents64 直接系统调用readdir 是 glibc 封装,有额外开销
更快方式:
getdents64()scandir()(一次性加载)示例(简化):
syscall(SYS_getdents64, fd, buf, size);
readdir 在网络文件系统上:
建议
# 看目录文件数
ls -1 | wc -l
# 看文件系统
df -T /path
# 看是否缓存命中
free -h
vmstat 1
如果你愿意,可以告诉我:
我可以给你更具体的优化方案或代码示例。