Re: [PATCH] grep: do not do external grep on skip-worktree entries
From: Linus Torvalds <torvalds@linux-foundation.org>
Date: 2016-06-15 22:47:58
On Mon, 4 Jan 2010, Jeff King wrote:
I have to wonder, though...did anybody ever actually profile our internal grep to find out _why_ it was so much slower than GNU grep? Could we simply ship a better grep engine and obsolete external grep?
The internal grep is about 2.5 times slower than the external one for me.
That's a big deal:
- external grep:
[torvalds@nehalem linux]$ time git grep qwerty
...
real 0m0.412s
user 0m0.196s
sys 0m0.132s
- NO_EXTERNAL_GREP:
[torvalds@nehalem linux]$ time ~/git/git grep qwerty
...
real 0m1.006s
user 0m0.900s
sys 0m0.096s
so that's not even close.
And "perf record" followed by "perf report" on the internal one shows
that it's not even regexec() - we use strstr() for the trivial case:
43.63% git /home/torvalds/git/git [.] grep_buffer_1
25.19% git /lib64/libc-2.11.so [.] __strstr_sse42
9.16% git /home/torvalds/git/git [.] match_one_pattern
4.79% git /lib64/libc-2.11.so [.] __m128i_strloadu
bit it seems to be all that line-per-line crud. If we got rid of that one,
and could do the match as a _single_ regexec() instead (at least for the
trivial cases of just one grep expression), perhaps we'd be better off.
Linus