<html>
<head>
<style><!--
.hmmessage P
{
margin:0px;
padding:0px
}
body.hmmessage
{
font-size: 10pt;
font-family:Tahoma
}
--></style></head>
<body class='hmmessage'><div dir='ltr'>
Lembrei de dois codigos agora bem interessantes:<br><br>C<br>#################################################<br>#include <stdio.h><br>#include <windows.h><br> typedef long long int64;<br> int main()
{
    int64 Frequency = 0;
    int64 CounterOne = 0;<br> int64 CounterTwo = 0;<br> int64 CounterTree = 0;
<br>    double CounterAverage = 0;
<br>

    int64 Current = 0;<br> int64 Previus = 0;<br> int64 Next = 0;
<br>

    int Count = 0;


    <br>QueryPerformanceFrequency(&Frequency);
<br>

    printf("Frequency: %lld\n", Frequency);
<br>

    QueryPerformanceCounter(&CounterOne);<br> QueryPerformanceCounter(&CounterTwo);<br> QueryPerformanceCounter(&CounterTree);


    <br>printf("CounterOne: %lld\n", CounterOne);
<br>    printf("CounterTwo: %lld\n", CounterTwo);
    <br>printf("CounterTree: %lld\n", CounterTree);


    <br>printf("Call Counter Interval: %lld\n", CounterOne - CounterTree);
    <br>printf("Miliseconds: %llf\n", ((double)CounterOne - (double)CounterTree) / ((double)Frequency / 1000.0f));<br> CounterAverage = ((double)CounterOne - (double)CounterTree) / 3.0f;
    printf("Counter Average: %llf\n", CounterAverage);
<br>

    printf("====================\n");
    <br>Current = 1;


    QueryPerformanceCounter(&CounterOne);
<br>

    while(!(Count == 100))
    {<br> Next = (Current + Previus);<br> Previus = Current;
        <br>Current = Next;
        <br>Count = Count + 1;<br> }


    <br>QueryPerformanceCounter(&CounterTwo);<br> printf("Result: %lld\n", Current);
    <br>printf("CounterOne: %lld\n", CounterOne);
<br>    printf("CounterTwo: %lld\n", CounterTwo);
<br>    printf("Counter Interval: %lld\n", CounterTwo - CounterOne);<br> printf("Miliseconds: %lld\n", (CounterTwo - CounterOne) / (Frequency / 1000));
<br>    printf("Final (Counter Interval - (Call Counter Average * 2)): %llf\n", (((double)CounterTwo - (double)CounterOne) - (CounterAverage * 2)));


    return(0);
}<br><pre class="bbcode_code" style="height:372px;">####################################################################################<br><br>Perl<br>################################################################################<br>#!/usr/bin/perl -w<br><br>use Win32::kernel32;<br>use strict;<br>use warnings<br><br><br>my $Frequency = 0;<br>my $CounterOne = 0;<br>my $CounterTwo = 0;<br>my $CounterTree = 0;<br><br><br>my $CounterAverage = 0.0;<br><br><br>my $Current = 0;<br>my $Previus = 0;<br>my $Next = 0;<br></pre><br>my $Count = 0;<br><br>$Frequency = Win32::QueryPerformanceFrequency();<br><br><br><br>print "Frequency: ", $Frequency, "\n";<br><br><br>$CounterOne = Win32::QueryPerformanceCounter();<br>$CounterTwo = Win32::QueryPerformanceCounter();<br>$CounterTree = Win32::QueryPerformanceCounter();<br><br><br>print "CounterOne: ", $CounterOne, "\n";<br>print "CounterTwo: ", $CounterTwo, "\n";<br>print "CounterTree: ", $CounterTree, "\n";<br><br><br>print "Call Counter Interval: ", $CounterTree - $CounterOne, "\n";<br>print "Miliseconds: ", ($CounterTree - $CounterOne) / ($Frequency / 1000), "\n";<br><br><br>$CounterAverage = ($CounterTree - $CounterOne) / 3;<br>print "Counter Average: ", $CounterAverage, "\n";<br><br><br>print "====================\n";<br>$Current = 1;<br><br><br>$CounterOne = Win32::QueryPerformanceCounter();<br><br><br>while(!($Count == 100))<br>{<br>    $Next = ($Current + $Previus);<br>    $Previus = $Current;<br>    $Current = $Next;<br>    $Count = $Count + 1;<br>}<br><br><br>$CounterTwo = Win32::QueryPerformanceCounter();<br><br><br>print("Result: ", $Current, "\n");<br>print("CounterOne: ", $CounterOne, "\n");<br>print("CounterTwo: ", $CounterTwo, "\n");<br>print("Counter Interval: ", $CounterTwo - $CounterOne, "\n");<br>print("Miliseconds: ", ($CounterTwo - $CounterOne) / ($Frequency / 1000), "\n");<br>print("Final (Counter Interval - (Call Counter Average * 2)): ", (($CounterTwo - $CounterOne) - ($CounterAverage * 2)), "\n");<br>#######################################################################################<br><br><br><br><br><br><div><div id="SkyDrivePlaceholder"></div><hr id="stopSpelling">From: creaktive@gmail.com<br>Date: Mon, 23 Apr 2012 18:31:45 -0300<br>To: rio-pm@pm.org<br>Subject: Re: [Rio-pm] benchmark (era: Perl em desuso??)<br><br>Aureliano, esse algoritmo, apesar de servir para listar números primos, quase não faz cálculo. Veja:<div><br><div><div style="text-align:left"><pre style="margin-bottom:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;font-family:'Bitstream Vera Sans Mono','Courier New',monospace;font-size:12px;line-height:1.4em">
<div class="ecxline" id="ecxLC7" style="margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:1em;line-height:1.4em">    <span class="ecxk" style="margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;line-height:1.4em;font-weight:bold">for</span> <span class="ecxk" style="margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;line-height:1.4em;font-weight:bold">my</span> <span class="ecxnv" style="margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;line-height:1.4em;color:rgb(0,128,128)">$i</span> <span class="p" style="margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;line-height:1.4em">(</span><span class="ecxmi" style="margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;line-height:1.4em;color:rgb(0,153,153)">2</span> <span class="ecxo" style="margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;line-height:1.4em;font-weight:bold">..</span> <span class="ecxnb" style="margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;line-height:1.4em;color:rgb(0,134,179)">sqrt</span><span class="p" style="margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;line-height:1.4em">(</span><span class="ecxnv" style="margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;line-height:1.4em;color:rgb(0,128,128)">$n</span><span class="p" style="margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;line-height:1.4em">))</span> <span class="p" style="margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;line-height:1.4em">{</span></div>

<div class="ecxline" id="ecxLC8" style="margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:1em;line-height:1.4em">        <span class="ecxk" style="margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;line-height:1.4em;font-weight:bold">if</span> <span class="p" style="margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;line-height:1.4em">(</span><span class="ecxnv" style="margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;line-height:1.4em;color:rgb(0,128,128)">$nums</span><span class="p" style="margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;line-height:1.4em">[</span><span class="ecxnv" style="margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;line-height:1.4em;color:rgb(0,128,128)">$i</span><span class="p" style="margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;line-height:1.4em">])</span> <span class="p" style="margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;line-height:1.4em">{</span></div>

<div class="ecxline" id="ecxLC9" style="margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:1em;line-height:1.4em">            <span class="ecxk" style="margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;line-height:1.4em;font-weight:bold">for</span> <span class="p" style="margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;line-height:1.4em">(</span><span class="ecxk" style="margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;line-height:1.4em;font-weight:bold">my</span> <span class="ecxnv" style="margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;line-height:1.4em;color:rgb(0,128,128)">$m</span> <span class="ecxo" style="margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;line-height:1.4em;font-weight:bold">=</span> <span class="ecxnv" style="margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;line-height:1.4em;color:rgb(0,128,128)">$i</span> <span class="ecxo" style="margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;line-height:1.4em;font-weight:bold">**</span> <span class="ecxmi" style="margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;line-height:1.4em;color:rgb(0,153,153)">2</span><span class="p" style="margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;line-height:1.4em">;</span> <span class="ecxnv" style="margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;line-height:1.4em;color:rgb(0,128,128)">$m</span> <span class="ecxo" style="margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;line-height:1.4em;font-weight:bold"><=</span> <span class="ecxnv" style="margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;line-height:1.4em;color:rgb(0,128,128)">$n</span><span class="p" style="margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;line-height:1.4em">;</span> <span class="ecxnv" style="margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;line-height:1.4em;color:rgb(0,128,128)">$m</span> <span class="ecxo" style="margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;line-height:1.4em;font-weight:bold">+=</span> <span class="ecxnv" style="margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;line-height:1.4em;color:rgb(0,128,128)">$i</span><span class="p" style="margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;line-height:1.4em">)</span> <span class="p" style="margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;line-height:1.4em">{</span></div>

<div class="ecxline" id="ecxLC10" style="margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:1em;line-height:1.4em">                <span class="ecxnv" style="margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;line-height:1.4em;color:rgb(0,128,128)">$nums</span><span class="p" style="margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;line-height:1.4em">[</span><span class="ecxnv" style="margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;line-height:1.4em;color:rgb(0,128,128)">$m</span><span class="p" style="margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;line-height:1.4em">]</span> <span class="ecxo" style="margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;line-height:1.4em;font-weight:bold">=</span> <span class="ecxmi" style="margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;line-height:1.4em;color:rgb(0,153,153)">0</span><span class="p" style="margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;line-height:1.4em">;</span></div>

<div class="ecxline" id="ecxLC11" style="margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:1em;line-height:1.4em">            <span class="p" style="margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;line-height:1.4em">}</span></div>

<div class="ecxline" id="ecxLC12" style="margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:1em;line-height:1.4em">        <span class="p" style="margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;line-height:1.4em">}</span></div>

<div class="ecxline" id="ecxLC13" style="margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:1em;line-height:1.4em">    <span class="p" style="margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;line-height:1.4em">}</span></div>

</pre></div><div><div><br></div><div>Para encontrar todos os primos de 0 a 100 milhões, a conta mais "pesada" será elevar um número ao quadrado menos de 10 mil vezes. Convenhamos, isso é irrisório. Já a atribuição de $nums[$m]... Vai acontecer 240 milhões de vezes!</div>

<div>Bom, acontece que, nas principais linguagens dinâmicas, o protótipo do array é lista. E lista não é muito boa para acesso por índice. A do Perl, por exemplo, fritaria uns 30 GB de RAM, pela minha estimativa. Dá para acoxambrar array de bits num scalar, mas aí passa pela outra abstração, e, apesar de ficar mais enxuto, fica bem mais lento.</div>

<div>Já em C (simplificando), protótipo de tudo é byte. Quer "marcar" alguma posição num array de bits? Fácil:</div><div><span style="color:rgb(153,153,153);font-family:'Bitstream Vera Sans Mono','Courier New',monospace;font-size:12px;font-weight:bold;line-height:16px;text-align:left;white-space:pre;background-color:rgb(255,255,255)"><br>

</span></div><div><span style="color:rgb(153,153,153);font-family:'Bitstream Vera Sans Mono','Courier New',monospace;font-size:12px;font-weight:bold;line-height:16px;text-align:left;white-space:pre;background-color:rgb(255,255,255)">#define SetBit(a, b) (((char *) a)[(b) >> 3] |= (1 << ((b) & 7)))</span></div>

<div><br>Essa nhaca compila em um código de máquina minúsculo que roda 240 milhões de vezes em frações de segundo.</div><div>Linguagens dinâmicas (geralmente) não podem acessar a memória diretamente, precisam das camadas de abstração (e isso é BOM).</div>

<div><br></div><div>ABS()<br><br>
<div class="ecxgmail_extra"><br><br><div class="ecxgmail_quote">On Mon, Apr 23, 2012 at 17:09, Aureliano Guedes <span dir="ltr"><<a href="mailto:guedes_1000@hotmail.com">guedes_1000@hotmail.com</a>></span> wrote:<br>

<blockquote class="ecxgmail_quote" style="border-left:1px #ccc solid;padding-left:1ex">


<div><div dir="ltr">
Lembrando que Python é uma linguagem com suporte nativo a operações matematicas melhor que Perl.<br>O desempenho para executar calculos provavelmente seja realmente maior, mas estava pensando, e outras operações como<br>

socket ou mesmo parsea um texto??<br>Sei que alguns vão responder: "mas o processador entende tudo como calculo", mas acho que a linguagem focar em determinado ponto<br>pode ser que dependendo da operação matematica (a nivel de processador) o desempenho da linguagem tambem mude.<br>

Um exemplo disso é comparar o laço for e o laço while, posso fazer um contador com os dois, mas eles trabalham de forma diferentes no processador.<br><br><div><div></div><hr>From: <a href="mailto:creaktive@gmail.com">creaktive@gmail.com</a><br>

Date: Mon, 23 Apr 2012 14:14:41 -0300<br>To: <a href="mailto:rio-pm@pm.org">rio-pm@pm.org</a><br>Subject: [Rio-pm] benchmark (era: Perl em desuso??)<div><div class="h5"><br><br><div>Coincidentemente, Junior Moraes (fvox) me mostrou benchmark de Perl VS Ruby utilizando o algoritmo do Crivo de Eratóstenes... Ele pegou um algoritmo mal-implementado em Ruby e traduziu para Perl (como parte do desafio), e, ainda assim, em Perl tinha ficado MUITO mais rápido.</div>



<div>Então usei como referência <a href="http://rosettacode.org/wiki/Sieve_of_Eratosthenes" target="_blank">http://rosettacode.org/wiki/Sieve_of_Eratosthenes</a>, e escolhi os as implementações mais parecidas entre si (e que não envolviam otimizações "hardcore"): <a href="https://gist.github.com/2413936" target="_blank">https://gist.github.com/2413936</a></div>



<div>Seguem os resultados:</div><div><br></div><div>C: 0.09user 0.00system 0:00.09elapsed 98%CPU (0avgtext+0avgdata 11872maxresident)k</div><div>Python: 3.63user 0.10system 0:03.77elapsed 99%CPU (0avgtext+0avgdata 1270288maxresident)k</div>



<div>Perl (usando array): 7.14user 0.44system 0:07.67elapsed 98%CPU (0avgtext+0avgdata 6092432maxresident)k</div><div>Perl (usando bit vector): 12.47user 0.02system 0:12.53elapsed 99%CPU (0avgtext+0avgdata 202496maxresident)k</div>



<div>Ruby: 13.25user 0.08system 0:13.44elapsed 99%CPU (0avgtext+0avgdata 1300304maxresident)k</div><div><br></div>ABS()<br>
<br></div></div>_______________________________________________
Rio-pm mailing list
<a href="mailto:Rio-pm@pm.org">Rio-pm@pm.org</a>
<a href="http://mail.pm.org/mailman/listinfo/rio-pm" target="_blank">http://mail.pm.org/mailman/listinfo/rio-pm</a></div>                                           </div></div>
<br>_______________________________________________<br>
Rio-pm mailing list<br>
<a href="mailto:Rio-pm@pm.org">Rio-pm@pm.org</a><br>
<a href="http://mail.pm.org/mailman/listinfo/rio-pm" target="_blank">http://mail.pm.org/mailman/listinfo/rio-pm</a><br></blockquote></div><br></div></div></div></div></div>
<br>_______________________________________________
Rio-pm mailing list
Rio-pm@pm.org
http://mail.pm.org/mailman/listinfo/rio-pm</div>                                    </div></body>
</html>