# Sub::Sequence と splice と natatime の benchmark [[/diary/2012/1123 きのう]]出した {{cpan: Sub::Sequence}} ですが、速度も気になるところだったので、splice と natatime とあわせてベンチマークとってみました。ソースはあとに回してまず結果をみると、以下のような感じになってました。 Rate natatime seq splice natatime 2.50/s -- -13% -25% seq 2.87/s 15% -- -14% splice 3.33/s 33% 16% -- `splice` 速いですね。さすが組み込みです(破壊的なのが許容できれば最強選択肢)。{{cpan: List::MoreUtils}}#natatime も速いんじゃないかと思いましたが、そんなでもなかったです。取り急ぎ自分の想定しているユースケースになるようなパラメータ配分をした結果が上ですが、実は、一度に処理する要素数($at_time) を小さくすると、`natatime` が `seq` を逆転してたりしました。 とはいえ、まあ、記述の簡易さでは `seq` が良さそうに思えませんか? ねぇ ねぇ ねぇ ねぇ #!/usr/bin/perl use strict; use warnings; use Benchmark qw/timethese cmpthese/; use Sub::Sequence; use List::MoreUtils qw/natatime/; my $list_items = 1000_000; my @ID_LIST = (1..$list_items); @ID_LIST = (); my $at_time = 100; my $result = timethese (5, { 'seq' => '&logic1;', 'splice' => '&logic2;', 'natatime' => '&logic3;', }); cmpthese $result; sub logic1 { @ID_LIST = (1..$list_items); my $result = seq \@ID_LIST, $at_time, sub { 1; }; } sub logic2 { @ID_LIST = (1..$list_items); my $result; while ( my @list = splice(@ID_LIST, 0, $at_time) ) { push @{$result}, 1; } } sub logic3 { @ID_LIST = (1..$list_items); my $result; my $it = natatime $at_time, @ID_LIST; while ( my @list = $it->() ) { push @{$result}, 1; } }