|
|
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
|