在 Debian(及其他 Linux 发行版)里,readdir 本身只是系统调用/库函数,真正的“慢”通常不在 readdir 本身,而在 目录内容多、文件系统类型、缓存状态、程序调用方式 等方面。下面按实用程度给你一套提速思路。
如果目录有 几十万/上百万 文件:
readdir 会非常慢ls 也会卡死a/ab/abcdef
readdir 慢很多时候是 冷缓存。
free -h
cat /proc/slabinfo | grep dentry
ls -R /path/to/dir >/dev/null
或
find /path/to/dir -maxdepth 1 >/dev/null
不同文件系统对大量小文件支持差异巨大:
| 文件系统 | 大目录性能 |
|---|---|
| ext4 | 一般(默认还行) |
| xfs | ✅ 更好 |
| btrfs | ❌ 大目录较差 |
| tmpfs | ✅ 极快(内存) |
getdents64 而非 readdirreaddir 是 libc 封装,逐个调用较慢。
#include <sys/syscall.h>
#include <unistd.h>
syscall(SYS_getdents64, fd, buf, size);
✅ 批量读取,性能更好
stat 调用很多人这样写:
while (readdir)
stat(file); // ❌ 巨慢
✅ 如果不需要文件类型:
d_type(readdir 返回)if (entry->d_type == DT_REG)
openat + fd 避免路径解析int dfd = open(dir, O_RDONLY);
getdents64(dfd, buf, size);
defaults,noatime
修改 /etc/fstab:
/dev/sda1 /data ext4 defaults,noatime 0 2
✅ 避免访问时间更新,显著提高目录遍历性能
不要用 ls,用:
find /path -maxdepth 1
或
ls --color=never
如果你愿意,可以告诉我:
我可以直接给你针对性代码或配置。