On Mon, Jan 11, 2010 at 07:59:18AM -0800, Linus Torvalds wrote:
The meh news: this shows how grep is faster than regexec() due to being a
smarter algorithm. For the non-fixed case (I used "qwerty.*as"), the
numbers are
- built-in:
real 0m0.548s
user 0m0.384s
sys 0m0.152s
- external:
real 0m0.415s
user 0m0.176s
sys 0m0.160s
so it really is just 'strstr()' that is faster. But This is a 'meh',
because I don't really care, and the new code is still way faster than the
old one. And I'd be personally willing to just drop the external grep if
this is the worst problem.
Just for fun, I repeated my pcre tests on what's in pu (which has
Junio's lookahead patch now). Before they didn't show any improvement
because we wasted all of our time in non-regex code. There is some
improvement in just using pcre, but I didn't get any improvement by
tweaking it:
[pu]
$ time git grep 'qwerty.*as' >/dev/null
real 0m1.007s
user 0m0.752s
sys 0m0.252s
[pu + pcre]
$ time git grep --no-ext-grep 'qwerty.*as' >/dev/null
real 0m0.864s
user 0m0.648s
sys 0m0.212s
[pu + pcre_study]
$ time git grep --no-ext-grep 'qwerty.*as' >/dev/null
real 0m0.866s
user 0m0.628s
sys 0m0.200s
[pu + pcre_dfa_exec]
$ time git grep --no-ext-grep 'qwerty.*as' >/dev/null
real 0m0.868s
user 0m0.608s
sys 0m0.256s
So pcre seems to buy us about 15%, and tweaking it gets lost in the
noise (or I am tweaking it badly, which is entirely possible). I doubt
it's worth the trouble of supporting pcre for that much.
And let me add an additional vote against strstr:
$ time git grep --no-ext-grep qwerty >/dev/null
real 0m3.285s
user 0m3.032s
sys 0m0.252s
-Peff