[Tokyo-pm] これはどう動くの?

Shinya Hayakawa tetryl @ tokyoprogrammer.com
2004年 8月 26日 (木) 08:53:48 CDT


こんにちは。早川です。
-- 管理者様すみません。。再送です

せっかくなのでベンチマーク取ってみました。

use strict;
use Benchmark;
my $fname = 'ls-lR.txt';
timethese( -3,
    { normal  => sub {
        local $/ = "";
        open my $fh, $fname or die;
        my %lslr = map {sub {substr(shift,0,-1), \@_}->(split /\n/)} <$fh>;
    }
    , redundant => sub {
        local $/ = "";
        open my $fh, $fname or die;
        my %lslr = ();
        for (<$fh>) {
            my @lines = split /\n/;
            my $head = substr(shift @lines, 0, -1);
            $lslr{$head} = \@lines;
        }
    }
    } );

Benchmark: running normal, redundant for at least 3 CPU seconds...
    normal:  4 wallclock secs ( 3.06 usr +  0.11 sys =  3.17 CPU) @ 2943.53/s 
(n=9331)
 redundant:  4 wallclock secs ( 3.17 usr +  0.09 sys =  3.26 CPU) @ 2512.27/s 
(n=8190)

1行が6行になったからといって
それほど冗長さは感じられませんが (^^;
前者の方が効率はいいみたいですね。

はじめはsubstrが無くて以下のようなコードだったのですが
これは見た目的に、とても美しいと感じました。
%lslr = map {sub {shift, \@_}->(split /\n/)} <$fh>;

なにはさておき、このようなコードを可能にした
$/変数は素晴らしいと思います。

-- 
Shinya Hayakawa
hayakawa at livedoor.jp



Tokyo-pm メーリングリストの案内