Главная страница


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)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 grep   Renat Araslanow   11 May 2004 20:47:53 
 Re: grep   Andrew Alakozow   12 May 2004 10:29:03 
Архивное /ru.perl/327840a0e856.html, оценка 1 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional