1
0
mirror of https://github.com/php/php-src.git synced 2026-03-24 00:02:20 +01:00

Optimize strcspn (#12594)

This commit is contained in:
Niels Dossche
2023-11-04 13:54:30 +00:00
committed by GitHub
parent bbe1222956
commit 9a973a3743
7 changed files with 205 additions and 210 deletions

View File

@@ -48,6 +48,8 @@ PHP 8.4 UPGRADE NOTES
. round() now validates the value of the $mode parameter and throws a ValueError
for invalid modes. Previously invalid modes would have been interpreted as
PHP_ROUND_HALF_UP.
. strcspn() with empty $characters now returns the length of the string instead
of incorrectly stopping at the first NUL character. See GH-12592.
- XML:
. The xml_set_*_handler() functions now declare and check for an effective

View File

@@ -1596,8 +1596,7 @@ PHPAPI char *php_stristr(char *s, char *t, size_t s_len, size_t t_len)
}
/* }}} */
/* {{{ php_strspn */
PHPAPI size_t php_strspn(const char *haystack, const char *characters, const char *haystack_end, const char *characters_end)
static size_t php_strspn_strcspn_common(const char *haystack, const char *characters, const char *haystack_end, const char *characters_end, bool must_match)
{
/* Fast path for short strings.
* The table lookup cannot be faster in this case because we not only have to compare, but also build the table.
@@ -1605,7 +1604,7 @@ PHPAPI size_t php_strspn(const char *haystack, const char *characters, const cha
* Empirically tested that the table lookup approach is only beneficial if characters is longer than 1 character. */
if (characters_end - characters == 1) {
const char *ptr = haystack;
while (ptr < haystack_end && *ptr == *characters) {
while (ptr < haystack_end && (*ptr == *characters) == must_match) {
ptr++;
}
return ptr - haystack;
@@ -1626,30 +1625,24 @@ PHPAPI size_t php_strspn(const char *haystack, const char *characters, const cha
}
const char *ptr = haystack;
while (ptr < haystack_end && table[(unsigned char) *ptr]) {
while (ptr < haystack_end && table[(unsigned char) *ptr] == must_match) {
ptr++;
}
return ptr - haystack;
}
/* {{{ php_strspn */
PHPAPI size_t php_strspn(const char *haystack, const char *characters, const char *haystack_end, const char *characters_end)
{
return php_strspn_strcspn_common(haystack, characters, haystack_end, characters_end, true);
}
/* }}} */
/* {{{ php_strcspn */
PHPAPI size_t php_strcspn(const char *s1, const char *s2, const char *s1_end, const char *s2_end)
PHPAPI size_t php_strcspn(const char *haystack, const char *characters, const char *haystack_end, const char *characters_end)
{
const char *p, *spanp;
char c = *s1;
for (p = s1;;) {
spanp = s2;
do {
if (*spanp == c || p == s1_end) {
return p - s1;
}
} while (spanp++ < (s2_end - 1));
c = *++p;
}
/* NOTREACHED */
return php_strspn_strcspn_common(haystack, characters, haystack_end, characters_end, false);
}
/* }}} */

View File

@@ -12,7 +12,7 @@ echo "Done\n";
?>
--EXPECT--
int(1)
int(0)
int(1)
int(1)
int(1)
Done

View File

@@ -156,8 +156,8 @@ int(21)
int(16)
-- Itearation 9 --
int(5)
int(5)
int(12)
int(12)
int(2)
int(2)
int(12)
@@ -180,8 +180,8 @@ int(16)
int(5)
-- Itearation 11 --
int(0)
int(0)
int(2)
int(2)
int(2)
int(2)
int(2)
@@ -192,8 +192,8 @@ int(2)
int(2)
-- Itearation 12 --
int(0)
int(0)
int(13)
int(13)
int(3)
int(3)
int(13)
@@ -204,8 +204,8 @@ int(13)
int(13)
-- Itearation 13 --
int(0)
int(0)
int(14)
int(14)
int(3)
int(3)
int(14)
@@ -216,8 +216,8 @@ int(14)
int(6)
-- Itearation 14 --
int(5)
int(5)
int(11)
int(11)
int(2)
int(2)
int(11)
@@ -228,8 +228,8 @@ int(11)
int(11)
-- Itearation 15 --
int(5)
int(5)
int(11)
int(11)
int(2)
int(2)
int(11)
@@ -240,8 +240,8 @@ int(11)
int(11)
-- Itearation 16 --
int(5)
int(5)
int(14)
int(14)
int(2)
int(2)
int(14)

View File

@@ -650,20 +650,20 @@ int(0)
int(16)
-- Iteration 9 --
int(5)
int(4)
int(3)
int(12)
int(11)
int(10)
int(1)
int(2)
int(0)
int(5)
int(5)
int(4)
int(3)
int(12)
int(12)
int(11)
int(10)
int(1)
int(2)
int(0)
int(5)
int(12)
int(2)
int(1)
int(0)
@@ -794,20 +794,20 @@ int(0)
int(5)
-- Iteration 11 --
int(2)
int(1)
int(0)
int(1)
int(2)
int(0)
int(2)
int(2)
int(1)
int(0)
int(1)
int(2)
int(0)
int(0)
int(0)
int(0)
int(0)
int(0)
int(0)
int(0)
int(0)
int(0)
int(0)
int(2)
int(2)
int(1)
int(0)
@@ -866,20 +866,20 @@ int(0)
int(2)
-- Iteration 12 --
int(0)
int(5)
int(4)
int(0)
int(13)
int(12)
int(11)
int(1)
int(2)
int(0)
int(0)
int(0)
int(5)
int(4)
int(0)
int(13)
int(13)
int(12)
int(11)
int(1)
int(2)
int(0)
int(0)
int(13)
int(3)
int(2)
int(1)
@@ -938,20 +938,20 @@ int(0)
int(13)
-- Iteration 13 --
int(0)
int(14)
int(13)
int(12)
int(11)
int(0)
int(1)
int(2)
int(0)
int(0)
int(0)
int(14)
int(14)
int(13)
int(12)
int(11)
int(0)
int(1)
int(2)
int(0)
int(0)
int(14)
int(3)
int(2)
int(1)
@@ -1010,20 +1010,20 @@ int(0)
int(6)
-- Iteration 14 --
int(5)
int(4)
int(3)
int(11)
int(10)
int(9)
int(1)
int(2)
int(0)
int(5)
int(5)
int(4)
int(3)
int(11)
int(11)
int(10)
int(9)
int(1)
int(2)
int(0)
int(5)
int(11)
int(2)
int(1)
int(0)
@@ -1082,20 +1082,20 @@ int(0)
int(11)
-- Iteration 15 --
int(5)
int(4)
int(3)
int(11)
int(10)
int(9)
int(1)
int(2)
int(0)
int(5)
int(5)
int(4)
int(3)
int(11)
int(11)
int(10)
int(9)
int(1)
int(2)
int(0)
int(5)
int(11)
int(2)
int(1)
int(0)
@@ -1154,20 +1154,20 @@ int(0)
int(11)
-- Iteration 16 --
int(5)
int(4)
int(3)
int(14)
int(13)
int(12)
int(1)
int(2)
int(0)
int(5)
int(5)
int(4)
int(3)
int(14)
int(14)
int(13)
int(12)
int(1)
int(2)
int(0)
int(5)
int(14)
int(2)
int(1)
int(0)

View File

@@ -1387,20 +1387,20 @@ int(0)
int(0)
int(1)
int(2)
int(5)
int(5)
int(11)
int(12)
int(0)
int(0)
int(1)
int(2)
int(4)
int(4)
int(10)
int(11)
int(0)
int(0)
int(1)
int(2)
int(3)
int(3)
int(9)
int(10)
int(0)
int(0)
int(1)
@@ -1417,26 +1417,26 @@ int(0)
int(0)
int(1)
int(2)
int(5)
int(5)
int(11)
int(12)
int(0)
int(0)
int(1)
int(2)
int(5)
int(5)
int(11)
int(12)
int(0)
int(0)
int(1)
int(2)
int(4)
int(4)
int(10)
int(11)
int(0)
int(0)
int(1)
int(2)
int(3)
int(3)
int(9)
int(10)
int(0)
int(0)
int(1)
@@ -1453,8 +1453,8 @@ int(0)
int(0)
int(1)
int(2)
int(5)
int(5)
int(11)
int(12)
int(0)
int(0)
int(1)
@@ -1603,9 +1603,16 @@ int(0)
-- Iteration 8 --
int(0)
int(1)
int(2)
int(1)
int(2)
int(0)
int(0)
int(1)
int(1)
int(0)
int(1)
int(0)
int(0)
int(0)
@@ -1614,7 +1621,10 @@ int(0)
int(0)
int(0)
int(0)
int(1)
int(1)
int(0)
int(1)
int(0)
int(0)
int(0)
@@ -1623,11 +1633,22 @@ int(0)
int(0)
int(0)
int(0)
int(1)
int(2)
int(1)
int(2)
int(0)
int(0)
int(1)
int(2)
int(1)
int(2)
int(0)
int(0)
int(1)
int(1)
int(0)
int(1)
int(0)
int(0)
int(0)
@@ -1636,7 +1657,10 @@ int(0)
int(0)
int(0)
int(0)
int(1)
int(1)
int(0)
int(1)
int(0)
int(0)
int(0)
@@ -1645,34 +1669,10 @@ int(0)
int(0)
int(0)
int(0)
int(0)
int(0)
int(0)
int(0)
int(0)
int(0)
int(0)
int(0)
int(0)
int(0)
int(0)
int(0)
int(0)
int(0)
int(0)
int(0)
int(0)
int(0)
int(0)
int(0)
int(0)
int(0)
int(0)
int(0)
int(0)
int(0)
int(0)
int(0)
int(1)
int(2)
int(1)
int(2)
int(0)
int(0)
int(1)
@@ -1821,40 +1821,28 @@ int(0)
-- Iteration 9 --
int(0)
int(0)
int(0)
int(0)
int(0)
int(1)
int(2)
int(12)
int(13)
int(0)
int(0)
int(1)
int(2)
int(5)
int(5)
int(11)
int(12)
int(0)
int(0)
int(1)
int(2)
int(4)
int(4)
int(0)
int(0)
int(0)
int(0)
int(0)
int(0)
int(0)
int(0)
int(0)
int(0)
int(0)
int(0)
int(0)
int(0)
int(0)
int(10)
int(11)
int(0)
int(0)
int(1)
int(1)
int(0)
int(1)
int(0)
int(0)
int(0)
@@ -1865,24 +1853,32 @@ int(0)
int(0)
int(1)
int(2)
int(5)
int(5)
int(12)
int(13)
int(0)
int(0)
int(1)
int(2)
int(4)
int(4)
int(0)
int(0)
int(0)
int(0)
int(0)
int(0)
int(0)
int(0)
int(0)
int(0)
int(12)
int(13)
int(0)
int(0)
int(1)
int(2)
int(11)
int(12)
int(0)
int(0)
int(1)
int(2)
int(10)
int(11)
int(0)
int(0)
int(1)
int(1)
int(0)
int(1)
int(0)
int(0)
int(0)
@@ -1891,6 +1887,10 @@ int(0)
int(0)
int(0)
int(0)
int(1)
int(2)
int(12)
int(13)
int(0)
int(0)
int(1)
@@ -2041,20 +2041,20 @@ int(0)
int(0)
int(1)
int(2)
int(5)
int(5)
int(10)
int(11)
int(0)
int(0)
int(1)
int(2)
int(4)
int(4)
int(9)
int(10)
int(0)
int(0)
int(1)
int(2)
int(3)
int(3)
int(8)
int(9)
int(0)
int(0)
int(1)
@@ -2071,26 +2071,26 @@ int(0)
int(0)
int(1)
int(2)
int(5)
int(5)
int(10)
int(11)
int(0)
int(0)
int(1)
int(2)
int(5)
int(5)
int(10)
int(11)
int(0)
int(0)
int(1)
int(2)
int(4)
int(4)
int(9)
int(10)
int(0)
int(0)
int(1)
int(2)
int(3)
int(3)
int(8)
int(9)
int(0)
int(0)
int(1)
@@ -2107,8 +2107,8 @@ int(0)
int(0)
int(1)
int(2)
int(5)
int(5)
int(10)
int(11)
int(0)
int(0)
int(1)
@@ -2259,20 +2259,20 @@ int(0)
int(0)
int(1)
int(2)
int(5)
int(5)
int(12)
int(13)
int(0)
int(0)
int(1)
int(2)
int(4)
int(4)
int(11)
int(12)
int(0)
int(0)
int(1)
int(2)
int(3)
int(3)
int(10)
int(11)
int(0)
int(0)
int(1)
@@ -2289,26 +2289,26 @@ int(0)
int(0)
int(1)
int(2)
int(5)
int(5)
int(12)
int(13)
int(0)
int(0)
int(1)
int(2)
int(5)
int(5)
int(12)
int(13)
int(0)
int(0)
int(1)
int(2)
int(4)
int(4)
int(11)
int(12)
int(0)
int(0)
int(1)
int(2)
int(3)
int(3)
int(10)
int(11)
int(0)
int(0)
int(1)
@@ -2325,8 +2325,8 @@ int(0)
int(0)
int(1)
int(2)
int(5)
int(5)
int(12)
int(13)
int(0)
int(0)
int(1)

View File

@@ -145,8 +145,8 @@ int(26)
int(26)
-- Iteration 6 --
int(5)
int(5)
int(25)
int(25)
int(2)
int(2)
int(25)
@@ -157,8 +157,8 @@ int(25)
int(25)
-- Iteration 7 --
int(5)
int(5)
int(27)
int(27)
int(2)
int(2)
int(27)