[Moscow.pm] Очень медленное нахождение элемента в массиве
Толян II
agrishaev на gmail.com
Пт Ноя 25 03:27:50 PST 2016
Выглядит не реально, можешь код с данными выложить тем более (500-1000)
элементов это ~ 8кб всего.
Тестовый пример:
======================
use Time::HiRes qw(time);
my @ips = (1..1001);
for my $i (0..4){
my $iponly = 995 + $i;
my $s = time ();
my %ips = map { $_ => 1 } @ips;
my $r1 = (not exists $ips{$iponly});
my $time1 = time - $s;
$s = time ();
my $r2 = grep $_ eq $iponly, @ips;
my $time2 = time - $s;
printf ("i=$i\tmap=%4.3fms grep=%4.3fms\n", $time1 * 1000, $time2 *
1000);
}
=======================
i=0 map=0.660ms grep=0.116ms
i=1 map=0.515ms grep=0.070ms
i=2 map=0.471ms grep=0.070ms
i=3 map=0.529ms grep=0.071ms
i=4 map=0.385ms grep=0.051ms
========================
Конечно map медленнее, но до двух секунд ему далеко(разница в три порядка)
Нужно смотреть на код и данные, может там есть магия.
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
> <http://ironleg.azedunet.az/nytprof/NetAddr-IP-Lite-pm-197-line.html#1073>,
> avg 34µs/call
> # spent 9.56ms making 814 calls to NetAddr::IP::Lite::__ANON__[
> NetAddr/IP/Lite.pm:268]
> <http://ironleg.azedunet.az/nytprof/NetAddr-IP-Lite-pm-197-line.html#266>,
> avg 12µs/call
> {
> return $iponly;
> }
>
> Еще трабла в том что легендарный List::Util отдает быстро но почему не тот
> же результат( пробовал first , none ) что и grep?
>
> коллеги это нормально на более-менее среднем сервачке ?
>
>
> --
> Moscow.pm mailing list
> moscow-pm на pm.org | http://moscow.pm.org
>
>
----------- следущая часть -----------
Вложение в формате HTML было извлечено…
URL: <http://mail.pm.org/pipermail/moscow-pm/attachments/20161125/1bf7da5a/attachment-0001.html>
Подробная информация о списке рассылки Moscow-pm