在 Linux 下 readdir() 慢,通常不是 readdir 本身慢,而是目录本身或文件系统特性导致。下面按「常见原因 → 优化手段」系统说明。
很多程序其实是:
while ((de = readdir(dir))) {
stat(de->d_name, &st); // 这里慢
}
readdir 只读目录项(文件名)stat 才访问 inode(磁盘 IO)✅ 优化建议:
readdir + d_type(如果支持)getdents / getdents64statls 都卡不要:
/data/
file0001
file0002
...
file1000000
改成:
/data/00/
/data/01/
...
/data/ff/
或按时间:
/data/2026/01/21/
✅ 经验值:
| 文件系统 | 说明 |
|---|---|
| ext4 | 默认,还行 |
| xfs | 大目录更好 |
| btrfs | 不推荐大目录 |
| tmpfs | 内存目录最快 |
✅ 大目录场景优先 XFS
mount -o noatime,nodiratime /dev/sdX /mnt
避免访问时间更新带来的写 IO
d_type 代替 statstruct dirent *de;
while ((de = readdir(dir))) {
if (de->d_type == DT_REG) {
// 普通文件
}
}
⚠️ 注意:
getdents64 直接读比 readdir 少一层封装
(适合高性能场景)
✅ 可提前预热:
ls /big/dir > /dev/null
sysctl -w vm.vfs_cache_pressure=50
如果你是:
✅ 优化:
actimeo=3600如果真的极端场景:
如果你愿意,可以告诉我:
我可以直接给你针对性优化代码或方案。