2010年7月11日日曜日

[Perl] for と foreach は同じ。

配列の繰り返し処理でよく使われる foreach。
実は foreach を for と書き変えても全く同じ動作をしてくれます。

例) 下記のコードは全く同じ処理
foreach my $var (@vars) {
    print $var;
}
for my $var (@vars) {
    print $var;
}

foreach は for のエイリアスなので、どちらを使ってもOKです。
perldoc にもある通り、読みやすさのために foreach、簡潔さのために for な感じでしょうか。
http://perldoc.jp/docs/perl/5.8.8/perlsyn.pod (Foreach Loops for foreach)

一応ベンチマークを取ってみました。(ついでに個人的によく使う map も)
ベンチマークコードです。
#!/usr/bin/perl
use strict;
use warnings;
use Benchmark qw/cmpthese timethese/;

cmpthese timethese(10000, {
    'foreach' => sub { foreach (1 .. 10000) {} },
    'for'     => sub {     for (1 .. 10000) {} },
    'map'     => sub { map {;} (1 .. 10000)    },
});

そして実行結果。
Benchmark: timing 10000 iterations of for, foreach, map...
for:  6 wallclock secs ( 6.07 usr +  0.00 sys =  6.07 CPU) @ 1647.45/s (n=10000)
foreach:  6 wallclock secs ( 6.14 usr +  0.00 sys =  6.14 CPU) @ 1628.66/s (n=10000)
map:  8 wallclock secs ( 7.52 usr +  0.01 sys =  7.53 CPU) @ 1328.02/s (n=10000)
          Rate     map foreach     for
map     1328/s      --    -18%    -19%
foreach 1629/s     23%      --     -1%
for     1647/s     24%      1%      --

foreach と for は速度的にもほとんど同じですね。(map は遅いなぁ)

0 件のコメント: