Re: Performance issue of 'git branch'
- From
Linus Torvalds <torvalds@linux-foundation.org>
- Date
- Jul 25, 2009, 18:04 UTC
- Message-ID
- <alpine.LFD.2.01.0907251046140.3960@localhost.localdomain>
- In-Reply-To
- <20090725004122.GA28477@Pilar.aei.mpg.de>
On Sat, 25 Jul 2009, Carlos R. Mafra wrote:
Show 7 quoted lines
> > Ok, so I killed /usr/sbin/preload and did the tests again. The > results were much more stable, with average 0.40 vs 0.79 > (NO_CURL=1 being faster). The pagefaults were pretty stable too, > (40major+654minor vs 12major+401minor). > > I will use NO_CURL=1 from now on!
I actually find it interesting that this whole NO_CURL issue is actually a lot more noticeable for me in the hot-cache case than all the other 'git branch' issues were.
I went back to a version a few days ago (before all the optimizations), and on my machine with a hot cache I get (for my kernel repo - I don't use branches there, but I have an old 'akpm' branch for taking a emailed patch series from Andrew):
[torvalds@nehalem linux]$ time ~/git/git branch akpm * master
real 0m0.005s user 0m0.004s sys 0m0.000s
so it's five milliseconds. Big deal, fast enough, right?
Ok, so fast-forward to today, with the optimizations to builtin-branch.c:
[torvalds@nehalem linux]$ time ~/git/git branch akpm * master
real 0m0.004s user 0m0.000s sys 0m0.004s
Woot! I shaved a millisecond off it by avoiding all those page faults and object lookups. Good, but hey, all that unnecessary lookup was just a 25% cost.
So let's build it with NO_CURL:
[torvalds@nehalem linux]$ time ~/git/git branch akpm * master
real 0m0.002s user 0m0.000s sys 0m0.000s
Heh. The whole NO_CURL=1 thing is actually a _bigger_ optimization than anything else I did to git-branch. Cost of curl: 100%.
The difference in number of system calls and page faults is really quite staggering. System calls: 397->184, page faults: 619->293. Just from not doing that curl loading. No wonder performance actually doubles.
Now, I admit that 5ms vs 2ms probably doesn't really matter much, but dang, performance was a primary goal in git, so I'm a bit upset at how bad curl screwed us. Plus those things do add up when scripting things, and those 300+ page faults are basically true for _all_ git programs.
So it's not just 'git branch': doing 'git show' shows the exact same thing: 6ms -> 4ms, 448->235 system calls, and 1549->1176 page faults.
So curl really must die. It may not matter for the expensive operations, but a lot of scripting is about running all those "cheap" things that just add up over time.
Linus