在 Debian(以及所有主流 Linux 发行版)里,opendir() 本身的性能通常是很好的,但是否“够快”取决于使用场景和目录规模。下面分点说明:
opendir() 干了什么opendir() 是 glibc + 内核 getdents64 的封装:
open())DIR 结构它本身 不读取全部目录内容,只是“打开”。 真正耗时的是:
readdir() / readdir_r()| 目录条目数 | opendir 性能 |
|---|---|
| < 1k | 极快(微秒级) |
| 1k–10k | 很快 |
| 10k–100k | 可接受 |
| > 100k | 明显变慢(尤其是 ext4 / NFS) |
⚠️ 上百万文件的目录是 反模式
| 文件系统 | opendir 性能 |
|---|---|
| ext4 | 好 |
| xfs | 很好 |
| btrfs | 中等 |
| NFS | 差(网络延迟) |
| tmpfs | 极好 |
如果目录已被访问过:
opendir() 几乎瞬间完成❌ “opendir 慢” ✅ 实际常是:
readdir() 遍历太多文件opendir() 子目录scandir()(一次读取 + 排序)getdents64 直接系统调用(高级)stat() 前先过滤Debian 上
opendir()性能很好,瓶颈几乎永远不在opendir()本身,而在目录规模和后续遍历方式。
如果你有具体场景(比如:遍历 100 万个文件 / 高频调用 / NFS),可以告诉我,我可以给更针对性的建议或代码示例。