hiệu suất không quan trọng trong trường hợp này là "Devel :: NYTProf". Nhưng để trả lời câu hỏi của bạn:
nếu giá trị trong băm không tồn tại, "tồn tại" là rất nhanh
if(exists $ids{$name}){
$id = $ids{$name};
}
nhưng nếu nó tồn tại một tra cứu thứ hai được thực hiện. nếu giá trị là khả năng tồn tại vì làm cho chỉ có một cái nhìn lên sẽ nhanh hơn
$id = $ids{$name};
if($id){
#....
}
thấy điều này chuẩn Littel từ một danh sách gửi thư 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;
},
};
bằng cách sử dụng khóa ('xx') không tồn tại cho thấy 'tồn tại' là người chiến thắng.
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)
bằng cách sử dụng phím ('x') tồn tại cho thấy rằng 'is_smart' là người chiến thắng.
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)
Là 'tồn tại' rẻ hơn so với thực sự lấy giá trị? Sau khi tất cả, nó không phải làm theo một danh sách liên kết khi nó tìm thấy một vụ va chạm. – Frank
Trong trường hợp cụ thể này, mặc dù, khóa băm cho "$ name" sẽ * không * được tạo bởi tự động hóa. Chỉ cố gắng truy cập khóa ở cấp độ sâu hơn, như "$ id = $ ids {$ name} {else}" sẽ tạo khóa "$ name". – trendels
@trendels Đúng nhưng tôi cho rằng OP đã được đơn giản hóa quá mức. Tuy nhiên, tôi nên chỉ ra điều đó. –