[SP-pm] Perturbado...

Blabos de Blebe blabos em gmail.com
Sábado Novembro 24 19:28:37 PST 2007


Estou aliviado, deve ser loucura da minha máquina.
Eu esperava resultado semelhantes aos seus mesmo.

De qualquer forma eu tava sem o que fazer mesmo e sei que
isso não vale pra medir nada. Só fiquei espantado com o
resultado bizarro da minha máquina, e por isso resolvi consultar
a lista.

Obrigado

P.S.: O programa é inútil assumido....... :)

On Nov 25, 2007 1:03 AM, breno <breno em rio.pm.org> wrote:
> Hmmm... aqui eu tive resultados diferentes para C (note, seu código é
> em C e não em C++) e Perl. Aproveitei então para testar algumas
> variações em ambos:
>
> -----------------8<----------------
> $ time ./loop.c.bin [usando for(), código igual ao seu]
>
> real    0m10.651s
> user    0m9.545s
> sys     0m0.104s
>
> [usando while(i++<2147483647); teve resultado na mesma ordem de grandeza]
>
> *******************************************
> $ time ./loop.pl [usando while(), código igual ao seu]
>
> real    0m51.960s
> user    0m47.555s
> sys     0m0.272s
>
> [for ($i=0;$i<2147483647; $i++) {} teve resultado na mesma ordem de grandeza]
>
> *******************************************
> $ time ./loop.2.pl [usando foreach (0..2147483647) {}]
>
> real    0m33.862s
> user    0m29.034s
> sys     0m0.176s
>
> [for (0..2147483647) {} teve resultado na mesma ordem de grandeza]
> -----------------8<----------------
>
> A evidente vantagem do código em C cai para aproximadamente 20
> segundos (ou 40, no pior caso). Sinceramente não sei o que pode ter
> acontecido em sua máquina, realmente é estranho e não faz o menor
> sentido. No caso geral (que imagino ser mais próximo dos meus
> resultados, ou será que o errado sou eu?!), o que acontece ao meu ver
> é que esse programa é extremamente inútil e Perl foi feito para
> programas úteis, e o overhead que vemos está relacionado às diferentes
> tarefas que o perl está fazendo por debaixo dos panos, como
> atribuições à variáveis de contexto e otimizações para facilitar a sua
> vida e que vc simplesmente não está aproveitando pq tudo o q o seu
> programa faz é incrementar um inteiro até o maior valor suportado por
> uma máquina com 32 bits.
>
> Esse tipo de overhead é o preço que vc paga por usar uma linguagem "Do
> What I Mean" (Perl) em vez de uma linguagem "Do As I Say" (C/C++), e
> francamente acho que saimos dessa troca com um baita lucro. O problema
> é que programas-placebo como esse sempre vão ser quase sempre mais
> rápidos em linguagens DAIS, pq o Perl (que é DWIM) vai perder tempo
> tentando entender o que diabos vc quer com isso :-P
>
> []s
>
> -b
>
>
>
> On Nov 24, 2007 9:38 PM, Blabos de Blebe <blabos em gmail.com> wrote:
> > Boa noite,
> >
> > Tava sem nada pra fazer, então fiquei alternando entre "O Livro" e um
> > livro de assembly x86.
> > Aí bateu aquela curiosidade mórbida de fazer algo tosco...
> >
> > resolvi fazer em assembly, Perl e C++ um programa idiota que entrasse
> > num loop grande,
> > e medir quem era mais rápido com o programa time, no linux.
> >
> > Eis os códigos fontes:
> >
> > Em Assembly
> > <code>
> > #PURPOSE: This program count from 0 to a big number
> > # only to make a benchmark
> >
> > #VARIABLES: the registers have the following uses
> > # %edi - Count variable.
> > # %ebx - The maximum number of iterations.
> >
> > .section .data
> >
> > max_numb:
> >     .long 2147483647
> >
> > .section .text
> >
> > .globl _start
> > _start:
> >
> > movl $0, %edi
> > movl max_numb , %ebx
> >
> > init_loop:
> >     incl %edi
> >     cmpl %edi, %ebx
> > jg init_loop
> >
> >
> >
> >
> > movl $0, %ebx
> > movl $1, %eax
> > int $0x80
> >
> > </code>
> >
> >
> > Em C++
> > <code>
> > int main( int argc , char** argv )
> > {
> >     for( long i = 0 ; i < 2147483647 ; i++ );;
> >     return 0;
> > }
> >
> > </code>
> >
> >
> > Em Perl
> > <code>
> > #!/usr/bin/perl
> >
> > my $i = 0;
> > while($i++ < 2147483647){}
> >
> > </code>
> >
> > Eu esperava que o programa em assembly fosse terminar primero que os
> > outros, e que
> > o loop em Perl fosse brigar com o C++ pelo segundo lugar, pois meus
> > testes tocos,
> > com outros códigos vinham caminhando nesse sentido. Por várias vezes,
> > Perl foi mais
> > rápida que C++, e em outras, um pouco mais lenta.
> >
> > Para minha surpresa não foi o que aconteceu. Eu repeti isso umas 3
> > vezes e o resultado
> > foi semelhante. Segue a saída do time:
> >
> > <code>
> > user em machine:~/docs/asm/code/cap-03$ time ./loop.pl
> >
> > real    9m21.105s
> > user    7m49.761s
> > sys     0m2.888s
> > user em machine:~/docs/asm/code/cap-03$ time ./loopc
> >
> > real    0m4.180s
> > user    0m3.984s
> > sys     0m0.040s
> > user em machine:~/docs/asm/code/cap-03$ time ./loop
> >
> > real    0m1.551s
> > user    0m1.484s
> > sys     0m0.004s
> > user em machine:~/docs/asm/code/cap-03$
> > </code>
> >
> > Putz, enquanto os programas em C++ e Assembly demoraram poucos segundos,
> > o programa em perl demorou quase 10 MINUTOS!!!!
> > Naturalmente cheguei a conclusão que fiz alguma cagada, ignorando algo
> > importante
> > que deve estar na documentação (a qual estou ainda lendo), mas não
> > descobri o que.
> > Estou levemente desconfiado que é algo bobo que eu deixei escapar, mas o que?
> >
> > Não to querendo levantar nenhuma questão sobre performance ou comparação de
> > linguagens, só achei curioso códigos tão parecidos executarem em tempos tão
> > diferentes, embora também, uma coisa não tenha nada a ver com a outra.
> >
> > Gostaria de saber a opinião de vcs a respeito
> >
> > Obrigado
> > _______________________________________________
> > SaoPaulo-pm mailing list
> > SaoPaulo-pm em pm.org
> > http://mail.pm.org/mailman/listinfo/saopaulo-pm
> >
> _______________________________________________
> SaoPaulo-pm mailing list
> SaoPaulo-pm em pm.org
> http://mail.pm.org/mailman/listinfo/saopaulo-pm
>


Mais detalhes sobre a lista de discussão SaoPaulo-pm