mirror of
https://sourceware.org/git/glibc.git
synced 2024-12-05 07:33:38 +08:00
d3496c9f4f
Improve strcspn performance using a much faster algorithm. It is kept simple so it works well on most targets. It is generally at least 10 times faster than the existing implementation on bench-strcspn on a few AArch64 implementations, and for some tests 100 times as fast (repeatedly calling strchr on a small string is extremely slow...). In fact the string/bits/string2.h inlines make no longer sense, as GCC already uses strlen if reject is an empty string, strchrnul is 5 times as fast as __strcspn_c1, while __strcspn_c2 and __strcspn_c3 are slower than the strcspn main loop for large strings (though reject length 2-4 could be special cased in the future to gain even more performance). Tested on x86_64, i686, and aarch64. * string/Version (libc): Add GLIBC_2.24. * string/strcspn.c (strcspn): Rewrite function. * string/bits/string2.h (strcspn): Use __builtin_strcspn. (__strcspn_c1): Remove inline function. (__strcspn_c2): Likewise. (__strcspn_c3): Likewise. * string/string-inline.c [SHLIB_COMPAT(libc, GLIBC_2_1_1, GLIBC_2_24)] (__strcspn_c1): Add compatibility symbol. [SHLIB_COMPAT(libc, GLIBC_2_1_1, GLIBC_2_24)] (__strcspn_c2): Likewise. [SHLIB_COMPAT(libc, GLIBC_2_1_1, GLIBC_2_24)] (__strcspn_c3): Likewise. * sysdeps/i386/string-inlines.c: Include generic string-inlines.c.
86 lines
1.8 KiB
Plaintext
86 lines
1.8 KiB
Plaintext
libc {
|
|
GLIBC_2.0 {
|
|
# functions with required interface outside normal name space
|
|
__argz_count; __argz_stringify; __argz_next;
|
|
|
|
# functions used in inline functions or macros
|
|
__bzero; __strtok_r;
|
|
|
|
# functions used in other libraries
|
|
__ffs; __mempcpy; __stpncpy; __stpcpy; __strcasecmp; __strdup;
|
|
__strerror_r;
|
|
|
|
# a*
|
|
argz_add; argz_add_sep; argz_append; argz_count; argz_create;
|
|
argz_create_sep; argz_delete; argz_extract; argz_insert; argz_next;
|
|
argz_replace; argz_stringify;
|
|
|
|
# b*
|
|
basename; bcmp; bcopy; bzero;
|
|
|
|
# e*
|
|
envz_add; envz_entry; envz_get; envz_merge; envz_remove;
|
|
envz_strip;
|
|
|
|
# f*
|
|
ffs;
|
|
|
|
# i*
|
|
index;
|
|
|
|
# m*
|
|
memccpy; memchr; memcmp; memcpy; memfrob; memmem; memmove; memset;
|
|
|
|
# r*
|
|
rindex;
|
|
|
|
# s*
|
|
stpcpy; stpncpy; strcasecmp; strcat; strchr; strcmp; strcoll; strcpy;
|
|
strcspn; strdup; strerror; strerror_r; strfry; strlen; strncasecmp;
|
|
strncat; strncmp; strncpy; strndup; strnlen; strpbrk; strrchr; strsep;
|
|
strsignal; strspn; strstr; strtok; strtok_r; strxfrm; swab;
|
|
}
|
|
GLIBC_2.1 {
|
|
# functions used in macros and other libraries
|
|
__rawmemchr; __strcasestr;
|
|
|
|
# f*
|
|
ffsl; ffsll;
|
|
|
|
# m*
|
|
mempcpy;
|
|
|
|
# r*
|
|
rawmemchr;
|
|
|
|
# s*
|
|
strcasestr; strverscmp;
|
|
}
|
|
GLIBC_2.1.1 {
|
|
# extern inline functions used by <bits/string2.h>
|
|
__mempcpy_small; __stpcpy_small; __strcspn_c1; __strcspn_c2; __strcspn_c3;
|
|
__strcpy_small; __strspn_c1; __strspn_c2; __strspn_c3; __strpbrk_c2;
|
|
__strpbrk_c3; __strsep_1c; __strsep_2c; __strsep_3c; __strsep_g;
|
|
__strtok_r_1c;
|
|
|
|
# s*
|
|
strchrnul; __strverscmp;
|
|
}
|
|
GLIBC_2.2 {
|
|
# functions used in macros.
|
|
__strndup;
|
|
|
|
# m*
|
|
memrchr;
|
|
}
|
|
GLIBC_2.3.4 {
|
|
# x*
|
|
__xpg_strerror_r;
|
|
}
|
|
GLIBC_2.6 {
|
|
strerror_l;
|
|
}
|
|
GLIBC_2.24 {
|
|
}
|
|
}
|