Serhiy Storchaka added the comment:

Proposed patch makes the degenerate case less hard while preserves the 
optimization for common case.

$ ./python -m timeit -s 's = "АБВГД"*10**5' -- 's.find("є")'
1000 loops, best of 3: 330 usec per loop
$ ./python -m timeit -s 's = "АБВГД"*10**5' -- 's.rfind("є")'
1000 loops, best of 3: 325 usec per loop
$ ./python -m timeit -s 's = "АБВГД"*10**5' -- 's.find("Є")'
100 loops, best of 3: 7.81 msec per loop
$ ./python -m timeit -s 's = "АБВГД"*10**5' -- 's.rfind("Є")'
100 loops, best of 3: 8.5 msec per loop

$ ./python -m timeit -s 's = "АБВГД"*10**5' -- 's.find("є")'
1000 loops, best of 3: 317 usec per loop
$ ./python -m timeit -s 's = "АБВГД"*10**5' -- 's.rfind("є")'
1000 loops, best of 3: 327 usec per loop
$ ./python -m timeit -s 's = "АБВГД"*10**5' -- 's.find("Є")'
1000 loops, best of 3: 1.1 msec per loop
$ ./python -m timeit -s 's = "АБВГД"*10**5' -- 's.rfind("Є")'
1000 loops, best of 3: 964 usec per loop

The slowdown is decreased from 25 times to 3 times.

The idea is that after memchr found false positive, make a tens iterations of 
simple loop before calling memchr again. This splits the cost of the memchr 
call with a tens of characters.

The patch also makes a little refactoring. STRINGLIB(fastsearch_memchr_1char) 
now is renamed and split on two functions STRINGLIB(find_char) and 
STRINGLIB(rfind_char) with simpler interface. All preconditional checks are 
moved into these functions. These functions now are directly used in other 
files.

----------
keywords: +patch
resolution: remind -> 
stage: needs patch -> patch review
Added file: http://bugs.python.org/file41035/find_char.patch

_______________________________________
Python tracker <rep...@bugs.python.org>
<http://bugs.python.org/issue24821>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to