pollita Tue Dec 2 20:31:57 2003 EDT Modified files: /php-src/ext/standard string.c Log: Optimize strrpos/strripos for single char strings and fix offset to report correctly Index: php-src/ext/standard/string.c diff -u php-src/ext/standard/string.c:1.403 php-src/ext/standard/string.c:1.404 --- php-src/ext/standard/string.c:1.403 Tue Dec 2 20:11:36 2003 +++ php-src/ext/standard/string.c Tue Dec 2 20:31:56 2003 @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: string.c,v 1.403 2003/12/03 01:11:36 pollita Exp $ */ +/* $Id: string.c,v 1.404 2003/12/03 01:31:56 pollita Exp $ */ /* Synced with php 3.0 revision 1.193 1999-06-16 [ssb] */ @@ -1606,9 +1606,20 @@ } } + if (needle_len == 1) { + /* Single character search can shortcut memcmps */ + while (e >= p) { + if (*e == *needle) { + RETURN_LONG(e - p + (offset > 0 ? offset : 0)); + } + e--; + } + RETURN_FALSE; + } + while (e >= p) { if (memcmp(e, needle, needle_len) == 0) { - RETURN_LONG(e - p); + RETURN_LONG(e - p + (offset > 0 ? offset : 0)); } e--; } @@ -1646,6 +1657,27 @@ RETURN_FALSE; } + if (needle_len == 1) { + /* Single character search can shortcut memcmps + Can also avoid tolower emallocs */ + if (offset >= 0) { + p = haystack + offset; + e = haystack + haystack_len - 1; + } else { + p = haystack; + e = haystack + haystack_len - offset; + } + /* Borrow that ord_needle buffer to avoid repeatedly tolower()ing needle */ + *ord_needle = tolower(*needle); + while (e >= p) { + if (tolower(*e) == *ord_needle) { + RETURN_LONG(e - p + (offset > 0 ? offset : 0)); + } + e--; + } + RETURN_FALSE; + } + needle_dup = estrndup(needle, needle_len); php_strtolower(needle_dup, needle_len); haystack_dup = estrndup(haystack, haystack_len); @@ -1667,7 +1699,7 @@ if (memcmp(e, needle_dup, needle_len) == 0) { efree(haystack_dup); efree(needle_dup); - RETURN_LONG(e - p); + RETURN_LONG(e - p + (offset > 0 ? offset : 0)); } e--; }
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php