• René Scharfe's avatar
    optimize compat/ memmem() · 56384e61
    René Scharfe authored
    When memmem() was imported from glibc 2.2 into compat/, an optimization
    was dropped in the process, in order to make the code smaller and simpler.
    It was OK because memmem() wasn't used in performance-critical code.  Now
    the situation has changed and we can benefit from this optimization.
    
    The trick is to avoid calling memcmp() if the first character of the needle
    already doesn't match.  Checking one character directly is much cheaper
    than the function call overhead.  We keep the first character of the needle
    in the variable named point and the rest in the one named tail.
    
    The following commands were run in a Linux kernel repository and timed, the
    best of five results is shown:
    
      $ STRING='Ensure that the real time constraints are schedulable.'
      $ git log -S"$STRING" HEAD -- kernel/sched.c >/dev/null
    
    On Windows Vista x64, before:
    
      real    0m8.470s
      user    0m0.000s
      sys     0m0.000s
    
    And after the patch:
    
      real    0m1.887s
      user    0m0.000s
      sys     0m0.000s
    Signed-off-by: default avatarRene Scharfe <rene.scharfe@lsrfire.ath.cx>
    Signed-off-by: default avatarJunio C Hamano <gitster@pobox.com>
    56384e61
memmem.c 752 Bytes