<div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">Isso depende do processo externo e de como você está forkando. Se você<br>
deixar pra modificar absolutamente o mínimo de dados dentro do processo<br>
forkado, acho bem difícil que um processo completamente novo ocupe menos<br>
memória, já que você se beneficia do copy-on-write.<br></blockquote><div><br></div><div>Código para testar lftp:</div><div><a href="https://metacpan.org/source/SYP/AnyEvent-Net-Curl-Queued-0.009/eg/benchmark.pl#L63">https://metacpan.org/source/SYP/AnyEvent-Net-Curl-Queued-0.009/eg/benchmark.pl#L63</a></div>

<div><br></div><div>Código para testar LWP::UserAgent:</div><div><a href="https://metacpan.org/source/SYP/AnyEvent-Net-Curl-Queued-0.009/eg/benchmark.pl#L122">https://metacpan.org/source/SYP/AnyEvent-Net-Curl-Queued-0.009/eg/benchmark.pl#L122</a></div>

<div><br></div><div>Resultado: lftp é 232% mais rápido, "desprezando o atrito".</div><div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
    Stanislaw> E, para mim, como programador Perl, é deveras frustrante<br>
    Stanislaw> delegar os downloads ao lftp (<a href="http://lftp.yar.ru/" target="_blank">http://lftp.yar.ru/</a><br>
    Stanislaw> )... Afinal, o que o lftp tem de tão bom que eu não possa<br>
    Stanislaw> fazer em Perl?! ;) Então, implementei o<br>
    Stanislaw> AnyEvent::Net::Curl::Queued, que é capaz de gerenciar<br>
    Stanislaw> filas bem grandes de downloads, de forma assíncrona. Mas<br>
    Stanislaw> será que compensa usá-lo ao invés do lftp? Para isso,<br>
    Stanislaw> comecei fazendo benchmarks.  Agradeço a todos pelas<br>
    Stanislaw> sugestões! Seguem as minhas observações:<br>
<br>
    Stanislaw>  1. Eden, você está certo, os "filhotes" do LWP tem uma inicialização muito lenta; e o mais curioso é que<br>
    Stanislaw>     boa parte da inicialização não está no new() propriamente dito, mas é feita durante o primeiro request<br>
    Stanislaw>     (). Então, para ser justo, dividi a minha fila de downloads em 10 filas separadas, e aloquei um fork()<br>
    Stanislaw>     para cada uma;<br>
<br>
Se você fizer um "warm-up" antes de forkar, talvez tenha mais benefício.<br></blockquote><div><br></div><div>Fiz; continua "pesado".</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">


    Stanislaw>  4. wget tem o menor overhead de todas as alternativas por ser ridiculamente simples. Quase não tem<br>
    Stanislaw>     dependências, por isso a sua inicialização é quase<br>
    Stanislaw>     que instantânea;<br>
<br>
Mas ainda duvido que supere um processo com uma boa implementação<br>
forkante.<br></blockquote><div><br></div><div>Supera LWP::Curl forkante, sendo 1151% mais rápido.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
    Stanislaw>  5. AnyEvent::HTTP é a melhor alternativa para acessar uma quantidade limitada de URLs *em paralelo*.<br>
    Stanislaw>     Porém, para listas razoavelmente grandes, gerenciamento via callbacks e closures é meio tenebroso...<br>
    Stanislaw>  6. Reiterando: o *MEU* interesse se restringe a pegar meio milhão de URLs e baixar de forma mais<br>
    Stanislaw>     eficiente possível (isso é, o gargalo deve ser minha bandwidth, não minha CPU/RAM). Nesse caso, pouco<br>
    Stanislaw>     me importa a possibilidade de fazer parsing de headers, gerenciar cookies ou processamento de HTML.<br>
    Stanislaw>     Isso é, quando eu quiser, devo poder habilitar tudo isso; mas o default deve ser OFF. Portanto, o meu<br>
    Stanislaw>     "Holy Grail" seria um libwget, que gerencia filas, extrai links e faz downloads recursivos :)<br>
<br>
Mas e se o download precisar de auth, sessão via cookie, proxy, ou<br>
qualquer uma das outras bizarrices do HTTP? Se você coletar casos de uso<br>
típicos, pode implementar um handler otimizado pra cada caso,<br>
introspectar os requisitos do download e fazer um lazy-loading da<br>
implementação correta, isso tudo antes de forkar.</blockquote><div><br></div><div>libcurl FTW :)</div><div><br></div><div><a href="http://curl.haxx.se/libcurl/c/curl_easy_setopt.html">http://curl.haxx.se/libcurl/c/curl_easy_setopt.html</a></div>

<div><a href="https://metacpan.org/module/AnyEvent::Net::Curl::Queued::Easy#setopt-OPTION-VALUE-OPTION-VALUE-">https://metacpan.org/module/AnyEvent::Net::Curl::Queued::Easy#setopt-OPTION-VALUE-OPTION-VALUE-</a></div><div>

<br></div><div>Não é tão obscenamente leve quanto wget, mas permite que as coisas simples continuem simples, e as difíceis sejam possíveis ;)</div></div>