From: Junio C Hamano Date: Tue, 13 Aug 2013 21:10:47 GMT Subject: Re: [PATCH 3/3] contacts: reduce git-blame invocations Message-ID: <7veh9xwb3c.fsf@alter.siamese.dyndns.org> In-Reply-To: <1376084396-53617-4-git-send-email-sunshine@sunshineco.com> Eric Sunshine writes: > git-contacts invokes git-blame once for each patch hunk it encounters. > No attempt is made to consolidate invocations for multiple hunks > referencing the same file at the same revision. This can become > expensive quickly. > > Reduce the number of git-blame invocations by taking advantage of the > ability to specify multiple -L ranges for a single invocation. > > Without this patch, on a randomly chosen range of commits: > > % time git-contacts 25fba78d36be6297^..23c339c0f262aad2 >/dev/null > real 0m6.142s > user 0m5.429s > sys 0m0.356s > > With this patch: > > % time git-contacts 25fba78d36be6297^..23c339c0f262aad2 >/dev/null > real 0m2.285s > user 0m2.093s > sys 0m0.165s > > Signed-off-by: Eric Sunshine Nice. Will queue. > --- > contrib/contacts/git-contacts | 11 +++++------ > 1 file changed, 5 insertions(+), 6 deletions(-) > > diff --git a/contrib/contacts/git-contacts b/contrib/contacts/git-contacts > index b4d3526..fb6429b 100755 > --- a/contrib/contacts/git-contacts > +++ b/contrib/contacts/git-contacts > @@ -59,9 +59,11 @@ sub import_commits { > } > > sub get_blame { > - my ($commits, $source, $start, $len, $from) = @_; > + my ($commits, $source, $from, $ranges) = @_; > + return unless @$ranges; > open my $f, '-|', > - qw(git blame --porcelain -C), '-L', "$start,+$len", > + qw(git blame --porcelain -C), > + map({"-L$_->[0],+$_->[1]"} @$ranges), > '--since', $since, "$from^", '--', $source or die; > while (<$f>) { > if (/^([0-9a-f]{40}) \d+ \d+ \d+$/) { > @@ -78,10 +80,7 @@ sub blame_sources { > my ($sources, $commits) = @_; > for my $s (keys %$sources) { > for my $id (keys %{$sources->{$s}}) { > - for my $range (@{$sources->{$s}{$id}}) { > - get_blame($commits, $s, > - $range->[0], $range->[1], $id); > - } > + get_blame($commits, $s, $id, $sources->{$s}{$id}); > } > } > }