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

Re: [PATCH 3/5] combine-diff: handle binary files as binary

From
Jeff King <peff@peff.net>
Date
May 30, 2011, 16:19 UTC
Message-ID
<20110530161927.GC24431@sigill.intra.peff.net>
In-Reply-To
<20110530143627.GC31490@sigill.intra.peff.net>
On Mon, May 30, 2011 at 10:36:27AM -0400, Jeff King wrote:
Show 8 quoted lines
>   1. Grab each blob, check binary-ness, and free. This double-loads in
>      the common, non-binary case.
> [...]
>
> I'll try to take a look at it this week and get some measurements on (1)
> versus (2) for both speed and peak memory usage. And then see if I can
> do better with (3), and implement the "peek" solution both here and in
> regular diff.

I was curious about this, so I stole a few minutes to do some preliminary benchmarks this morning.

The first thing to look at is the performance of the original code, that does not check binary-ness at all. It's going to represent the best we can do with any strategy. So I tried:

  git log -p --cc --merges origin/master

on git.git using both v1.7.5.3 and the jk/combine-diff-binary-etc branch. And it turns out that the extra loads really don't make a difference in practice. My best-of-5 for the two cases were:

  $ time git.v1.7.5.3 log -p --cc --merges origin/master >/dev/null
  real    0m59.518s
  user    0m58.672s
  sys     0m0.688s
  $ time git.jk.binary-combined-diff log -p --cc \
      --merges origin/master >/dev/null
  real    0m58.949s
  user    0m58.220s
  sys     0m0.572s

The new code actually came out slightly faster. One reason may be that there are 3 combined diffs of git-gui/lib/git-gui.ico that we avoid doing (and just say "Binary files differ"). That's not a lot, but it gives us a very tiny edge (though that edge is very close to the amount of noise between runs). Still, I think it implies that the extra loads in the common non-binary case are not actually measurable.

The peak memory use between the two should be the same (since we free each blob immediately), but I didn't measure it.

So I think in practice it's not a big deal. I'll still take a look at the "peek" optimization later this week, since that can make a difference in some corner cases. And as part of that, it will probably make sense to keep the buffers around for small-ish files, so we'll get the optimization I mentioned more or less for free. I'll also do the check for duplicated sha1s that you mentioned.

-Peff
Previous: Jeff KingNext: Junio C Hamano
Message 14 of 37 in “combined diff does not detect binary files and ignores -diff attribute”
  1. Jay SoffianMay 22, 2011
  2. Michael J GruberMay 23, 2011
  3. Jay SoffianMay 23, 2011
  4. Junio C HamanoMay 23, 2011
  5. Jeff KingMay 23, 2011
  6. Jeff KingMay 23, 2011
  7. 1/5 combine-diff: split header printing into its own functionJeff King, May 23, 2011
  8. 2/5 combine-diff: calculate mode_differs earlierJeff King, May 23, 2011
  9. 3/5 combine-diff: handle binary files as binaryJeff King, May 23, 2011
  10. Junio C HamanoMay 23, 2011
  11. Jeff KingMay 23, 2011
  12. Junio C HamanoMay 30, 2011
  13. Jeff KingMay 30, 2011
  14. Jeff KingMay 30, 2011
  15. Junio C HamanoMay 30, 2011
  16. Junio C HamanoMay 31, 2011
  17. 4/5 refactor get_textconv to not require diff_filespecJeff King, May 23, 2011
  18. 5/5 combine-diff: respect textconv attributesJeff King, May 23, 2011
  19. Junio C HamanoMay 23, 2011
  20. Jeff KingMay 23, 2011
  21. Junio C HamanoMay 24, 2011
  22. Jeff KingMay 24, 2011
  23. Jay SoffianMay 23, 2011
  24. Jay SoffianMay 23, 2011
  25. Jeff KingMay 23, 2011
  26. Jay SoffianMay 24, 2011
  27. Jeff KingMay 23, 2011
  28. Junio C HamanoMay 24, 2011
  29. Michael J GruberMay 24, 2011
  30. Junio C HamanoMay 24, 2011
  31. Michael J GruberMay 24, 2011
  32. Junio C HamanoMay 24, 2011
  33. Jay SoffianMay 24, 2011
  34. Jeff KingMay 24, 2011
  35. Michael J GruberMay 25, 2011
  36. Jeff KingMay 25, 2011
  37. Jay SoffianMay 24, 2011

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.