la performance n'est pas importante dans ce cas, voir "Devel :: NYTProf". Mais pour répondre à votre question:
si la valeur du hachage n'existe pas, « existe » est très rapide
if(exists $ids{$name}){
$id = $ids{$name};
}
mais si elle ne se fait existe une seconde recherche. si la valeur est susceptible de existe que de faire un seul regard en sera plus rapide
$id = $ids{$name};
if($id){
#....
}
voir cette référence littel à partir d'une liste de diffusion perl.
#!/usr/bin/perl -w
use strict;
use Benchmark qw(timethese);
use vars qw(%hash);
@hash{ 'A' .. 'Z', 'a' .. 'z' } = (1) x 52;
my $key = 'xx';
timethese 10000000, {
'defined' => sub {
if (defined $hash{$key}) { my $x = $hash{$key}; return $x; };
return 0;
},
'defined_smart' => sub {
my $x = $hash{$key};
if (defined $x) {
return $x;
};
return 0;
},
'exists' => sub {
if (exists $hash{$key}) { my $x = $hash{$key}; return $x; };
return 0;
},
'as is' => sub {
if ($hash{$key}) { my $x = $hash{$key}; return $x; };
return 0;
},
'as is_smart' => sub {
my $x = $hash{$key};
if ($x) { return $x; };
return 0;
},
};
en utilisant une clé ('xx') qui n'existe pas montre que 'exists' est le gagnant.
Benchmark: timing 10000000 iterations of as is, as is_smart, defined, defined_smart, exists...
as is: 1 wallclock secs (1.52 usr + 0.00 sys = 1.52 CPU) @ 6578947.37/s (n=10000000)
as is_smart: 3 wallclock secs (2.67 usr + 0.00 sys = 2.67 CPU) @ 3745318.35/s (n=10000000)
defined: 3 wallclock secs (1.53 usr + 0.00 sys = 1.53 CPU) @ 6535947.71/s (n=10000000)
defined_smart: 3 wallclock secs (2.17 usr + 0.00 sys = 2.17 CPU) @ 4608294.93/s (n=10000000)
exists: 1 wallclock secs (1.33 usr + 0.00 sys = 1.33 CPU) @ 7518796.99/s (n=10000000)
En utilisant une clé ('x') qui existe, montre que 'as_smart' est le gagnant.
Benchmark: timing 10000000 iterations of as is, as is_smart, defined, defined_smart, exists...
as is: 3 wallclock secs (2.76 usr + 0.00 sys = 2.76 CPU) @ 3623188.41/s (n=10000000)
as is_smart: 3 wallclock secs (1.81 usr + 0.00 sys = 1.81 CPU) @ 5524861.88/s (n=10000000)
defined: 3 wallclock secs (3.42 usr + 0.00 sys = 3.42 CPU) @ 2923976.61/s (n=10000000)
defined_smart: 2 wallclock secs (2.32 usr + 0.00 sys = 2.32 CPU) @ 4310344.83/s (n=10000000)
exists: 3 wallclock secs (2.83 usr + 0.00 sys = 2.83 CPU) @ 3533568.90/s (n=10000000)
Existe-t-il moins cher que de récupérer la valeur? Après tout, il n'a pas à suivre une liste liée lorsqu'il trouve une collision. – Frank
Dans ce cas particulier, cependant, la clé de hachage pour "$ name" ne serait * pas * créée par autovivification. Essayer seulement d'accéder à une clé imbriquée d'un niveau plus profond, comme "$ id = $ ids {$ nom} {autre}" créerait la clé "$ name". – trendels
@trendels Correct mais j'ai supposé que l'OP avait trop simplifié. Pourtant, j'aurais dû le signaler. –