<br><br><div class="gmail_quote">2010/10/20 Nilson Santos Figueiredo Jr. <span dir="ltr">&lt;<a href="mailto:acid06@gmail.com">acid06@gmail.com</a>&gt;</span></div><div class="gmail_quote"><span dir="ltr"></span>[...]<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">

<div class="im">
<br>
</div>Usar given/when é *MUITO* mais rápido do que usar uma dispatch table,<br>
por exemplo. E mesmo um lookup burro, ao invés de dispatch pra uma<br>
função anônima ainda é 3x mais lento.<br>
<br>
Exemplo de resultados de benchmark:<br>
<br>
              Rate dispatch   lookup   switch<br>
dispatch  121116/s       --     -77%     -92%<br>
lookup    524558/s     333%       --     -67%<br>
switch   1599278/s    1220%     205%       --<br></blockquote><div><br></div><div>Nilson,</div><div><br></div><div>Acho que a contundência da sua afirmação não condiz com a simplicidade do script que você apresentou.</div>

<div><br></div><div>Eu fiz algumas modificações no seu script para: 1) não declarar as tabelas de dispatch DENTRO da função a ser testada, apenas uma vez, do lado de fora, e 2) diferenciei lookup/dispatch em hash e em array.</div>

<div><br></div><div>Os resultados são bem diferentes:</div><div><br></div><div><div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">19:14:32 BRST az@blueturtle:~/tmp/perldev $ ./<a href="http://test-case.pl">test-case.pl</a> </font></div>

<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">                    Rate dispatch_hash switch dispatch_array lookup_hash lookup_array</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">dispatch_hash  1088180/s            --    -5%           -10%        -52%         -58%</font></div>

<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">switch         1147749/s            5%     --            -6%        -49%         -56%</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">dispatch_array 1215036/s           12%     6%             --        -46%         -53%</font></div>

<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">lookup_hash    2265153/s          108%    97%            86%          --         -13%</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">lookup_array   2591771/s          138%   126%           113%         14%           --</font></div>

</div></div><div><br></div><div>Código em:</div><div><meta http-equiv="content-type" content="text/html; charset=utf-8"><a href="http://pastebin.org/341050">http://pastebin.org/341050</a></div><div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">


Código segue abaixo (óbvio que o exemplo é simplista e se aumentar o<br>
númerp de cláusulas do switch vai ficando cada vez mais lento, mas<br>
ainda deve ser mais rápido pra muitos cases):<br></blockquote><div><br></div><div>No caso dos dispatches, você estava compilando código dinamicamente a cada chamada da função =&gt; claro que será mais lento. </div><div>No caso do lookup (em hash) você estava invocando uma função de hash 3 vezes para cada chamada da função de teste =&gt; claro que será mais lento.</div>

<div><br></div><div>Uma construção switch/case (aka given/when) irá se tornar, em qualquer binário que você usar, em uma sequência de saltos condicionais, até que enfim haja a execução do caso desejado, enquanto que uma tabela de lookup é sempre uma soma e mais a execução, constante.</div>

<div><br></div><div>Também usando switch/case, quando o número de casos é muito grande, pode haver um efeito colateral no desempenho: a ordem dos casos passa a ser significantiva na performance, pois nessa construção, o último caso só é testado após TODOS OS OUTROS serem testados.</div>

<div><br></div><div>Assim, lookup simples será sempre mais rápido, na média, que qualquer outro caso - tanto que é isso que se usa em kernel, por exemplo. No meu teste o dispatch baseado em array foi até mesmo mais rápido que o switch, que foi pouco mais rápido que o dispatch baseado em hash, mas vamos considerar que estejam &quot;tecnicamente empatados&quot; como gosta de afirmar o ibope. Nesse caso, abro mão da chatice otimizadora e reforço o e-mail do Eden: é por conta de legibilidade/extensibilidade.</div>

<div><br></div><div>A minha conclusão é: se há uma necessidade muito grande de performance, faça tabelas de lookup de valores baseadas em array. Se você quer ter um código extensível e legível, faça dispatch - use hash mesmo que fica mais fácil de ler ;-) switch? sei lá, só se no seu estilo de programar você fizer questão disso.</div>

<div><br></div><div>Some $0.02 * rand 3 cents</div><div><br></div><div>-- </div></div>Alexei Znamensky [russoz_gmail_com] [<a href="http://russoz.wordpress.com" target="_blank">russoz.wordpress.com</a>] [<a href="http://www.flickr.com/photos/alexeiz" target="_blank">www.flickr.com/photos/alexeiz</a>]<br>

<span style="font-family:arial, sans-serif;font-size:12.5px;border-collapse:collapse"><div>«Only love / <span style="font-size:12.5px">Can bring the rain / </span><span style="font-size:12.5px">That makes you yearn to the sky»</span></div>

</span><br>