在 Ubuntu(Linux)下,readdir 本身只是系统调用/库函数,真正影响“读取目录速度”的通常是 文件系统、目录规模、缓存、调用方式。下面从「原因 → 优化手段」系统说明。
time ls -1 /path >/dev/null
strace -c ls -1 /path >/dev/null
如果 getdents / readdir 占大量时间,再看下面。
这是 readdir 慢的头号原因
✅ 解决思路:
a/ ab/ abc/ 这样分层
❌ ext4 单目录几百万文件,readdir 必然慢
| 文件系统 | readdir 性能 |
|---|---|
| ext4 | 一般 |
| xfs | ✅ 大目录更好 |
| btrfs | 一般 |
| tmpfs | ✅ 超快(内存) |
示例:
mkfs.xfs /dev/sdX
第一次慢,第二次快,是正常的。
✅ 提高缓存命中:
echo 3 > /proc/sys/vm/drop_cachesvmtouch -t /path
提前把目录元数据加载进内存。
getdents64 而不是多次 readdirreaddir 一次只取少量 entry。
✅ 更高效:
syscall(SYS_getdents64, fd, buf, size);
stat 调用(非常关键)很多人这样写:
while ((e = readdir(d)))
stat(e->d_name, &st); // ❌ 极慢
✅ 替代:
d_type(readdir 已带)e->d_type == DT_DIR
statx(批量)openat + getdents避免路径解析开销。
io_uringLinux 5.1+ 支持异步目录读取:
io_uring_prep_getdents()
✅ 高并发场景明显提速
❌ 不要轮询 readdir
✅ 用:
inotifywait -m /path
如果你愿意,可以告诉我:
我可以直接给你针对性代码或方案。