ファイルリスト取得のコード例と速度(winの場合)

back
■1. ファイルグロブを使用
hmiyazaki@mozzarella:~/work/tsol/dev/statistics4$ time zsh -c "repeat 100 ./listup_ctrl.pl"

real    0m22.703s
user    0m8.790s
sys     0m11.970s


■2. `find -type f`を使用
hmiyazaki@mozzarella:~/work/tsol/dev/statistics4$ time zsh -c "repeat 100 ./listup_ctrl.pl"

real    0m40.744s
user    0m13.910s
sys     0m27.040s
hmiyazaki@mozzarella:~/work/tsol/dev/statistics4$


■3. `find -name "*-Control"`を使用
hmiyazaki@mozzarella:~/work/tsol/dev/statistics4$ time zsh -c "repeat 100 ./listup_ctrl.pl"

real    0m36.128s
user    0m14.690s
sys     0m21.130s


■4. `opendir で力技`
hmiyazaki@mozzarella:~/work/tsol/dev/statistics4$ time zsh -c "repeat 100 ./listup_ctrl.pl"

real    0m25.324s
user    0m9.840s
sys     0m15.710s


ただし、Solari で実行した場合は、リストアップ対象ファイルが多いほど、
find を使うほうが高速


------------------
コード
------------------
#!/usr/bin/perl

# Control ファイルをリストアップする
# $dir 以下にある、*-Control ファイルをリストアップ

my $basedir = ".";
my $dir = $basedir . "/queue/defferred/SMTP-Deliver";
#my $dir = $basedir . "/test";

#@list = <$dir/*/*/*/*-Control>;                     # (1)
#@list = glob "$dir/*/*/*/*-Control";                # (1)
#@list = split(/\s/, `find $dir -type f`);           # (2)
#@list = split(/\s/, `find $dir -name "*-Control"`); # (3)
@list = &get_filelist($dir, '\-Control$');           # (4)

#foreach (@list) {
#  print;
#  print "\n";
#}

sub get_filelist {
  my $basedir = shift;
  my $file_fmt = shift;
  my @filed;
  my @tmp;
  my $f;

  opendir(D, $basedir);
  @tmp = readdir(D);
  close(D);
  foreach $f (@tmp) {
    next if ($f =~ /^\.+$/);

    if (-d $basedir."/".$f) {
      push @filed, &get_filelist($basedir."/".$f, $file_fmt);
    }
    else {
      push @filed, $basedir."/".$f if ($f =~ /$file_fmt/);
    }
  }
  return @filed;
}

back