Skip to content
  • Jeff King's avatar
    diff: cache textconv output · d9bae1a1
    Jeff King authored and Junio C Hamano's avatar Junio C Hamano committed
    
    
    Running a textconv filter can take a long time. It's
    particularly bad for a large file which needs to be spooled
    to disk, but even for small files, the fork+exec overhead
    can add up for something like "git log -p".
    
    This patch uses the notes-cache mechanism to keep a fast
    cache of textconv output. Caches are stored in
    refs/notes/textconv/$x, where $x is the userdiff driver
    defined in gitattributes.
    
    Caching is enabled only if diff.$x.cachetextconv is true.
    
    In my test repo, on a commit with 45 jpg and avi files
    changed and a textconv to show their exif tags:
    
      [before]
      $ time git show >/dev/null
      real    0m13.724s
      user    0m12.057s
      sys     0m1.624s
    
      [after, first run]
      $ git config diff.mfo.cachetextconv true
      $ time git show >/dev/null
      real    0m14.252s
      user    0m12.197s
      sys     0m1.800s
    
      [after, subsequent runs]
      $ time git show >/dev/null
      real    0m0.352s
      user    0m0.148s
      sys     0m0.200s
    
    So for a slight (3.8%) cost on the first run, we achieve an
    almost 40x speed up on subsequent runs.
    
    Signed-off-by: default avatarJeff King <peff@peff.net>
    Signed-off-by: default avatarJunio C Hamano <gitster@pobox.com>
    d9bae1a1