- RU.PERL ----------------------------------------------------------- RU.PERL - Msg : #3525 [639] От : Artem Chuprina 2:5020/400 11 мая 04, 14:14 Кому : Mikhail Polykovsky 11 мая 04, 22:01 Тема : Re: Проверка на вхождение в массив ------------------------------------------------------------------------------- @company.utk.ru> From: Artem ChuprinaMikhail Polykovsky -> Artem Chuprina @ Tue, 11 May 2004 04:58:17 +0000 (UTC): MP>>> Вдогонку: я не подумал о том, что может понадобиться несколько раз MP>>> проверять вхождение элемента в один и то же массив. У меня такой MP>>> задачи не было, массивы были все время разными. AC>> А в случае с разными массивами ты мог бы быть в курсе о наличии функции AC>> grep() MP> Может, ты вот это имел в виду? Hет. Результат, конечно, будет несколько неадекватный, но ты сам себе такой массив выбрал... MP> =============================== 1.pl ================================ MP> use Benchmark qw(cmpthese); MP> $x = '1'; MP> @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 MP> 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 MP> 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 MP> 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 MP> 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 MP> 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 MP> 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 MP> 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 MP> 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); %hash = map {$_ => 1} @arr; MP> cmpthese(100000, { MP> 'arr' => sub { in_arr($x, \@arr) }, MP> 'hash' => sub { in_hash($x, \@arr) }, Здесь меняем @arr на %hash. MP> MP> 'ret' => sub { in_ret($x, \@arr) }, MP> }); MP> sub in_arr{ MP> my $item = shift; MP> my $arr = shift; MP> for (@$arr){ MP> return 1 if $item eq $_; MP> } MP> return 0; MP> } MP> sub in_hash{ MP> my $item = shift; MP> my $arr = shift; MP> my %hash = map {$_ => 1} @$arr; MP> return exists $hash{$item}; Здесь последние три строки меняем на my $hash = shift; return exists $hash->{$item}; MP> MP> } MP> sub in_ret{ MP> my $item = shift; MP> my $arr = shift; MP> grep {return $_ if $_ eq $item} @$arr; MP> } MP> ===================================================================== MP> Benchmark: timing 100000 iterations of arr, hash, ret... MP> arr: 1 wallclock secs ( 0.61 usr + 0.00 sys = 0.61 CPU) @ MP> 163934.43/s (n=100000) hash: 80 wallclock secs (78.09 usr + 0.03 sys MP> = 78.13 CPU) @ 1280.00/s (n=100000) ret: 1 wallclock secs ( 0.61 MP> usr + 0.00 sys = 0.61 CPU) @ 164203.61/s (n=100000) Rate hash MP> arr ret hash 1280/s -- -99% -99% arr 163934/s 12707% -- MP> -0% ret 164204/s 12728% 0% -- А эти три строки - соответственно на arr 322581/s -- -3% -58% ret 333333/s 3% -- -57% hash 769231/s 138% 131% -- MP> Если нет, объясни плз. Идея в том, что хэш осмыслен не при преобразовании из массива, а когда он и является внешней структурой. Если каждый раз для поиска его создавать из массива, то толку от него, конечно, нет. -- Artem Chuprina RFC2822: , FIDO: 2:5020/122.256, ICQ: 13038757 --- ifmail v.2.15dev5.3 * Origin: Leninsky 45 home network (2:5020/400)