Unless I'm mistaken, both 'keys' and 'values' will make Perl gather up all the elements of each into temporary lists before even attempting to assign them. If %source is really huge, then that could be a problem?
If I thought memory use was a concern I'd walk the key values instead.
while (my($key, $value) = each %source) { $target{$key} = $value }
But I imagine Perl is pretty good at handling temporary lists, so I doubt looping through the keys would be as fast.
Update
... and just for fun
Update Again (used the wrong target in the benchmark)
cmpthese( -1, {
grandfather => sub {
my %t = %target;
@t{keys %source} = values %source;
},
sleepyjay => sub {
my %t = %target;
%t = ( %t, %source );
},
ruzam => sub {
my %t = %target;
while ( my($key, $value) = each %source) {
# $target{$key} = $value <-- oops!
$t{$key} = $value
}
},
});
__END__
Rate sleepyjay ruzam grandfather
sleepyjay 905/s -- -58% -61%
ruzam 2162/s 139% -- -8%
grandfather 2349/s 160% 9% --
|