SOFTELメモ Developer's blog

会社概要 ブログ 調査依頼 社員募集 ...

【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より高速だった!

という結果となりました。

関連するメモ

コメント