• L
    [PATCH] Avoid building object ref lists when not needed · 8805ccac
    Linus Torvalds 提交于
    The object parsing code builds a generic "this object references that
    object" because doing a full connectivity check for fsck requires it.
    
    However, nothing else really needs it, and it's quite expensive for
    git-rev-list that can have tons of objects in flight.
    
    So, exactly like the commit buffer save thing, add a global flag to
    disable it, and use it in git-rev-list.
    
    Before:
    
    	$ /usr/bin/time git-rev-list --objects v2.6.12..HEAD | wc -l
    	12.28user 0.29system 0:12.57elapsed 99%CPU (0avgtext+0avgdata 0maxresident)k
    	0inputs+0outputs (0major+26718minor)pagefaults 0swaps
    	59124
    
    After this change:
    
    	$ /usr/bin/time git-rev-list --objects v2.6.12..HEAD | wc -l
    	10.33user 0.18system 0:10.54elapsed 99%CPU (0avgtext+0avgdata 0maxresident)k
    	0inputs+0outputs (0major+18509minor)pagefaults 0swaps
    	59124
    
    and note how the number of pages touched by git-rev-list for this
    particular object list has shrunk from 26,718 (104 MB) to 18,509 (72 MB).
    
    Calculating the total object difference between two git revisions is still
    clearly the most expensive git operation (both in memory and CPU time),
    but it's now less than 40% of what it used to be.
    Signed-off-by: NLinus Torvalds <torvalds@osdl.org>
    Signed-off-by: NJunio C Hamano <junkio@cox.net>
    8805ccac
rev-list.c 13.6 KB