<div dir="ltr"><div><div>У тебя сам цикл тормозит, а не grep<br>==================================================================================<br>    use Time::HiRes qw(time);<br>    use NetAddr::IP;<br><br>my @ips = (<br>        map("172.16.1.".$_, 1..254 ),<br>        map("172.16.2.".$_, 1..254 ),<br>        map("172.16.3.".$_, 1..254 ),<br>        map("172.16.4.".$_, 1..254 ),<br>);<br><br>    for my $i ( 0 .. 4 ) {<br>        my $iponly = 995 + $i;<br>        my $s      = time();<br>        my %ips    = map { $_ => 1 } @ips;<br>        my $r1     = ( not exists $ips{$iponly} );<br>        my $time1  = time - $s;<br><br>        $s = time();<br>        my $r2 = grep $_ eq $iponly, @ips;<br>        my $time2 = time - $s;<br><br>        $s = time();<br>        my $ipn = NetAddr::IP->new("<a href="http://172.16.1.1/16">172.16.1.1/16</a>");<br>        while($ipn < $ipn->broadcast){<br>            my $iponly = (split "/", $ipn++)[0];<br>        }<br><br>        my $time3 = time - $s;<br><br>        printf( "i=$i\tmap=%4.3fms grep=%4.3fms while=%4.3fms\n", $time1 * 1000, $time2 * 1000, $time3 * 1000 );<br>    }<br>=================================================================================<br><br><br>i=0     map=0.572ms grep=0.136ms while=1726.824ms<br>i=1     map=0.407ms grep=0.052ms while=1752.693ms<br>i=2     map=0.394ms grep=0.048ms while=1701.981ms<br>i=3     map=0.507ms grep=0.063ms while=1786.335ms<br>i=4     map=0.823ms grep=0.053ms while=1704.208ms<br><br>==================================================================================<br><br><br></div>А если в @ ips еще overloaded ip, то и 10 секунд легко может быть <br><br></div>В твоем куске не видно как они получаются.<br><br><br></div><div class="gmail_extra"><br><div class="gmail_quote">25 ноября 2016 г., 15:10 пользователь Naim Sh via Moscow-pm <span dir="ltr"><<a href="mailto:moscow-pm@pm.org" target="_blank">moscow-pm@pm.org</a>></span> написал:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
  
    
  
  <div bgcolor="#FFFFFF" text="#000000">
    <p>Оки, я просто думаю щас затестить не весь модуль NetAddr::IP а
      его lite версию ( хотя как я предполагаю выигрыш будет маленький) 
      + щас переустановил точнее пересобрал его xs стало лучше . <br>
    </p>
    + надо затестить как она будет с broadcast и subnet-zero сетками
    пахать . <br><div><div class="h5">
    <br>
    <div class="m_-599783468089407545moz-cite-prefix">On 11/25/2016 04:07 PM, zhecka via
      Moscow-pm wrote:<br>
    </div>
    <blockquote type="cite">
      
      <div class="m_-599783468089407545moz-cite-prefix">ну я бы не сказал.<br>
        <br>
        $banned = new Net::Patricia;<br>
        if(!$banned->match_string($<wbr>banip))<br>
            {<br>
                 $banned->add_string($banip);<br>
            }<br>
        <br>
        просто заполняешь базу Patricia когда тебе нужно и матчишь что
        есть и чего нет.<br>
        <br>
        <br>
        <br>
        On 25.11.2016 14:54, Naim Sh via Moscow-pm wrote:<br>
      </div>
      <blockquote type="cite">
        
        <p>да кроме 2 и 3  его нету . <br>
        </p>
        Кстати как я понял Net::Patricia не очень мне подходит(удобен)
        ведь мне надо найти адрес которого нет в массиве<br>
        <br>
        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 ?<br>
        <br>
        <div class="m_-599783468089407545moz-cite-prefix">On 11/25/2016 03:50 PM, Толян II
          via Moscow-pm wrote:<br>
        </div>
        <blockquote type="cite">
          <div dir="ltr">
            <div>
              <div>У тебя может быть overload в нескольких местах:<br>
              </div>
              1) В массиве @ips<br>
            </div>
            2)  while( $ipn < $ipn->broadcast )              ---
            вызов метода + overload<br>
            3) my $iponly = (split '/', $ipn++)[0]; #get<span class="m_-599783468089407545gmail-im">     --- overload в чистом виде +
              преобразование в строку.<br>
              <br>
              <br>
            </span>
            <div>
              <div>
                <div>
                  <div>
                    <div><br>
                    </div>
                  </div>
                </div>
              </div>
            </div>
          </div>
          <div class="gmail_extra"><br>
            <div class="gmail_quote">25 ноября 2016 г., 14:38
              пользователь Naim Sh via Moscow-pm <span dir="ltr"><<a class="m_-599783468089407545moz-txt-link-abbreviated" href="mailto:moscow-pm@pm.org" target="_blank"></a><a class="m_-599783468089407545moz-txt-link-abbreviated" href="mailto:moscow-pm@pm.org" target="_blank">moscow-pm@pm.org</a>></span>
              написал:<br>
              <blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Оки и
                какой вариант быстрее того же map будет .<br>
                код имеет такой вид ( точнее его кусок который больше
                всего времени и ест )<br>
                <br>
                массив @ips имеет стандартные ipv4 адреса типа
                10.56.6.2, 10.135.8.23  , 10.135.22.43 и тд и тп .<br>
                <br>
                        my $ipn = NetAddr::IP->new("$first_ip/$n<wbr>etmask");<br>
                <br>
                        while( $ipn < $ipn->broadcast )<br>
                        {<br>
                            my $iponly = (split '/', $ipn++)[0]; #get<span><br>
                  <br>
                              if ( ! ( grep {$iponly eq $_}  @ips )  )<br>
                </span>             {<br>
                                return $iponly;<br>
                            }<br>
                <br>
                        }<br>
                <br>
                first отдает не то что мне нужно из под этой сети адрес
                в данном случае 10.135.x.y а 10.56.x.y хотя да он первый
                пустой, но grep выдает то что нужно.<br>
                <br>
                Вроде tie переменных и т.д нету
                <div class="m_-599783468089407545HOEnZb">
                  <div class="m_-599783468089407545h5"><br>
                    <br>
                    <br>
                    On 11/25/2016 03:29 PM, Sergey Aleynikov via
                    Moscow-pm wrote:<br>
                    <blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
                      Добрый день,<br>
                      <br>
                      map будет быстрее только если поисков по одному и
                      тому же исходному<br>
                      массиву @ips будет несколько - т.к. операция
                      построения хэша дорогая.<br>
                      Одноразовый поиск - греп быстрее. first возвращает
                      другое (по смыслу)<br>
                      значение, чем греп (элемент, а не количество), но
                      логически для этой<br>
                      задачи разницы быть не должно.<br>
                      <br>
                      PS: my %ips; @ips{@ips} = (); быстрее, чем my %ips
                      = map { $_ => 1 } @ips;<br>
                      <br>
                      Best regards,<br>
                      Sergey Aleynikov<br>
                      <br>
                      <br>
                      25 ноября 2016 г., 14:00 пользователь Naim Sh via
                      Moscow-pm<br>
                      <<a href="mailto:moscow-pm@pm.org" target="_blank">moscow-pm@pm.org</a>>
                      написал:<br>
                      <blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"> Коллеги, столкнулся с
                        тем что код такого вида , используемый для
                        поиска<br>
                        свободных ip v4 адресов на размерах 500-1000
                        элементов отрабатывается под 5<br>
                        секунд версия с map :<br>
                        <br>
                        my %ips = map { $_ => 1 } @ips;<br>
                        if (not exists($ips{$iponly} ))<br>
                        {<br>
                                 return $iponly;<br>
                        }<br>
                        <br>
                        <br>
                          и с grep(sic!) ~2 секунду :<br>
                        <br>
                        if ( ! ( grep {$iponly eq $_ } @ips ) )<br>
                        # spent 27.4ms making 814 calls to
                        NetAddr::IP::Lite::broadcast, avg<br>
                        34µs/call<br>
                        # spent 9.56ms making 814 calls to<br>
                        NetAddr::IP::Lite::__ANON__[Ne<wbr>tAddr/IP/Lite.pm:268],
                        avg 12µs/call<br>
                        {<br>
                             return $iponly;<br>
                        }<br>
                        <br>
                        Еще трабла в том что легендарный List::Util
                        отдает быстро но почему не тот<br>
                        же результат( пробовал first , none ) что и
                        grep?<br>
                        <br>
                        коллеги это нормально на более-менее среднем
                        сервачке ?<br>
                        <br>
                        <br>
                        --<br>
                        Moscow.pm mailing list<br>
                        <a href="mailto:moscow-pm@pm.org" target="_blank">moscow-pm@pm.org</a>
                        | <a href="http://moscow.pm.org" rel="noreferrer" target="_blank">http://moscow.pm.org</a><br>
                        <br>
                      </blockquote>
                    </blockquote>
                    <br>
                    -- <br>
                     <br>
                    -- <br>
                    Moscow.pm mailing list<br>
                    <a href="mailto:moscow-pm@pm.org" target="_blank">moscow-pm@pm.org</a>
                    | <a class="m_-599783468089407545moz-txt-link-freetext" href="http://moscow.pm.org" target="_blank">http://moscow.pm.org</a><br>
                  </div>
                </div>
              </blockquote>
            </div>
            <br>
          </div>
          <br>
          <fieldset class="m_-599783468089407545mimeAttachmentHeader"></fieldset>
          <br>
        </blockquote>
        <br>
        <pre class="m_-599783468089407545moz-signature" cols="72">-- 
 </pre>
        <br>
        <fieldset class="m_-599783468089407545mimeAttachmentHeader"></fieldset>
        <br>
      </blockquote>
      <p><br>
      </p>
      <br>
      <fieldset class="m_-599783468089407545mimeAttachmentHeader"></fieldset>
      <br>
    </blockquote>
    <br>
    </div></div><pre class="m_-599783468089407545moz-signature" cols="72">-- 
 </pre>
  </div>

<br>--<br>
Moscow.pm mailing list<br>
<a href="mailto:moscow-pm@pm.org">moscow-pm@pm.org</a> | <a href="http://moscow.pm.org" rel="noreferrer" target="_blank">http://moscow.pm.org</a><br>
<br></blockquote></div><br></div>