glibc/string
Wilco Dijkstra 5e0a7ecb66 Improve performance of strstr
This patch significantly improves performance of strstr using a novel
modified Horspool algorithm.  Needles up to size 256 use a bad-character
table indexed by hashed pairs of characters to quickly skip past mismatches.
Long needles use a self-adapting filtering step to avoid comparing the whole
needle repeatedly.

By limiting the needle length to 256, the shift table only requires 8 bits
per entry, lowering preprocessing overhead and minimizing cache effects.
This limit also implies worst-case performance is linear.

Small needles up to size 3 use a dedicated linear search.  Very long needles
use the Two-Way algorithm.

The performance gain using the improved bench-strstr on Cortex-A72 is 5.8
times basic_strstr and 3.7 times twoway_strstr.

Tested against GLIBC testsuite, randomized tests and the GNULIB strstr test
(https://git.savannah.gnu.org/cgit/gnulib.git/tree/tests/test-strstr.c).

Reviewed-by: Szabolcs Nagy <szabolcs.nagy@arm.com>

	* string/str-two-way.h (two_way_short_needle): Add inline to avoid
	warning.
	(two_way_long_needle): Block inlining.
	* string/strstr.c (strstr2): Add new function.
	(strstr3): Likewise.
	(STRSTR): Completely rewrite strstr to improve performance.
2019-06-12 11:38:52 +01:00
..
bits Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
_strerror.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
argz-addsep.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
argz-append.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
argz-count.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
argz-create.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
argz-ctsep.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
argz-delete.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
argz-extract.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
argz-insert.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
argz-next.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
argz-replace.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
argz-stringify.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
argz.h Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
basename.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
bcopy.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
bug-envz1.c Update string tests to use the support test driver. 2017-03-23 11:32:29 -03:00
bug-strcoll1.c Update. 2001-04-26 20:45:18 +00:00
bug-strcoll2.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
bug-strncat1.c Fix string/bug-strncat1.c build with GCC 8. 2017-11-14 17:50:36 +00:00
bug-strpbrk1.c Fix bug-strspn1.c, bug-strpbrk1.c build with GCC mainline. 2018-06-20 22:18:22 +00:00
bug-strspn1.c Fix bug-strspn1.c, bug-strpbrk1.c build with GCC mainline. 2018-06-20 22:18:22 +00:00
bug-strtok1.c Update string tests to use the support test driver. 2017-03-23 11:32:29 -03:00
byteswap.h Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
bzero.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
Depend Update. 2001-03-19 21:40:15 +00:00
endian.h Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
envz.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
envz.h Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
explicit_bzero.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
ffs.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
ffsll.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
inl-tester.c Update. 1997-09-11 12:09:10 +00:00
Makefile Only build libm with -fno-math-errno (bug 24024) 2019-01-07 14:59:07 +01:00
memccpy.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
memchr.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
memcmp.c Add some spaces before '('. 2019-02-27 13:55:45 +00:00
memcpy.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
memfrob.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
memmem.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
memmove.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
memory.h Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
mempcpy.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
memrchr.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
memset.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
noinl-tester.c Update. 1997-09-16 00:42:43 +00:00
rawmemchr.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
stpcpy.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
stpncpy.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
str-two-way.h Improve performance of strstr 2019-06-12 11:38:52 +01:00
stratcliff.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
strcasecmp_l.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
strcasecmp.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
strcasestr.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
strcat.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
strchr.c Break more lines before not after operators. 2019-02-25 13:19:19 +00:00
strchrnul.c Break more lines before not after operators. 2019-02-25 13:19:19 +00:00
strcmp.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
strcoll_l.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
strcoll.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
strcpy.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
strcspn.c Break some lines before not after operators. 2019-02-22 01:32:36 +00:00
strdup.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
strerror_l.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
strerror.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
strfry.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
string-inlines.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
string.h Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
strings.h Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
strlen.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
strncase_l.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
strncase.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
strncat.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
strncmp.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
strncpy.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
strndup.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
strnlen.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
strpbrk.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
strrchr.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
strsep.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
strsignal.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
strspn.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
strstr.c Improve performance of strstr 2019-06-12 11:38:52 +01:00
strtok_r.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
strtok.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
strverscmp.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
strxfrm_l.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
strxfrm.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
swab.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
test-bcopy.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
test-bzero.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
test-endian-file-scope.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
test-endian-sign-conversion.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
test-endian-types.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
test-explicit_bzero.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
test-ffs.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
test-memccpy.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
test-memchr.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
test-memcmp.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
test-memcpy.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
test-memmem.c Break some lines before not after operators. 2019-02-22 01:32:36 +00:00
test-memmove.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
test-mempcpy.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
test-memrchr.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
test-memset.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
test-rawmemchr.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
test-stpcpy.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
test-stpncpy.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
test-strcasecmp.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
test-strcasestr.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
test-strcat.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
test-strchr.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
test-strchrnul.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
test-strcmp.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
test-strcpy.c Add some spaces before '('. 2019-02-27 13:55:45 +00:00
test-strcspn.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
test-strerror-errno.c Only build libm with -fno-math-errno (bug 24024) 2019-01-07 14:59:07 +01:00
test-string.h Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
test-strlen.c Add some spaces before '('. 2019-02-27 13:55:45 +00:00
test-strncasecmp.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
test-strncat.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
test-strncmp.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
test-strncpy.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
test-strnlen.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
test-strpbrk.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
test-strrchr.c Add some spaces before '('. 2019-02-27 13:55:45 +00:00
test-strspn.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
test-strstr.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
testcopy.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
tester.c Add some spaces before '('. 2019-02-27 13:55:45 +00:00
tst-bswap.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
tst-cmp.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
tst-endian.c Update string tests to use the support test driver. 2017-03-23 11:32:29 -03:00
tst-inlcall.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
tst-strcoll-overflow.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
tst-strfry.c Update string tests to use the support test driver. 2017-03-23 11:32:29 -03:00
tst-strlen.c Update string tests to use the support test driver. 2017-03-23 11:32:29 -03:00
tst-strtok_r.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
tst-strtok.c Update string tests to use the support test driver. 2017-03-23 11:32:29 -03:00
tst-strxfrm2.c Update string tests to use the support test driver. 2017-03-23 11:32:29 -03:00
tst-strxfrm.c Update string tests to use the support test driver. 2017-03-23 11:32:29 -03:00
tst-svc2.c Update string tests to use the support test driver. 2017-03-23 11:32:29 -03:00
tst-svc.c Update string tests to use the support test driver. 2017-03-23 11:32:29 -03:00
tst-svc.expect * string/strverscmp.c (__strverscmp): Fix last cleanups. 2009-04-07 06:51:59 +00:00
tst-svc.input * string/strverscmp.c (__strverscmp): Fix last cleanups. 2009-04-07 06:51:59 +00:00
tst-xbzero-opt.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
Versions New string function explicit_bzero (from OpenBSD). 2016-12-16 16:21:54 -05:00
wordcopy.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00
xpg-strerror.c Update copyright dates with scripts/update-copyrights. 2019-01-01 00:11:28 +00:00