optimize compat/ memmem()
commit56384e61ead8d41c39bfafb535eedcf67ef4fcc3
authorRené Scharfe <rene.scharfe@lsrfire.ath.cx>
Mon, 2 Mar 2009 23:19:30 +0000 (3 00:19 +0100)
committerJunio C Hamano <gitster@pobox.com>
Tue, 3 Mar 2009 02:28:06 +0000 (2 18:28 -0800)
treee3aab3049a0fb58821be2a9adba740bb74fb89b9
parentce163c793d2058056ccc57563c350fd6415397ca
optimize compat/ memmem()

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: Rene Scharfe <rene.scharfe@lsrfire.ath.cx>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
compat/memmem.c