「Intermediate Perl」の本を読んでいるときに、Schwartzian Transforms のセクションに気付き、演習 (9.9.2) の例を試しましたが、複数回実行すると変換に通常のソートよりも時間がかかることに気付きました。ここのコードは、ファイル サイズに基づいて、windows\system32 ディレクトリ内のファイルの単純な並べ替えを実行します。
#!/usr/bin/perl
use strict;
use warnings;
use Benchmark;
my $time = timethese( 10, {
testA => sub { map $_->[0],
sort {$a->[1] <=> $b->[1]}
map [$_, -s $_],
glob "C:\\Windows\\System32\\*";
},
testB => sub { sort { -s $a <=> -s $b } glob "C:\\Windows\\System32\\*";
},
}
);
出力は -
Benchmark: timing 10 iterations of testA, testB...
testA: 11 wallclock secs ( 1.89 usr + 8.38 sys = 10.27 CPU) @ 0.97/s (n=10)
testB: 5 wallclock secs ( 0.89 usr + 4.11 sys = 5.00 CPU) @ 2.00/s (n=10)
私の理解では、ファイル操作 (-s) は testB の場合に何度も繰り返す必要があるため、testA よりもはるかに遅く実行する必要があります。ただし、出力はその観察から逸脱しています。ここで何が欠けていますか?