• S
    Avoid accessing a slow working copy during diffcore operations. · 1510fea7
    Shawn O. Pearce 提交于
    The Cygwin folks have done a fine job at creating a POSIX layer
    on Windows That Just Works(tm).  However it comes with a penalty;
    accessing files in the working tree by way of stat/open/mmap can
    be slower for diffcore than inflating the data from a blob which
    is stored in a packfile.
    
    This performance problem is especially an issue in merge-recursive
    when dealing with nearly 7000 added files, as we are loading
    each file's content from the working directory to perform rename
    detection.  I have literally seen (and sadly watched) paint dry in
    less time than it takes for merge-recursive to finish such a merge.
    On the other hand this very same merge runs very fast on Solaris.
    
    If Git is compiled with NO_FAST_WORKING_DIRECTORY set then we will
    avoid looking at the working directory when the blob in question
    is available within a packfile and the caller doesn't need the data
    unpacked into a temporary file.
    
    We don't use loose objects as they have the same open/mmap/close
    costs as the working directory file access, but have the additional
    CPU overhead of needing to inflate the content before use.  So it
    is still faster to use the working tree file over the loose object.
    
    If the caller needs the file data unpacked into a temporary file
    its likely because they are going to call an external diff program,
    passing the file as a parameter.  In this case reusing the working
    tree file will be faster as we don't need to inflate the data and
    write it out to a temporary file.
    
    The NO_FAST_WORKING_DIRECTORY feature is enabled by default on
    Cygwin, as that is the platform which currently appears to benefit
    the most from this option.
    Signed-off-by: NShawn O. Pearce <spearce@spearce.org>
    Signed-off-by: NJunio C Hamano <junkio@cox.net>
    1510fea7
diff.c 69.4 KB