[Moscow.pm] Очень медленное нахождение элемента в массиве

Naim Sh shafiev на gmail.com
Пт Ноя 25 03:38:36 PST 2016


Оки и какой вариант быстрее того же map будет .
код имеет такой вид ( точнее его кусок который больше всего времени и ест )

массив @ips имеет стандартные ipv4 адреса типа 10.56.6.2, 10.135.8.23  , 
10.135.22.43 и тд и тп .

         my $ipn = NetAddr::IP->new("$first_ip/$netmask");

         while( $ipn < $ipn->broadcast )
         {
             my $iponly = (split '/', $ipn++)[0]; #get

             if ( ! ( grep {$iponly eq $_}  @ips )  )
             {
                 return $iponly;
             }

         }

first отдает не то что мне нужно из под этой сети адрес в данном случае 
10.135.x.y а 10.56.x.y хотя да он первый пустой, но grep выдает то что 
нужно.

Вроде tie переменных и т.д нету


On 11/25/2016 03:29 PM, Sergey Aleynikov via Moscow-pm wrote:
> Добрый день,
>
> map будет быстрее только если поисков по одному и тому же исходному
> массиву @ips будет несколько - т.к. операция построения хэша дорогая.
> Одноразовый поиск - греп быстрее. first возвращает другое (по смыслу)
> значение, чем греп (элемент, а не количество), но логически для этой
> задачи разницы быть не должно.
>
> PS: my %ips; @ips{@ips} = (); быстрее, чем my %ips = map { $_ => 1 } @ips;
>
> Best regards,
> Sergey Aleynikov
>
>
> 25 ноября 2016 г., 14:00 пользователь Naim Sh via Moscow-pm
> <moscow-pm на pm.org> написал:
>> Коллеги, столкнулся с тем что код такого вида , используемый для поиска
>> свободных ip v4 адресов на размерах 500-1000 элементов отрабатывается под 5
>> секунд версия с map :
>>
>> my %ips = map { $_ => 1 } @ips;
>> if (not exists($ips{$iponly} ))
>> {
>>          return $iponly;
>> }
>>
>>
>>   и с grep(sic!) ~2 секунду :
>>
>> if ( ! ( grep {$iponly eq $_ } @ips ) )
>> # spent 27.4ms making 814 calls to NetAddr::IP::Lite::broadcast, avg
>> 34µs/call
>> # spent 9.56ms making 814 calls to
>> NetAddr::IP::Lite::__ANON__[NetAddr/IP/Lite.pm:268], avg 12µs/call
>> {
>>      return $iponly;
>> }
>>
>> Еще трабла в том что легендарный List::Util отдает быстро но почему не тот
>> же результат( пробовал first , none ) что и grep?
>>
>> коллеги это нормально на более-менее среднем сервачке ?
>>
>>
>> --
>> Moscow.pm mailing list
>> moscow-pm на pm.org | http://moscow.pm.org
>>

-- 
  



Подробная информация о списке рассылки Moscow-pm