perlで速度うんぬんということのむなしさを maxで

404 Blog Not Found:perl - use List::Util; # for production codes

呼び出しているモジュールのソースコード
直接呼んでみたが実行速度は桁違いに遅い。

ビルトイン呼び出し>ビルトインの一部呼び出し>全部ソースコード
の順。

はっきり言ってPerlで書いてある段階で十分遅い。

早くしたいならCで書いてPerlに組み込んで 最低限の呼び出しだけPerlで行えということかと。


Perlで書いてある時点で速度がかなりロスになる、そのロスになったPerlで速度を出そうと言うことがかなり徒労に感じる。

#!/usr/local/bin/perl
use strict;
use warnings;
use Benchmark qw/timethese cmpthese/;
use List::Util ();

my $max   = shift || 1000;
my $count = shift || 0;
my @shuffled = List::Util::shuffle( 1 .. $max );


sub reduce (&@) {
  my $code = shift;
  no strict 'refs';

  return shift unless @_ > 1;

  use vars qw($a $b);

  my $caller = caller;
  local(*{$caller."::a"}) = \my $a;
  local(*{$caller."::b"}) = \my $b;

  $a = shift;
  foreach (@_) {
    $b = $_;
    $a = &{$code}();
  }

  $a;
}
sub hand_max (@) { reduce { $a > $b ? $a : $b } @_ }
sub qmax (@) { List::Util::reduce { $a > $b ? $a : $b } @_ }

cmpthese( timethese( $count, {

  'hand'    => sub { hand_max(@shuffled)     == $max or die },
  'List::Util::reduce' => sub { qmax(@shuffled) == $max or die },
  'List::Util' => sub { List::Util::max(@shuffled) == $max or die },
}));

Benchmark: running List::Util, List::Util::reduce, hand for at least 3 CPU seconds...
List::Util:  4 wallclock secs ( 3.20 usr +  0.01 sys =  3.21 CPU) @ 25526.48/s (n=81940)
List::Util::reduce:  3 wallclock secs ( 3.15 usr +  0.00 sys =  3.15 CPU) @ 3359.37/s (n=10582)
      hand:  3 wallclock secs ( 3.13 usr +  0.00 sys =  3.13 CPU) @ 902.56/s (n=2825)
                      Rate              hand List::Util::reduce       List::Util
hand                 903/s                --               -73%             -96%
List::Util::reduce  3359/s              272%                 --             -87%
List::Util         25526/s             2728%               660%               --


http://search.cpan.org/~gbarr/Scalar-List-Utils-1.19/lib/List/Util.pm

list::utilはここからひろったけど、これが古い?


Perlの事はよく分からないので、教えて偉い人