Eric Wong <normalper...@yhbt.net> 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 <normalper...@yhbt.net>
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 <normalper...@yhbt.net>
---
 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 majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to