[SP-pm] Perturbado...

Blabos de Blebe blabos em gmail.com
Sábado Novembro 24 15:38:24 PST 2007


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


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