Kaydet (Commit) 7efa3b82 authored tarafından Victor Stinner's avatar Victor Stinner

Close #13126: "Simplify" FASTSEARCH() code to help the compiler to emit more

efficient machine code. Patch written by Antoine Pitrou.

Without this change, str.find() was 10% slower than str.rfind() in the worst
case.
üst 4b7b0f06
...@@ -142,6 +142,8 @@ FASTSEARCH(const STRINGLIB_CHAR* s, Py_ssize_t n, ...@@ -142,6 +142,8 @@ FASTSEARCH(const STRINGLIB_CHAR* s, Py_ssize_t n,
mask = 0; mask = 0;
if (mode != FAST_RSEARCH) { if (mode != FAST_RSEARCH) {
const STRINGLIB_CHAR *ss = s + m - 1;
const STRINGLIB_CHAR *pp = p + m - 1;
/* create compressed boyer-moore delta 1 table */ /* create compressed boyer-moore delta 1 table */
...@@ -156,7 +158,7 @@ FASTSEARCH(const STRINGLIB_CHAR* s, Py_ssize_t n, ...@@ -156,7 +158,7 @@ FASTSEARCH(const STRINGLIB_CHAR* s, Py_ssize_t n,
for (i = 0; i <= w; i++) { for (i = 0; i <= w; i++) {
/* note: using mlast in the skip path slows things down on x86 */ /* note: using mlast in the skip path slows things down on x86 */
if (s[i+m-1] == p[m-1]) { if (ss[i] == pp[0]) {
/* candidate match */ /* candidate match */
for (j = 0; j < mlast; j++) for (j = 0; j < mlast; j++)
if (s[i+j] != p[j]) if (s[i+j] != p[j])
...@@ -172,13 +174,13 @@ FASTSEARCH(const STRINGLIB_CHAR* s, Py_ssize_t n, ...@@ -172,13 +174,13 @@ FASTSEARCH(const STRINGLIB_CHAR* s, Py_ssize_t n,
continue; continue;
} }
/* miss: check if next character is part of pattern */ /* miss: check if next character is part of pattern */
if (!STRINGLIB_BLOOM(mask, s[i+m])) if (!STRINGLIB_BLOOM(mask, ss[i+1]))
i = i + m; i = i + m;
else else
i = i + skip; i = i + skip;
} else { } else {
/* skip: check if next character is part of pattern */ /* skip: check if next character is part of pattern */
if (!STRINGLIB_BLOOM(mask, s[i+m])) if (!STRINGLIB_BLOOM(mask, ss[i+1]))
i = i + m; i = i + m;
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment