|
ru.perl- RU.PERL ---------------------------------------------------------------------- From : Renat Araslanow 2:5011/119.1 11 May 2004 20:47:53 To : All Subject : grep -------------------------------------------------------------------------------- обсуждение проверки вхождения в массив натолкнуло на такую странность получается если в блоке грепа ретурн - то проверяются не все элементы? ЗЫ% если в блок first добавить ретурн, то получаем такое сообщение "Can't return outside a subroutine at 4.pl line 53." вообще странно почему first такой медленный - перловый фор и то быстрее. Benchmark: timing 100000 iterations of arr, first, grep, grep_ret... arr: 1 wallclock secs ( 1.82 usr + 0.00 sys = 1.82 CPU) @ 54854.64/s ( n=100000) first: 6 wallclock secs ( 5.12 usr + 0.08 sys = 5.20 CPU) @ 19238.17/s ( n=100000) grep: 30 wallclock secs (29.34 usr + 0.00 sys = 29.34 CPU) @ 3407.97/s (n =100000) grep_ret: 2 wallclock secs ( 1.67 usr + 0.01 sys = 1.68 CPU) @ 59417.71/s ( n=100000) Rate grep first arr grep_ret grep 3408/s -- -82% -94% -94% first 19238/s 465% -- -65% -68% arr 54855/s 1510% 185% -- -8% grep_ret 59418/s 1643% 209% 8% -- #!/usr/bin/perl use Benchmark qw(cmpthese); use List::Util qw/first/; $x = '1'; @arr = qw(3 4 5 6 2 5 6 1 2 3 3 4 5 6 2 5 6 1 2 3 3 4 5 6 2 5 6 1 2 3 3 4 5 6 2 5 6 1 2 3 3 4 5 6 2 5 6 1 2 3 3 4 5 6 2 5 6 1 2 3 3 4 5 6 2 5 6 1 2 3 3 4 5 6 2 5 6 1 2 3 3 4 5 6 2 5 6 1 2 3 3 4 5 6 2 5 6 1 2 3 3 4 5 6 2 5 6 1 2 3 3 4 5 6 2 5 6 1 2 3 3 4 5 6 2 5 6 1 2 3 3 4 5 6 2 5 6 1 2 3 3 4 5 6 2 5 6 1 2 3 3 4 5 6 2 5 6 1 2 3 3 4 5 6 2 5 6 1 2 3 3 4 5 6 2 5 6 1 2 3 3 4 5 6 2 5 6 1 2 3 3 4 5 6 2 5 6 1 2 3 3 4 5 6 2 5 6 1 2 3 3 4 5 6 2 5 6 1 2 3 3 4 5 6 2 5 6 1 2 3 3 4 5 6 2 5 6 1 2 3 3 4 5 6 2 5 6 1 2 3 3 4 5 6 2 5 6 1 2 3 3 4 5 6 2 5 6 1 2 3 3 4 5 6 2 5 6 1 2 3 3 4 5 6 2 5 6 1 2 3 3 4 5 6 2 5 6 1 2 3 3 4 5 6 2 5 6 1 2 3 3 4 5 6 2 5 6 1 2 3); cmpthese(100000, { 'arr' => sub { in_arr($x, \@arr) }, # 'hash' => sub { in_hash($x, \@arr) }, 'grep' => sub { in_grep($x, \@arr) }, 'grep_ret' => sub { in_grep_ret($x, \@arr) }, 'first' => sub { in_first($x, \@arr) }, }); sub in_arr{ my $item = shift; my $arr = shift; for (@$arr){ return 1 if $item eq $_; } return 0; } sub in_hash{ my $item = shift; my $arr = shift; my %hash = map {$_ => 1} @$arr; return exists $hash{$item}; } sub in_grep_ret{ my $item = shift; my $arr = shift; grep {return $_ if $_ eq $item} @$arr; } sub in_grep{ my $item = shift; my $arr = shift; grep {$_ eq $item} @$arr; } sub in_first{ my $item = shift; my $arr = shift; first {$_ eq $item} @$arr; } __END__ --- [Преждевременная оптимизация -- корень всех зол Д. Кнут] * Origin: Чайник с программным управлениемЪ (2:5011/119.1) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.perl/327840a0e856.html, оценка из 5, голосов 10
|