[SP-pm] downloader survey

Stanislaw Pusep creaktive at gmail.com
Thu Oct 20 14:33:24 PDT 2011


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

cmpthese(5 => {
    'LWP::UserAgent' => sub {
        my $cv = AE::cv;
        my $ua = LWP::UserAgent->new;
        for my $url (@urls) {
            $cv->begin;
            fork_call {
                $ua->get($url);
            } sub {
                $cv->end;
            };
        }
        $cv->wait;
    },
    'LWP::UserAgent (keep_alive/simple_request)' => sub {
        my $cv = AE::cv;
        my $ua = LWP::UserAgent->new(keep_alive => $parallel);
        for my $url (@urls) {
            $cv->begin;
            fork_call {
                $ua->simple_request(HTTP::Request->new(GET => $url));
            } sub {
                $cv->end;
            };
        }
        $cv->wait;
    },
});

Aliás, testei as melhorias sugeridas para o LWP:

                                           s/iter LWP::UserAgent
LWP::UserAgent (keep_alive/simple_request)
LWP::UserAgent                               19.3             --
                           -4%
LWP::UserAgent (keep_alive/simple_request)   18.5             4%
                            --

O que são 4% perto dos 200_000% de diferença com o wget?

ABS()



2011/10/20 Eden Cardim <edencardim em gmail.com>

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


More information about the SaoPaulo-pm mailing list