• R
    --format=pretty: avoid calculating expensive expansions twice · b9c62321
    René Scharfe 提交于
    As Jeff King remarked, format strings with duplicate placeholders can
    be slow to expand, because each instance is calculated anew.
    
    This patch makes use of the fact that format_commit_message() and its
    helper functions only ever add stuff to the end of the strbuf.  For
    certain expensive placeholders, store the offset and length of their
    expansion with the strbuf at the first occurrence.  Later they
    expansion result can simply be copied from there -- no malloc() or
    strdup() required.
    
    These certain placeholders are the abbreviated commit, tree and
    parent hashes, as the search for a unique abbreviated hash is quite
    costly.  Here are the times for next (best of three runs):
    
    $ time git log --pretty=format:%h >/dev/null
    
    real    0m0.611s
    user    0m0.404s
    sys     0m0.204s
    
    $ time git log --pretty=format:%h%h%h%h >/dev/null
    
    real    0m1.206s
    user    0m0.744s
    sys     0m0.452s
    
    And here those with this patch (and the previous two); the speedup
    of the single placeholder case is just noise:
    
    $ time git log --pretty=format:%h >/dev/null
    
    real    0m0.608s
    user    0m0.416s
    sys     0m0.192s
    
    $ time git log --pretty=format:%h%h%h%h >/dev/null
    
    real    0m0.639s
    user    0m0.488s
    sys     0m0.140s
    Signed-off-by: NRene Scharfe <rene.scharfe@lsrfire.ath.cx>
    Signed-off-by: NJunio C Hamano <gitster@pobox.com>
    b9c62321
pretty.c 19.6 KB