[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