[SP-pm] Duvida primaria
russoz at gmail.com
russoz at gmail.com
Wed Oct 20 14:36:42 PDT 2010
2010/10/20 Nilson Santos Figueiredo Jr. <acid06 em gmail.com>
[...]
>
> Usar given/when é *MUITO* mais rápido do que usar uma dispatch table,
> por exemplo. E mesmo um lookup burro, ao invés de dispatch pra uma
> função anônima ainda é 3x mais lento.
>
> Exemplo de resultados de benchmark:
>
> Rate dispatch lookup switch
> dispatch 121116/s -- -77% -92%
> lookup 524558/s 333% -- -67%
> switch 1599278/s 1220% 205% --
>
Nilson,
Acho que a contundência da sua afirmação não condiz com a simplicidade do
script que você apresentou.
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.
Os resultados são bem diferentes:
19:14:32 BRST az em blueturtle:~/tmp/perldev $ ./test-case.pl
Rate dispatch_hash switch dispatch_array lookup_hash
lookup_array
dispatch_hash 1088180/s -- -5% -10% -52%
-58%
switch 1147749/s 5% -- -6% -49%
-56%
dispatch_array 1215036/s 12% 6% -- -46%
-53%
lookup_hash 2265153/s 108% 97% 86% --
-13%
lookup_array 2591771/s 138% 126% 113% 14%
--
Código em:
http://pastebin.org/341050
Código segue abaixo (óbvio que o exemplo é simplista e se aumentar o
> númerp de cláusulas do switch vai ficando cada vez mais lento, mas
> ainda deve ser mais rápido pra muitos cases):
>
No caso dos dispatches, você estava compilando código dinamicamente a cada
chamada da função => claro que será mais lento.
No caso do lookup (em hash) você estava invocando uma função de hash 3 vezes
para cada chamada da função de teste => claro que será mais lento.
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.
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.
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 "tecnicamente empatados" 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.
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.
Some $0.02 * rand 3 cents
--
Alexei Znamensky [russoz_gmail_com] [russoz.wordpress.com] [
www.flickr.com/photos/alexeiz]
«Only love / Can bring the rain / That makes you yearn to the sky»
-------------- Pr�xima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://mail.pm.org/pipermail/saopaulo-pm/attachments/20101020/cfa72201/attachment-0001.html>
More information about the SaoPaulo-pm
mailing list