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

Naim Sh shafiev на gmail.com
Пт Ноя 25 04:10:37 PST 2016


Оки, я просто думаю щас затестить не весь модуль NetAddr::IP а его lite 
версию ( хотя как я предполагаю выигрыш будет маленький) + щас 
переустановил точнее пересобрал его xs стало лучше .

+ надо затестить как она будет с broadcast и subnet-zero сетками пахать .

On 11/25/2016 04:07 PM, zhecka via Moscow-pm wrote:
> ну я бы не сказал.
>
> $banned = new Net::Patricia;
> if(!$banned->match_string($banip))
>     {
>          $banned->add_string($banip);
>     }
>
> просто заполняешь базу Patricia когда тебе нужно и матчишь что есть и 
> чего нет.
>
>
>
> On 25.11.2016 14:54, Naim Sh via Moscow-pm wrote:
>>
>> да кроме 2 и 3  его нету .
>>
>> Кстати как я понял Net::Patricia не очень мне подходит(удобен) ведь 
>> мне надо найти адрес которого нет в массиве
>>
>> This module uses a Patricia Trie data structure to quickly perform IP 
>> address prefix matching for applications such as IP subnet, network 
>> or routing table lookups ?
>>
>> On 11/25/2016 03:50 PM, Толян II via Moscow-pm wrote:
>>> У тебя может быть 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 <mailto: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 <mailto:moscow-pm на pm.org> |
>>>             http://moscow.pm.org
>>>
>>>
>>>     -- 
>>>
>>>     -- 
>>>     Moscow.pm mailing list
>>>     moscow-pm на pm.org <mailto:moscow-pm на pm.org> | http://moscow.pm.org
>>>
>>>
>>>
>>>
>>
>> -- 
>>   
>>
>>
>
>
>

-- 
  

----------- следущая часть -----------
Вложение в формате HTML было извлечено…
URL: <http://mail.pm.org/pipermail/moscow-pm/attachments/20161125/4b2206fb/attachment-0001.html>


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