【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より高速だった!
という結果となりました。
コメント