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% --
In reply to Re: Merge hash into another hash
by ruzam
in thread Merge hash into another hash
by GrandFather
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |