git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: Some git performance measurements..

From
Linus Torvalds <torvalds@linux-foundation.org>
Date
Nov 29, 2007, 04:32 UTC
Message-ID
<alpine.LFD.0.9999.0711282022470.8458@woody.linux-foundation.org>
In-Reply-To
<alpine.LFD.0.99999.0711282244190.9605@xanadu.home>
On Wed, 28 Nov 2007, Nicolas Pitre wrote:
> 
> Tree objects aren't all together.  Related blob objects are interlaced 
> with those tree objects.
Yeah, I noticed that a few minutes after saying this.
> But for a checkout that should actually correspond to a nice linear 
> access.

For the initial check-out, yes. But the thing I timed was just a plain "git checkout", which won't actually do any of the blobs if they already exist checked-out (which I obviously had), which explains the non-dense patterns.

The reason I care about "git checkout" (which is totally uninteresting in itself) is that it is a trivial use-case that fairly closely approximates two common cases that are *not* uninteresting: switching branches with most files unaffected and a fast-forward merge (both of which are the "two-way merge" special case).

I also suspect it is pretty close to a real three-way merge (again, with just a few files changed).

IOW, there's a lot of these "tree operations" that actually leave 99% of the tree totally unchanged, at least in the kernel. Even a fairly big merge tends to change just a few hundred files. And when there are 23,000 files in the tree, a few hundred files is a fairly small percentage!

So it's actually fairly common to have "git checkout"-like behaviour with no blobs needing to be updated, and the "initial checkout" is in fact likely a less usual case. I wonder if we should make the pack-file have all the object types in separate regions (we already do that for commits, since "git rev-list" kind of operations are dense in the commit).

Making the tree objects dense (the same way the commit objects are) might also conceivably speed up "git blame" and path history simplification, since those also tend to be "dense" in the tree history but don't actually look at the blobs themselves until they change.

		Linus
Previous: Nicolas PitreNext: Nicolas Pitre
Message 4 of 28 in “Some git performance measurements..”
  1. Linus TorvaldsNov 29, 2007
  2. Linus TorvaldsNov 29, 2007
  3. Nicolas PitreNov 29, 2007
  4. Linus TorvaldsNov 29, 2007
  5. Nicolas PitreNov 29, 2007
  6. Linus TorvaldsNov 29, 2007
  7. Nicolas PitreNov 29, 2007
  8. Junio C HamanoNov 30, 2007
  9. Linus TorvaldsNov 30, 2007
  10. Jakub NarebskiNov 30, 2007
  11. Linus TorvaldsNov 30, 2007
  12. Jakub NarebskiNov 30, 2007
  13. Nicolas PitreNov 30, 2007
  14. Steffen ProhaskaNov 30, 2007
  15. Mike RalphsonDec 7, 2007
  16. Johannes SchindelinDec 7, 2007
  17. Linus TorvaldsDec 7, 2007
  18. Mike RalphsonDec 7, 2007
  19. Johannes SchindelinDec 7, 2007
  20. Mike RalphsonDec 7, 2007
  21. Johannes SchindelinDec 8, 2007
  22. Brian DowningDec 8, 2007
  23. Linus TorvaldsNov 30, 2007
  24. Federico Mena QuinteroDec 5, 2007
  25. Joachim B HagaDec 1, 2007
  26. Linus TorvaldsDec 1, 2007
  27. Junio C HamanoNov 29, 2007
  28. per-directory-exclude: lazily read .gitignore filesJunio C Hamano, Nov 29, 2007

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.