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

Толян II agrishaev на gmail.com
Пт Ноя 25 03:50:37 PST 2016


У тебя может быть overload в нескольких местах:
1) В массиве @ips
2)  while( $ipn < $ipn->broadcast )              --- вызов метода + overload
3) my $iponly = (split '/', $ipn++)[0]; #get     --- overload в чистом виде
+ преобразование в строку.




25 ноября 2016 г., 14:38 пользователь Naim Sh via Moscow-pm <
moscow-pm на pm.org> написал:

> Оки и какой вариант быстрее того же 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 mailing list
> moscow-pm на pm.org | http://moscow.pm.org
>
----------- следущая часть -----------
Вложение в формате HTML было извлечено…
URL: <http://mail.pm.org/pipermail/moscow-pm/attachments/20161125/09c9905e/attachment.html>


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