Skip to content

Commit

Permalink
[~]: optimize performance by re-using the result of "strlen()"
Browse files Browse the repository at this point in the history
  • Loading branch information
voku committed Jul 26, 2020
1 parent 664a710 commit c925225
Show file tree
Hide file tree
Showing 3 changed files with 50 additions and 12 deletions.
4 changes: 4 additions & 0 deletions CHANGELOG.md
@@ -1,5 +1,9 @@
# Changelog

### 5.4.47 (2020-07-26)

- optimize performance by re-using the result of "strlen()"

### 5.4.46 (2020-07-18)

- add "UTF8::str_obfuscate()"
Expand Down
27 changes: 17 additions & 10 deletions src/voku/helper/UTF8.php
Expand Up @@ -5403,7 +5403,7 @@ public static function remove_bom(string $str): string

$str_length = \strlen($str);
foreach (self::$BOM as $bom_string => $bom_byte_length) {
if (\strpos($str, $bom_string) === 0) {
if (\strncmp($str, $bom_string, $bom_byte_length) === 0) {
/** @var false|string $str_tmp - needed for PhpStan (stubs error) */
$str_tmp = \substr($str, $bom_byte_length, $str_length);
if ($str_tmp === false) {
Expand Down Expand Up @@ -5536,7 +5536,11 @@ public static function remove_left(
string $substring,
string $encoding = 'UTF-8'
): string {
if ($substring && \strpos($str, $substring) === 0) {
if (
$substring
&&
\strpos($str, $substring) === 0
) {
if ($encoding === 'UTF-8') {
return (string) \mb_substr(
$str,
Expand Down Expand Up @@ -6802,8 +6806,9 @@ public static function str_ireplace_beginning(string $str, string $search, strin
return $str . $replacement;
}

if (\stripos($str, $search) === 0) {
return $replacement . \substr($str, \strlen($search));
$searchLength = \strlen($search);
if (\strncasecmp($str, $search, $searchLength) === 0) {
return $replacement . \substr($str, $searchLength);
}

return $str;
Expand Down Expand Up @@ -7942,8 +7947,9 @@ public static function str_replace_beginning(
return $str . $replacement;
}

if (\strpos($str, $search) === 0) {
return $replacement . \substr($str, \strlen($search));
$searchLength = \strlen($search);
if (\strncmp($str, $search, $searchLength) === 0) {
return $replacement . \substr($str, $searchLength);
}

return $str;
Expand Down Expand Up @@ -8549,7 +8555,7 @@ public static function str_starts_with(string $haystack, string $needle): bool
return false;
}

return \strpos($haystack, $needle) === 0;
return \strncmp($haystack, $needle, \strlen($needle)) === 0;
}

/**
Expand Down Expand Up @@ -8974,6 +8980,7 @@ static function (array $match) use ($try_to_keep_the_string_length, $lang, $igno
* Convert a string into a obfuscate string.
*
* EXAMPLE: <code>
*
* UTF8::str_obfuscate('lars@moelleken.org', 0.5, '*', ['@', '.']); // e.g. "l***@m**lleke*.*r*"
* </code>
*
Expand Down Expand Up @@ -9922,7 +9929,7 @@ public static function string_has_bom(string $str): bool
{
/** @noinspection PhpUnusedLocalVariableInspection */
foreach (self::$BOM as $bom_string => &$bom_byte_length) {
if (\strpos($str, $bom_string) === 0) {
if (\strncmp($str, $bom_string, $bom_byte_length) === 0) {
return true;
}
}
Expand Down Expand Up @@ -14592,7 +14599,7 @@ private static function str_capitalize_name_helper(
if ($delimiter === '-') {
/** @noinspection AlterInForeachInspection */
foreach ((array) $special_cases['names'] as &$beginning) {
if (self::strpos($name, $beginning, 0, $encoding) === 0) {
if (\strncmp($name, $beginning, \strlen($beginning)) === 0) {
$continue = true;

break;
Expand All @@ -14602,7 +14609,7 @@ private static function str_capitalize_name_helper(

/** @noinspection AlterInForeachInspection */
foreach ((array) $special_cases['prefixes'] as &$beginning) {
if (self::strpos($name, $beginning, 0, $encoding) === 0) {
if (\strncmp($name, $beginning, \strlen($beginning)) === 0) {
$continue = true;

break;
Expand Down
31 changes: 29 additions & 2 deletions tests/Utf8GlobalPart1Test.php
Expand Up @@ -3343,6 +3343,31 @@ public function testStrSort()

public function testStrStartsWith()
{
$loops = 2;

// ---

$str = 'ΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEndΚόσμεMiddleEnd';

$tests = [
'Κόσμε' => true,
'κόσμε' => false,
'' => true,
' ' => false,
// false => false,
'Κ' => true,
'End' => false,
'end' => false,
];

for ($i = 0; $i <= $loops; ++$i) { // keep this loop for simple performance tests
foreach ($tests as $test => $result) {
static::assertSame($result, UTF8::str_starts_with($str, $test), 'tested: ' . $test);
}
}

// ---

$str = 'ΚόσμεMiddleEnd';

$tests = [
Expand All @@ -3356,8 +3381,10 @@ public function testStrStartsWith()
'end' => false,
];

foreach ($tests as $test => $result) {
static::assertSame($result, UTF8::str_starts_with($str, $test), 'tested: ' . $test);
for ($i = 0; $i <= $loops; ++$i) { // keep this loop for simple performance tests
foreach ($tests as $test => $result) {
static::assertSame($result, UTF8::str_starts_with($str, $test), 'tested: ' . $test);
}
}
}

Expand Down

0 comments on commit c925225

Please sign in to comment.