【Perl】 ファイルリストを更新日時順で高速ソートする

Perlでファイル一覧を取得して並べ替えをする方法はぐぐればたくさん出てくるが・・・
ファイル数が3000もあると、どうにも遅くて仕方がない。

遅い理由は、比較ブロック内で何度もファイルの更新日時を取得しにいっているから。
ということは、あらかじめファイルの更新日時をハッシュテーブルに格納しておいて、
そこを参照するようにすれば高速化できる可能性が高い。

実際にやってみた結果が以下。

my $dir = "./files/";
my $start;
my @files;
my %files_mtime;
my @files_sorted;

opendir(DIR, $dir);
@files = grep(!/^\./, readdir(DIR));
closedir(DIR);

print("ファイル数:" . $#files . "\n");

#日付順でソート(1)
#------------------------------------------------
$start = time();

@files_sorted = sort({(stat("$dir$b"))[9] cmp (stat("$dir$a"))[9]} @files);

print((time() - $start) . "秒\n");
#------------------------------------------------

#日付順でソート(2)
#------------------------------------------------
$start = time();

%files_mtime = map({$_ => (stat "$dir$_")[9]} @files);

@files_sorted = sort({$files_mtime{$b} cmp $files_mtime{$a}} @files);

print((time() - $start) . "秒\n");
#------------------------------------------------

2014121401.png

なんと、7.5倍も速くなった。
もちろん実行結果は同じなのでこの方法でやるべきだろう。