[SP-pm] Perturbado...

breno breno em rio.pm.org
Sábado Novembro 24 19:03:20 PST 2007


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
>


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