Perlについての質問箱 10箱目

このエントリーをはてなブックマークに追加
軽くベンチしてみた。やはりList::Util速いわ。
use Benchmark;
use List::Util qw(max);
my @list;
foreach (1..$ARGV[0]) {push @list, rand}

timethese(-1, {
    sort => sub {
      my @sorted = sort {$a <=> $b} @list;
      return $sorted[-1];
    },
    sort2 => sub {
      return (sort {$a <=> $b} @list)[-1];
    },
    foreach => sub {
      my $max = $list[0];
      foreach (@list) { $max = $_ if $_ > $max; }
      return $max;
    },
    map => sub {
      my $max = $list[0];
      map { $max = $_ if $_ > $max } @list;
      return $max;
    },
    max => sub {
      return max(@list);
    },
  });
>>71の結果。List::Utilは別格に速い。sortとforeachは要素数が増えると逆転。

% perl max.pl 10
Benchmark: running foreach, map, max, sort, sort2 for at least 1 CPU seconds...
foreach: 2 wallclock secs ( 1.03 usr + 0.00 sys = 1.03 CPU) @ 104388.35/s (n=107520)
map: 2 wallclock secs ( 1.06 usr + 0.00 sys = 1.06 CPU) @ 147539.62/s (n=156392)
max: 1 wallclock secs ( 1.02 usr + 0.00 sys = 1.02 CPU) @ 562195.10/s (n=573439)
sort: 1 wallclock secs ( 1.03 usr + 0.00 sys = 1.03 CPU) @ 55672.82/s (n=57343)
sort2: 2 wallclock secs ( 1.01 usr + 0.00 sys = 1.01 CPU) @ 227103.96/s (n=229375)
% perl max.pl 100
Benchmark: running foreach, map, max, sort, sort2 for at least 1 CPU seconds...
foreach: 1 wallclock secs ( 1.05 usr + 0.00 sys = 1.05 CPU) @ 21557.14/s (n=22635)
map: 1 wallclock secs ( 1.05 usr + 0.00 sys = 1.05 CPU) @ 24093.33/s (n=25298)
max: 1 wallclock secs ( 1.06 usr + 0.00 sys = 1.06 CPU) @ 115923.58/s (n=122879)
sort: 1 wallclock secs ( 1.06 usr + 0.00 sys = 1.06 CPU) @ 6338.68/s (n=6719)
sort2: 2 wallclock secs ( 1.04 usr + 0.00 sys = 1.04 CPU) @ 20675.96/s (n=21503)
% perl max.pl 1000
Benchmark: running foreach, map, max, sort, sort2 for at least 1 CPU seconds...
foreach: 1 wallclock secs ( 1.08 usr + 0.00 sys = 1.08 CPU) @ 2370.37/s (n=2560)
map: 2 wallclock secs ( 1.06 usr + 0.00 sys = 1.06 CPU) @ 2534.91/s (n=2687)
max: 1 wallclock secs ( 1.09 usr + 0.00 sys = 1.09 CPU) @ 13151.38/s (n=14335)
sort: 1 wallclock secs ( 1.08 usr + 0.00 sys = 1.08 CPU) @ 517.59/s (n=559)
sort2: 1 wallclock secs ( 1.05 usr + 0.00 sys = 1.05 CPU) @ 1421.90/s (n=1493)