-
-
Notifications
You must be signed in to change notification settings - Fork 29
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
Conversation
samdark
commented
Feb 9, 2025
•
edited
Loading
edited
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% |
There was a problem hiding this 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 |
There was a problem hiding this comment.
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); |
There was a problem hiding this comment.
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); |
There was a problem hiding this comment.
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.
Remove unnecessary changes from |