fizzbuzz ベンチ

perlの関数呼び出しは遅いとのことで、ベンチを取ってみた。
おきにいりの書き方は、関数リファレンスを配列に入れて一つづつ実行してるから、あほほど遅いであろうと予測

ベンチマークスクリプト

my $count = 10000;

cmpthese($count,
  {
    fizzbuzz1=>sub{
      my $zero = sub{0};
      my @fizz = ($zero,$zero,sub{'fizz';1});
      my @buzz = ($zero,$zero,$zero,$zero,sub{'buzz';1});

      my $print_n = sub{$_[0] + 1};
      return sub{
        $fizz[$i % @fizz]->() + $buzz[$i % @buzz]->() || $print_n->($i);
      }
    }->(),
    fizzbuzz2=>sub{
      my $str;
      if($i % 3 == 0){$str = 'fizz'}
      if($i % 5 == 0){$str .= 'buzz'}
      $str || $i+1;
    }
  }
);

OS: Mac OSX Leopard
CPU: Core2Duo 2.4GHz
メモリ: 2GB
perl: v5.8.9 built for darwin-2level

               Rate fizzbuzz1 fizzbuzz2
fizzbuzz1  500000/s        --      -50%
fizzbuzz2 1000000/s      100%        --

確かに遅い、、、ってかピッタリ半分っておかしくね??

カウントを一桁増やして実行してみた。
まぁ、倍以上違うってこったなww

               Rate fizzbuzz1 fizzbuzz2
fizzbuzz1  543478/s        --      -68%
fizzbuzz2 1694915/s      212%        --


標準出力に出力すること自体が関数の実行に比べて時間がかってしまって、ボトルネックになっているのだと思うので、ベンチマークスクリプトではprintでの出力をしていない。