[Moscow.pm] String to Hash

Eugene Kaltashkin zhecka на gmail.com
Пн Фев 8 12:22:38 PST 2010


2010/2/8 Denis Evdokimov <evdokimov.denis на gmail.com>:
> Ещё вариант:
> my $str = "a=b,ccc=ddd,e=f,=zz,zzz=";
> my $re = qr/\G([^=]*)=([^,]*)(?:,|$)/;

Хм. интересно получается. SUBSTR всё равно быстрее.

for(my $i=0; $i<=10; $i++)
{
  $v .= "," if($v);
  $v .= "$i=$i";
}
my $re = qr/\G([^=]*)=([^,]*)(?:,|$)/o;

my $num =100000;
timethese($num, {
    HASHMAP => sub { %hash =  map { /(.*)\=(.*)/; $1 => $2 } split(/,/,$v); },
    HASHSUBSTR => sub { foreach (split /,/,$v) {
$hash{substr($_,0,index($_,"="))} = substr($_,rindex($_,"=")+1); } },
    HASHSUBSTRINDEX => sub { foreach (split /,/,$v) { $ind =
index($_,"="); $hash{substr($_,0,$ind)} = substr($_,$ind+1); } }
    HASHSPLIT => sub { foreach (split /,/,$v) { my ($u,$b) =
split(/=/,$_); $hash{$u}=$b; } },
    HASHSPLITARR => sub { foreach (split /,/,$v) { split(/=/);
$hash{@_[0]} = @_[1]; } },
    HASHSPLITCOMMA => sub { %hash = split /[=,]/, $v; },
    HASHDOUBLESPLIT => sub { %hash = map { split /\s*=\s*/, $_, 2 }
split /\s*,\s*/, $v; },
    HASHREGEXP => sub { %hash = $v =~ /$re/g; }
    });

HASHDOUBLESPLIT:  5 wallclock secs ( 5.43 usr +  0.00 sys =  5.43 CPU)
@ 18417.27/s (n=100000)
HASHMAP:  6 wallclock secs ( 5.34 usr +  0.00 sys =  5.34 CPU) @
18713.45/s (n=100000)
HASHREGEXP:  3 wallclock secs ( 3.17 usr +  0.00 sys =  3.17 CPU) @
31527.09/s (n=100000)
HASHSPLIT:  3 wallclock secs ( 2.95 usr +  0.00 sys =  2.95 CPU) @
33862.43/s (n=100000)
HASHSPLITARR:  2 wallclock secs ( 2.90 usr +  0.00 sys =  2.90 CPU) @
34501.35/s (n=100000)
HASHSPLITCOMMA:  2 wallclock secs ( 2.22 usr +  0.00 sys =  2.22 CPU)
@ 45070.42/s (n=100000)
HASHSUBSTRINDEX:  1 wallclock secs ( 2.22 usr +  0.00 sys =  2.22 CPU)
@ 45070.42/s (n=100000)
HASHSUBSTR:  2 wallclock secs ( 2.15 usr +  0.00 sys =  2.15 CPU) @
46545.45/s (n=100000)

Если количество элементов довести до 100
HASHDOUBLESPLIT:  5 wallclock secs ( 4.78 usr +  0.00 sys =  4.78 CPU)
@ 2091.50/s (n=10000)
HASHMAP:  5 wallclock secs ( 4.77 usr +  0.00 sys =  4.77 CPU) @
2098.36/s (n=10000)
HASHREGEXP:  3 wallclock secs ( 2.99 usr +  0.00 sys =  2.99 CPU) @
3342.04/s (n=10000)
HASHSPLIT:  2 wallclock secs ( 2.58 usr +  0.00 sys =  2.58 CPU) @
3878.79/s (n=10000)
HASHSPLITARR:  3 wallclock secs ( 2.55 usr +  0.00 sys =  2.55 CPU) @
3926.38/s (n=10000)
HASHSPLITCOMMA:  2 wallclock secs ( 2.03 usr +  0.00 sys =  2.03 CPU)
@ 4923.08/s (n=10000)
HASHSUBSTRINDEX:  2 wallclock secs ( 1.93 usr +  0.00 sys =  1.93 CPU)
@ 5182.19/s (n=10000)
HASHSUBSTR:  2 wallclock secs ( 1.84 usr +  0.00 sys =  1.84 CPU) @
5423.73/s (n=10000)

Еще у кого есть идеи по ускорению процедуры ? :)
-- 
Best Regards
ZHECKA-RIPN


Подробная информация о списке рассылки Moscow-pm