【linux】lsより高速にファイルの一覧を出そうとしてみた
問題
ファイルの一覧を出すコマンドって ls しかないんですか。
答え
ls は、readdir と stat をしているから遅いんだという話を聞いて、
readdirを使ってファイルの一覧を出力するプログラムをCで書いてみた。
やることは意外と簡単。
1、Cでプログラムを書く
$ vi readdir.c
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <dirent.h>
void main(argc,argv)
int argc;
char *argv[];
{
DIR *dir;
struct dirent *dp;
char path[512];
if(argc<=1){
strcpy(path,".");
}
else{
strcpy(path,argv[1]);
}
if((dir=opendir(path))==NULL){
perror("opendir");
exit(-1);
}
for(dp=readdir(dir);dp!=NULL;dp=readdir(dir)){
printf("%s\n",dp->d_name);
}
closedir(dir);
}
2、コンパイルする
これだけで実行ファイル readdir が出来上がる。
$ gcc -o readdir readdir.c
3、実行する
ファイルが100万個あるテスト環境を作る。ファイル名が1000000から1999999で100万個。forしているのは、一度に100万個作ろうとしたら引数が長すぎるというエラーになる対策で、10万個ずつ作るようにしたため。
$ for i in {0..9}; do touch testdir/{100000..199999}$i; done
lsだと
$ time ls -U testdir/ | wc 1000000 1000000 8000000 real 0m1.240s user 0m1.501s sys 0m0.762s
自作した readdir コマンドだと
$ time ./readdir testdir/ | wc 1000002 1000002 8000005 real 0m1.047s user 0m1.214s sys 0m0.741s
ls との違いがあまりなかった!
一応、lsより高速だった!
という結果となりました。