Calma, eu não chutaria cachorro morto, até por que devo muito ao LWP :)<div>Cada teste individual opera em uma lista razoável de URLs (~1500).</div><div>Fiz todos os testes aproximadamente dessa maneira:</div><div><br></div>

<div><div><font class="Apple-style-span" face="'courier new', monospace" size="1">cmpthese(5 => {</font></div><div><font class="Apple-style-span" face="'courier new', monospace" size="1">    'LWP::UserAgent' => sub {</font></div>

<div><font class="Apple-style-span" face="'courier new', monospace" size="1">        my $cv = AE::cv;</font></div><div><font class="Apple-style-span" face="'courier new', monospace" size="1">        my $ua = LWP::UserAgent->new;</font></div>

<div><font class="Apple-style-span" face="'courier new', monospace" size="1">        for my $url (@urls) {</font></div><div><font class="Apple-style-span" face="'courier new', monospace" size="1">            $cv->begin;</font></div>

<div><font class="Apple-style-span" face="'courier new', monospace" size="1">            fork_call {</font></div><div><font class="Apple-style-span" face="'courier new', monospace" size="1">                $ua->get($url);</font></div>

<div><font class="Apple-style-span" face="'courier new', monospace" size="1">            } sub {</font></div><div><font class="Apple-style-span" face="'courier new', monospace" size="1">                $cv->end;</font></div>

<div><font class="Apple-style-span" face="'courier new', monospace" size="1">            };</font></div><div><font class="Apple-style-span" face="'courier new', monospace" size="1">        }</font></div><div>

<font class="Apple-style-span" face="'courier new', monospace" size="1">        $cv->wait;</font></div><div><font class="Apple-style-span" face="'courier new', monospace" size="1">    },</font></div><div>

<font class="Apple-style-span" face="'courier new', monospace" size="1">    'LWP::UserAgent (keep_alive/simple_request)' => sub {</font></div><div><font class="Apple-style-span" face="'courier new', monospace" size="1">        my $cv = AE::cv;</font></div>

<div><font class="Apple-style-span" face="'courier new', monospace" size="1">        my $ua = LWP::UserAgent->new(keep_alive => $parallel);</font></div><div><font class="Apple-style-span" face="'courier new', monospace" size="1">        for my $url (@urls) {</font></div>

<div><font class="Apple-style-span" face="'courier new', monospace" size="1">            $cv->begin;</font></div><div><font class="Apple-style-span" face="'courier new', monospace" size="1">            fork_call {</font></div>

<div><font class="Apple-style-span" face="'courier new', monospace" size="1">                $ua->simple_request(HTTP::Request->new(GET => $url));</font></div><div><font class="Apple-style-span" face="'courier new', monospace" size="1">            } sub {</font></div>

<div><font class="Apple-style-span" face="'courier new', monospace" size="1">                $cv->end;</font></div><div><font class="Apple-style-span" face="'courier new', monospace" size="1">            };</font></div>

<div><font class="Apple-style-span" face="'courier new', monospace" size="1">        }</font></div><div><font class="Apple-style-span" face="'courier new', monospace" size="1">        $cv->wait;</font></div>

<div><font class="Apple-style-span" face="'courier new', monospace" size="1">    },</font></div><div><font class="Apple-style-span" face="'courier new', monospace" size="1">});</font></div><div><br></div>
<div>
Aliás, testei as melhorias sugeridas para o LWP:</div><div><br></div><div><font class="Apple-style-span" face="'courier new', monospace" size="1">                                           s/iter LWP::UserAgent LWP::UserAgent (keep_alive/simple_request)</font></div>

<div><font class="Apple-style-span" face="'courier new', monospace" size="1">LWP::UserAgent                               19.3             --                                        -4%</font></div><div><font class="Apple-style-span" face="'courier new', monospace" size="1">LWP::UserAgent (keep_alive/simple_request)   18.5             4%                                         --</font></div>

<div><br></div><div>O que são 4% perto dos 200_000% de diferença com o wget?</div><div><br></div>ABS()<br><br>
<br><br><div class="gmail_quote">2011/10/20 Eden Cardim <span dir="ltr"><<a href="mailto:edencardim@gmail.com">edencardim@gmail.com</a>></span><br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">

>>>>> "Stanislaw" == Stanislaw Pusep <<a href="mailto:creaktive@gmail.com">creaktive@gmail.com</a>> writes:<br>
<br>
    Stanislaw> OK, aqui vai o spoiler: estou fazendo benchmark (de<br>
    Stanislaw> overhead) de todos os HTTP agents que conheço. E o LWP<br>
    Stanislaw> está *MUITO* feio na fita:<br>
    Stanislaw> <a href="https://metacpan.org/module/AnyEvent::Net::Curl::Queued#OVERHEAD" target="_blank">https://metacpan.org/module/AnyEvent::Net::Curl::Queued#OVERHEAD</a><br>
<br>
Não me surpreende que o LWP seja bem ruim num benchmark vs um módulo<br>
escrito especificamente pra esse caso de uso, já que ele é um módulo<br>
projetado para robustez genérica, mas ainda acho que seria mais justo o<br>
benchmark considerar os casos ótimos no mundo real de todos os módulos<br>
analisados.<br>
<br>
Por exemplo, todos os módulos estão sendo instanciados dentro do<br>
benchmark, o que na minha opinião desvirtua o teste já que é bem comum<br>
certos módulos sacrificarem inicialização para obter desempenho<br>
subsequente. O tempo de inicialização está sendo contabilizado junto com<br>
a requisição, no mundo real, a otimização que se faria nesse caso teria<br>
apenas uma instância pra todas as requisições, e essa instância se<br>
propagaria pros forks evitando o overhead.<br>
<br>
Falando especificamente do LWP, usar<br>
$ua->simple_request(HTTP::Request->new(GET => $url)) deve melhorar<br>
bastante o desempenho. Observa que eu estou sugerindo que se crie uma<br>
instância de requisição a cada iteração já que no mundo real, raramente<br>
vai se fazer download do mesmo recurso, logo, você precisa de uma<br>
instância nova da requisição, mas não do user agent. Outra coisa, o<br>
default do LWP é não usar keep-alive, se você ligar o keep-alive, deve<br>
melhorar bastante também.<br>
<font color="#888888"><br>
--<br>
Eden Cardim<br>
Software Engineer<br>
<a href="http://bit.ly/edencardim" target="_blank">http://bit.ly/edencardim</a><br>
<a href="http://twitter.com/#!/edenc" target="_blank">http://twitter.com/#!/edenc</a><br>
<a href="tel:%2B55%2073%209986-3963" value="+557399863963">+55 73 9986-3963</a><br>
</font><div><div></div><div class="h5">=begin disclaimer<br>
   Sao Paulo Perl Mongers: <a href="http://sao-paulo.pm.org/" target="_blank">http://sao-paulo.pm.org/</a><br>
 SaoPaulo-pm mailing list: <a href="mailto:SaoPaulo-pm@pm.org">SaoPaulo-pm@pm.org</a><br>
 L<<a href="http://mail.pm.org/mailman/listinfo/saopaulo-pm" target="_blank">http://mail.pm.org/mailman/listinfo/saopaulo-pm</a>><br>
=end disclaimer<br>
</div></div></blockquote></div><br></div>