Eric Wong <normalperson@xxxxxxxx> wrote: > Hin-Tak (Cc-ed) reported good improvements with them, but also > a large memory increase: This might reduce the pathname and internal hash overheads: ------------------------8<----------------------- From: Eric Wong <normalperson@xxxxxxxx> Date: Sun, 19 Oct 2014 02:26:53 +0000 Subject: [PATCH] git-svn: simplify cached_mergeinfo layout This reduces hash lookups for looking up cache data and will simplify tying data to disk in the next commit. Signed-off-by: Eric Wong <normalperson@xxxxxxxx> --- perl/Git/SVN.pm | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/perl/Git/SVN.pm b/perl/Git/SVN.pm index b1a84d0..25dbcd5 100644 --- a/perl/Git/SVN.pm +++ b/perl/Git/SVN.pm @@ -1708,15 +1708,17 @@ sub mergeinfo_changes { my %minfo = map {split ":", $_ } split "\n", $mergeinfo_prop; my $old_minfo = {}; + # layout: $path => [ $rev, \%mergeinfo ] + my $cached_mergeinfo = $self->{cached_mergeinfo}; + # Initialize cache on the first call. - unless (defined $self->{cached_mergeinfo_rev}) { - $self->{cached_mergeinfo_rev} = {}; - $self->{cached_mergeinfo} = {}; + unless (defined $cached_mergeinfo) { + $cached_mergeinfo = $self->{cached_mergeinfo} = {}; } - my $cached_rev = $self->{cached_mergeinfo_rev}{$old_path}; - if (defined $cached_rev && $cached_rev == $old_rev) { - $old_minfo = $self->{cached_mergeinfo}{$old_path}; + my $cached = $cached_mergeinfo->{$old_path}; + if (defined $cached && $cached->[0] == $old_rev) { + $old_minfo = $cached->[1]; } else { my $ra = $self->ra; # Give up if $old_path isn't in the repo. @@ -1733,13 +1735,11 @@ sub mergeinfo_changes { $props->{"svn:mergeinfo"}; $old_minfo = \%omi; } - $self->{cached_mergeinfo}{$old_path} = $old_minfo; - $self->{cached_mergeinfo_rev}{$old_path} = $old_rev; + $cached_mergeinfo->{$old_path} = [ $old_rev, $old_minfo ]; } # Cache the new mergeinfo. - $self->{cached_mergeinfo}{$path} = \%minfo; - $self->{cached_mergeinfo_rev}{$path} = $rev; + $cached_mergeinfo->{$path} = [ $rev, \%minfo ]; my %changes = (); foreach my $p (keys %minfo) { -- EW -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html