[SP-pm] Duvida primaria

Nilson Santos Figueiredo Jr. acid06 at gmail.com
Wed Oct 20 11:50:12 PDT 2010


2010/10/20 Eden Cardim <edencardim at gmail.com>:
> Nunca, jamais use qualquer tipo de construção do tipo switch. Use
> lookup tables como sugerido pelo Marcio Ferreira.

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%       --

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):

#!/usr/bin/perl
use warnings;
use strict;
use feature 'switch';

use Benchmark qw/cmpthese/;

sub dispatch {
    my $var;
    my %table = (
        0 => sub { $var = "zero" },
        1 => sub { $var = "um"   },
        2 => sub { $var = "dois" }
    );
    $table{ int rand 3 }();
    return $var;
}

sub lookup {
    my $var;
    my %table = (
        0 => "zero",
        1 => "um",
        2 => "dois"
    );
    $var = $table{ int rand 3 };
    return $var;
}

sub switch {
    my $var;
    given ( int rand 3 ) {
        when ( 0 ) { $var = "zero" }
        when ( 1 ) { $var = "um"   }
        when ( 2 ) { $var = "dois" }
    }
    return $var;
}

cmpthese( -5, {
    lookup   => \&lookup,
    dispatch => \&dispatch,
    switch   => \&switch
} );

-Nilson


More information about the SaoPaulo-pm mailing list