在 CentOS(或一般 Linux)上,测 readdir 的性能/速度,通常有几种层级的做法,取决于你想测的是:
readdir() 系统调用本身下面按常用程度给你几种方法。
strace 粗略测 readdir 调用耗时(最简单)适合:看 readdir 被调用了多少次、花了多少时间
strace -T -e trace=readdir,getdents,getdents64 ls /bigdir >/dev/null
说明:
-T:打印每个系统调用耗时getdents64 是 readdir 底层真实调用示例输出:
getdents64(3, /* 1024 entries */, 32768) = 32768 <0.002345>
✅ 快速但不精确(有 strace 自身开销)
time + 目录遍历命令(最常用)time ls -f /path/to/dir | wc -l
或
time find /path/to/dir -maxdepth 1 >/dev/null
-f 表示不排序,更接近 readdir 原生行为
readdir(推荐)这是最准确的方法。
readdir 测速程序#include <stdio.h>
#include <dirent.h>
#include <sys/time.h>
int main(int argc, char *argv[]) {
if (argc < 2) {
printf("usage: %s <dir>\n", argv[0]);
return 1;
}
struct timeval start, end;
gettimeofday(&start, NULL);
DIR *dir = opendir(argv[1]);
if (!dir) {
perror("opendir");
return 1;
}
struct dirent *entry;
long count = 0;
while ((entry = readdir(dir)) != NULL) {
count++;
}
closedir(dir);
gettimeofday(&end, NULL);
double sec = (end.tv_sec - start.tv_sec) +
(end.tv_usec - start.tv_usec) / 1e6;
printf("entries: %ld\n", count);
printf("time: %.6f s\n", sec);
printf("speed: %.0f entries/s\n", count / sec);
return 0;
}
gcc readdir_test.c -o readdir_test
./readdir_test /path/to/dir
✅ 这是真正的 readdir 测速
mkdir testdir
cd testdir
for i in $(seq 1 100000); do touch file_$i; done
然后:
./readdir_test ./testdir
对比:
⚠️ ext4 在大目录(>10万)下性能下降明显
perf 分析 readdir 系统调用perf trace -e getdents64 ls /bigdir
或:
perf stat -e syscalls:sys_enter_getdents64 ls /bigdir
readdir 慢通常是:
getdents64 批量读stat 调用如果你愿意,可以告诉我:
我可以给你更针对性的测速方案和参数。