在 Linux 下,readdir 的效率取决于你使用的接口版本、文件系统类型、目录大小以及使用方式。下面从几个维度系统说明。
readdir 是什么在 glibc 中:
readdir() → 读取单个目录项getdents64()(Linux 特有系统调用)opendir() / readdir() / closedir() 是 POSIX 接口readdir 的效率总体评价✅ 结论先行:
对于普通目录(几万以内条目),
readdir效率是足够高的
对于超大目录(几十万 / 上百万文件),效率会显著下降
| 目录条目数 | 表现 |
|---|---|
| < 1 万 | 极快 |
| 1 万 ~ 10 万 | 正常 |
| 10 万 ~ 100 万 | 明显变慢 |
| > 100 万 | 非常慢,不推荐 |
原因:
readdir 需要遍历整个目录项链表| 文件系统 | readdir 表现 |
|---|---|
| ext4 | 良好 |
| xfs | 更好(大目录优化更好) |
| btrfs | 一般 |
| tmpfs | 非常快 |
| NFS | ❌ 很慢(网络 + 缓存) |
readdir 不保证顺序sort(),复杂度变为 O(n log n)readdir:慢(磁盘 IO)示例:
ls big_dir # 第一次慢
ls big_dir # 第二次快
readdir vs 其他方式对比readdir vs ls| 方式 | 效率 | 说明 |
|---|---|---|
readdir |
✅ 高 | 无额外开销 |
ls |
❌ 低 | fork + stat + sort |
readdir vs getdents64readdir = 用户态封装getdents64 = 系统调用(更快但更复杂)示例(C):
syscall(SYS_getdents64, fd, buf, size);
✅ 在超大目录下可提升性能
readdir vs findfind 内部也是 readdirDIR *dir = opendir(path);
struct dirent *entry;
while ((entry = readdir(dir)) != NULL) {
// 不要在这里 stat
}
closedir(dir);
while (readdir) {
stat(entry->d_name); // 每条都 stat
}
stat(除非必须)d_type(很多文件系统支持)getdents64在 ext4 / SSD 上:
| 目录大小 | readdir 耗时 |
|---|---|
| 1 万 | < 5 ms |
| 10 万 | ~20–50 ms |
| 100 万 | 数百 ms ~ 秒级 |
(受缓存、磁盘、文件系统影响很大)
readdir本身效率很高,瓶颈通常在“目录太大 + 额外系统调用(如 stat)”上。
如果你有:
我可以给你针对性的优化方案或代码示例。