diff options
author | Norihiro Tanaka <noritnk@kcn.ne.jp> | 2014-04-03 22:57:09 +0900 |
---|---|---|
committer | Paul Eggert <eggert@cs.ucla.edu> | 2014-04-22 23:55:18 -0700 |
commit | 73893ffbada36599fb6ec2eb489b6a7decf0c248 (patch) | |
tree | 4068f355f96cc74d955ed75e2a4e436853ddad93 /src | |
parent | c7ea5aea911b950b2398454ca89cce23cabd3a40 (diff) | |
download | grep-73893ffbada36599fb6ec2eb489b6a7decf0c248.tar.gz |
grep: speed-up by using memchr() in Boyer-Moore searching
memchr() of glibc is faster than seeking by delta1 on some platforms.
When there is no chance to match for a while, use it on them.
* src/kwset.c (bmexec): Use memchr() in Boyer-Moore searching.
Diffstat (limited to 'src')
-rw-r--r-- | src/kwset.c | 23 |
1 files changed, 21 insertions, 2 deletions
diff --git a/src/kwset.c b/src/kwset.c index 69b0a55e..78fb0b21 100644 --- a/src/kwset.c +++ b/src/kwset.c @@ -582,8 +582,27 @@ bmexec (kwset_t kwset, char const *text, size_t size) d = d1[U(tp[-1])], tp += d; if (d == 0) goto found; - d = d1[U(tp[-1])], tp += d; - d = d1[U(tp[-1])], tp += d; + /* memchar() of glibc is faster than seeking by delta1 on + some platforms. When there is no chance to match for a + while, use it on them. */ +#if defined(__GLIBC__) && (defined(__i386__) || defined(__x86_64__)) + if (!trans) + { + tp = memchr (tp - 1, gc1, size + text - tp + 1); + if (tp) + { + ++tp; + goto found; + } + else + return -1; + } + else +#endif + { + d = d1[U(tp[-1])], tp += d; + d = d1[U(tp[-1])], tp += d; + } } break; found: |