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

[PATCH 0/5] diff_filespec cleanups and optimizations

From
Jeff King <peff@peff.net>
Date
Jan 17, 2014, 01:18 UTC
Message-ID
<20140117011844.GA6870@sigill.intra.peff.net>

I recently came across a repository with a commit containing 100 million paths in its tree. Cleverly, the whole repo fits into a 1.5K packfile (can you guess how it was done?). Not so cleverly, running "diff-tree --root" on that commit uses a large amount of memory. :)

I do not think it is worth optimizing for such a pathological repository. But I was curious how much it would want (it OOM'd on my 64-bit 16G machine). The answer is roughly:

   100,000,000 * (
      8 bytes per pointer to diff_filepair in the diff_queue
    + 32 bytes per diff_filepair struct
    +  2 * (
         96 bytes per diff_filespec struct
       + 12 bytes per filename (in this case)
     )
  )

which is about 25G. Plus malloc overhead. So obviously this example is unreasonable. A more reasonable large case is something like WebKit at ~150K files, doing a diff against the empty tree. That's only 37M.

But while looking at it, I noticed a bunch of cleanups for diff_filespec. With the patches below, sizeof(struct diff_filespec) on my 64-bit machine goes from 96 bytes down to 80. Compiling with "-m32" goes from 64 bytes down to 52.

The first few patches have cleanup value aside from the struct size improvement. The last two are pure optimization. I doubt the optimization is noticeable for any real-life cases, so I don't mind if they get dropped. But they're quite trivial and obvious.

  [1/5]: diff_filespec: reorder dirty_submodule macro definitions
  [2/5]: diff_filespec: drop funcname_pattern_ident field
  [3/5]: diff_filespec: drop xfrm_flags field
  [4/5]: diff_filespec: reorder is_binary field
  [5/5]: diff_filespec: use only 2 bits for is_binary flag
-Peff
Next: Jeff King
Message 1 of 10 in “diff_filespec cleanups and optimizations”
  1. 0/5 diff_filespec cleanups and optimizationsJeff King, Jan 17, 2014
  2. 1/5 diff_filespec: reorder dirty_submodule macro definitionsJeff King, Jan 17, 2014
  3. Junio C HamanoJan 17, 2014
  4. Jeff KingJan 17, 2014
  5. Junio C HamanoJan 17, 2014
  6. 2/5 diff_filespec: drop funcname_pattern_ident fieldJeff King, Jan 17, 2014
  7. 3/5 diff_filespec: drop xfrm_flags fieldJeff King, Jan 17, 2014
  8. 4/5 diff_filespec: reorder is_binary fieldJeff King, Jan 17, 2014
  9. 5/5 diff_filespec: use only 2 bits for is_binary flagJeff King, Jan 17, 2014
  10. Junio C HamanoJan 17, 2014

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.