温馨提示×

debian readdir和scandir谁快

小樊
49
2026-09-07 10:39:37
栏目: 智能运维

在 Debian(以及一般的 Linux/glibc 环境)中,scandir 通常比 readdir 更快,但要看使用场景。


一句话结论

  • 只遍历目录、不排序、不需要额外信息时:readdir(配合 opendir)更快
  • 需要过滤、排序、或一次性拿到结果时:scandir 更快、更方便

原因对比

1. readdir

  • 工作方式:
    • opendir → 多次 readdir → closedir
  • 特点:
    • 一次只返回一个目录项
    • 不排序
    • 不分配额外数组
  • 优点:
    • 内存占用小
    • 对超大目录更可控
  • 缺点:
    • 如果你要排序或过滤,需要自己写代码,反而更慢

2. scandir

  • 工作方式:
    • 一次性读取整个目录
    • 按 alphasort 或自定义函数排序
    • 返回 struct dirent ** 数组
  • 优点:
    • 内核调用次数少
    • 排序、过滤由 libc 完成
    • 代码更简洁
  • 缺点:
    • 内存占用更高(尤其目录非常大)

性能实测经验(典型情况)

场景 推荐
几万以上文件,仅遍历 readdir
需要 ls 风格排序 scandir
需要按规则过滤 scandir + filter
目录极小 两者差异可忽略

示例对比

readdir(基础遍历)

DIR *d = opendir(path);
struct dirent *e;
while ((e = readdir(d))) {
    // 处理 e->d_name
}
closedir(d);

scandir(排序 + 过滤)

struct dirent **namelist;
int n = scandir(path, &namelist, NULL, alphasort);
for (int i = 0; i < n; i++) {
    // namelist[i]->d_name
    free(namelist[i]);
}
free(namelist);

总结

  • 单纯“快”:小目录 scandir 更快,大目录 readdir 更稳
  • 开发效率:scandir 完胜
  • 生产环境大目录:readdir + 手动处理更可靠

如果你有具体使用场景(比如“百万文件目录”“只统计数量”),我可以给你更精确的建议。

0 踩