Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Performance optimizations #168

Merged
merged 27 commits into from
Feb 13, 2025
Merged

Performance optimizations #168

merged 27 commits into from
Feb 13, 2025

Conversation

samdark
Copy link
Member

@samdark samdark commented Feb 9, 2025

benchmark subject set revs its mem_peak mode rstdev
ArrayHelperBench benchGetValue 1000 5 5.138mb 0.00% 2.043μs +0.75% ±3.17% -1.21%
ArrayHelperBench benchGetValueByPath 1000 5 5.138mb 0.00% 10.552μs +1.44% ±4.34% +219.81%
ArrayHelperBench benchIndex 1000 5 5.138mb 0.00% 6.006μs -1.13% ±2.27% +88.77%
ArrayHelperBench benchToArray 1000 5 5.138mb 0.00% 2.002μs -6.57% ±4.71% +67.69%
ArrayHelperBench benchRemove 1000 5 5.138mb 0.00% 1.011μs +0.57% ±4.75% -82.75%
ArrayHelperBench benchHtmlDecode 1000 5 5.138mb 0.00% 1.176μs +0.55% ±1.82% +167.44%
ArrayHelperBench benchMerge 1000 5 5.138mb 0.00% 1.244μs +4.39% ±0.94% -18.39%
ArrayHelperBench benchFilter 1000 5 5.138mb 0.00% 0.920μs +2.96% ±12.38% +718.93%
ArrayHelperBench benchGroup 1000 5 5.138mb 0.00% 81.551μs +3.93% ±0.42% -88.95%
ArrayHelperBench benchMap 1000 5 5.137mb 0.00% 1.865μs -6.08% ±5.67% -66.48%
ArrayHelperBench benchRemoveByPath 1000 5 5.138mb 0.00% 5.055μs +1.49% ±1.26% -66.76%
ArrayHelperBench benchSetValue 1000 5 5.138mb 0.00% 0.960μs -0.28% ±0.79% -63.30%
ArrayHelperBench benchHtmlEncode 1000 5 5.138mb 0.00% 108.082μs -23.51% ±0.98% -51.16%
ArrayHelperBench benchIsAssociative 1000 5 5.138mb 0.00% 0.906μs -1.12% ±2.68% -86.24%
ArrayHelperBench benchIsIndexed 1000 5 5.138mb 0.00% 1.027μs +5.95% ±6.33% +76.53%
ArrayHelperBench benchIsIn 1000 5 5.137mb 0.00% 1.185μs +0.06% ±1.59% +136.58%
ArrayHelperBench benchKeyExists 1000 5 5.138mb 0.00% 1.156μs +0.42% ±4.47% -36.16%
ArrayHelperBench benchPathExists 1000 5 5.138mb 0.00% 11.671μs +0.62% ±1.53% -32.79%
ArrayHelperBench benchRenameKey 1000 5 5.138mb 0.00% 1.014μs +2.22% ±1.69% +155.18%
ArrayHelperBench benchAddValue 1000 5 5.138mb 0.00% 1.091μs +1.33% ±3.50% +161.87%
ArrayHelperBench benchParametrizedMerge 1000 5 5.138mb 0.00% 1.757μs -0.24% ±0.90% -67.07%
ArrayHelperBench benchAddValueByPath 1000 5 5.138mb 0.00% 5.188μs +0.55% ±2.57% +53.25%
ArrayHelperBench benchSetValueByPath 1000 5 5.138mb 0.00% 5.222μs +6.37% ±1.53% -41.40%
ArrayHelperBench benchRemoveValue 1000 5 5.138mb 0.00% 0.851μs +1.72% ±5.71% +186.58%
ArrayHelperBench benchGetColumn 1000 5 5.138mb 0.00% 3.926μs +0.58% ±1.13% -64.42%
ArrayHelperBench benchIsSubset 1000 5 5.138mb 0.00% 0.907μs -1.45% ±2.64% -8.98%
ArrayHelperBench benchGetObjectVars 1000 5 5.138mb 0.00% 0.640μs -1.62% ±1.64% -53.93%
ArrayHelperBench benchArrayableFields 1000 5 5.138mb 0.00% 0.239μs -3.94% ±4.90% -20.42%
ArrayHelperBench benchArrayableExtraFields 1000 5 5.138mb 0.00% 0.246μs +1.95% ±3.12% +94.72%
ArrayHelperBench benchArrayableToArray 1000 5 5.138mb 0.00% 0.454μs -0.50% ±4.35% +57.49%
ArrayHelperBench benchArrayAccessGetIterator 1000 5 5.138mb 0.00% 0.390μs -2.45% ±25.90% +223.64%
ArrayHelperBench benchArrayAccessCount 1000 5 5.138mb 0.00% 0.252μs +1.64% ±10.42% +701.13%
ArrayHelperBench benchArrayAccessOffsetExists 1000 5 5.138mb 0.00% 0.389μs +1.31% ±6.33% +121.27%
ArrayHelperBench benchArrayAccessOffsetGet 1000 5 5.138mb 0.00% 0.403μs -4.14% ±1.67% -86.79%
ArrayHelperBench benchArrayAccessOffsetSet 1000 5 5.138mb 0.00% 0.493μs -0.66% ±2.44% +35.72%
ArrayHelperBench benchArrayAccessOffsetUnset 1000 5 5.138mb 0.00% 0.276μs +0.65% ±1.92% -30.28%
ArraySorterBench benchMultisortSingleKey 1000 5 5.138mb 0.00% 3.384μs -9.17% ±1.38% -43.68%
ArraySorterBench benchMultisortMultipleKeys 1000 5 5.138mb 0.00% 5.166μs -7.41% ±7.08% +213.68%
ArraySorterBench benchMultisortWithDirections 1000 5 5.138mb 0.00% 6.517μs -2.99% ±2.61% +61.02%
ArraySorterBench benchMultisortWithClosureAndFlags 1000 5 5.138mb 0.00% 6.420μs +0.15% ±1.97% -36.43%

@samdark samdark requested a review from a team February 9, 2025 23:12
Copy link
Member

@vjik vjik left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Result of comparing by AI:

Faster:

\Yiisoft\Arrays\Tests\Benchmark\ArrayHelperBench

    benchIndex: 6.168μs → 5.786μs
    benchGroup: 81.013μs → 80.775μs
    benchHtmlEncode: 144.347μs → 100.452μs
    benchRemoveByPath: 5.186μs → 5.145μs
    benchPathExists: 11.605μs → 11.428μs
    benchArrayAccessOffsetExists: 0.405μs → 0.374μs

\Yiisoft\Arrays\Tests\Benchmark\ArraySorterBench

    benchMultisortSingleKey: 3.864μs → 3.467μs
    benchMultisortMultipleKeys: 5.977μs → 5.398μs
    benchMultisortWithDirections: 6.760μs → 6.611μs

Slower:

\Yiisoft\Arrays\Tests\Benchmark\ArrayHelperBench

    benchGetValue: 2.041μs → 2.095μs
    benchGetValueByPath: 10.460μs → 11.737μs
    benchToArray: 1.944μs → 1.963μs
    benchRemove: 1.011μs → 1.072μs
    benchHtmlDecode: 1.121μs → 1.231μs
    benchMerge: 1.175μs → 1.274μs
    benchIsIndexed: 1.011μs → 1.051μs
    benchIsIn: 1.173μs → 1.234μs
    benchKeyExists: 1.098μs → 1.176μs
    benchRenameKey: 1.040μs → 1.057μs
    benchAddValue: 1.084μs → 1.166μs
    benchRemoveValue: 0.863μs → 0.920μs
    benchGetColumn: 3.926μs → 3.962μs
    benchIsSubset: 0.926μs → 0.962μs
    benchGetObjectVars: 0.658μs → 0.682μs
    benchArrayAccessGetIterator: 0.394μs → 0.378μs
    benchArrayAccessOffsetGet: 0.409μs → 0.408μs
    benchArrayAccessOffsetUnset: 0.277μs → 0.287μs

\Yiisoft\Arrays\Tests\Benchmark\ArraySorterBench

    benchMultisortWithClosureAndFlags: 6.514μs → 6.532μs

Good result for benchHtmlEncode, other changes are insignificantly. It got worse to benchGetValueByPath, this is important method.

Needs to keep good changes and remove other.

@@ -1043,24 +1065,62 @@ public static function pathExists(
*/
public static function htmlEncode(iterable $data, bool $valuesOnly = true, ?string $encoding = null): array
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is a good optimization, giving ~25% gain.

@@ -1161,7 +1203,7 @@ public static function isIndexed(array $array, bool $consecutive = false): bool
}

if ($consecutive) {
return array_keys($array) === range(0, count($array) - 1);
return array_is_list($array);
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We have PHP 8.1 now.

}
return $newPath;
return array_merge(...$newPath);
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It doesn't give much performance unless key is very-very deep. Doesn't make it worse though.

@samdark samdark requested a review from vjik February 12, 2025 21:12
@samdark
Copy link
Member Author

samdark commented Feb 12, 2025

Remove unnecessary changes from ArrayHelper, added changelog. Added comparison table to 1st post.

src/ArraySorter.php Outdated Show resolved Hide resolved
src/ArrayHelper.php Outdated Show resolved Hide resolved
src/ArrayHelper.php Outdated Show resolved Hide resolved
src/ArrayHelper.php Outdated Show resolved Hide resolved
@samdark samdark merged commit f846c6e into master Feb 13, 2025
21 checks passed
@samdark samdark deleted the performance branch February 13, 2025 15:32
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants