[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