This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH v4] Improve performance of strstr


On 10/06/2019 18:57, Wilco Dijkstra wrote:
> Hi Szabolcs,
> 
>> i reviewed the patch.
> 
> Thanks! Here is the updated version, with comments improved. I'll
> make the corresponding changes to memmem too.
> 
> Wilco
> 
> v3: Remove some unused defines. Increase filter size to 8 bytes.
> v4: Improve comments after review.
> 
> 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).
> 
> OK for commit?
> 
> ChangeLog:
> 2019-06-10  Wilco Dijkstra  <wdijkstr@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.
> 

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

(i think you should wait a day in case there are
further comments on this latest version, otherwise
it's ready to commit.)

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]