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

Benchmarks and performance improvements #223

Merged

Conversation

Ocramius
Copy link
Contributor

@Ocramius Ocramius commented Sep 3, 2021

Scope of work

This patch attempts to improve happy-path execution time for Psl\Type components, and specifically:

  • Psl\Type\TypeInterface#coerce()
  • Psl\Type\TypeInterface#assert()
  • Psl\Type\TypeInterface#matches()

Results

Results as per 2021-09-08 (af6d378) are as follows:

root@6d63f978332e:/app# ./tools/phpbench/vendor/bin/phpbench run --config tools/phpbench/phpbench.json --ref=benchmark_reference --iterations=15 --revs=8
PHPBench (1.1.0) running benchmarks...
with configuration file: /app/tools/phpbench/phpbench.json
with PHP version 8.0.10, xdebug ✔, opcache ✔
comparing [actual vs. benchmark_reference]

\Psl\Tests\Benchmark\Type\StringTypeBench

    benchCoerce # string....................R1 I5 - [Mo1.000μs vs. Mo1.000μs] 0.00% (±0.00%)
    benchCoerce # int.......................R1 I1 - [Mo1.125μs vs. Mo1.125μs] 0.00% (±0.00%)
    benchCoerce # instanceof Stringable (ex.R1 I8 - [Mo1.375μs vs. Mo1.875μs] -26.67% (±0.00%)
    benchCoerce # instanceof Stringable (im.R1 I7 - [Mo1.375μs vs. Mo1.875μs] -26.67% (±0.00%)
    benchAssert.............................R1 I5 - [Mo1.125μs vs. Mo1.125μs] 0.00% (±0.00%)
    benchMatch..............................R2 I14 - [Mo1.000μs vs. Mo1.000μs] 0.00% (±0.00%)

\Psl\Tests\Benchmark\Type\ShapeTypeBench

    benchCoerce # empty shape, empty array .R1 I1 - [Mo3.125μs vs. Mo17.202μs] -81.83% (±1.00%)
    benchCoerce # empty shape, empty iterab.R2 I7 - [Mo5.497μs vs. Mo17.548μs] -68.68% (±1.40%)
    benchCoerce # empty shape, non-empty ar.R1 I4 - [Mo3.502μs vs. Mo23.732μs] -85.24% (±2.32%)
    benchCoerce # empty shape, non-empty it.R1 I14 - [Mo7.004μs vs. Mo24.129μs] -70.97% (±1.27%)
    benchCoerce # complex shape with option.R1 I14 - [Mo5.625μs vs. Mo62.697μs] -91.03% (±1.21%)
    benchCoerce # complex shape with option.R1 I10 - [Mo29.472μs vs. Mo64.065μs] -54.00% (±0.86%)
    benchCoerce # complex shape with option.R1 I12 - [Mo8.672μs vs. Mo93.012μs] -90.68% (±1.57%)
    benchCoerce # complex shape with option.R1 I14 - [Mo39.567μs vs. Mo94.873μs] -58.30% (±0.94%)
    benchAssert # empty shape, empty array .R1 I0 - [Mo1.250μs vs. Mo15.543μs] -91.96% (±0.00%)
    benchAssert # empty shape, non-empty ar.R1 I7 - [Mo2.000μs vs. Mo18.186μs] -89.00% (±2.89%)
    benchAssert # complex shape with option.R1 I2 - [Mo22.480μs vs. Mo49.896μs] -54.95% (±1.44%)
    benchAssert # complex shape with option.R1 I2 - [Mo29.613μs vs. Mo63.770μs] -53.56% (±1.22%)
    benchMatch # empty shape, empty array v.R1 I3 - [Mo1.500μs vs. Mo15.995μs] -90.62% (±0.00%)
    benchMatch # empty shape, non-empty arr.R2 I7 - [Mo2.500μs vs. Mo18.625μs] -86.58% (±1.24%)
    benchMatch # complex shape with optiona.R1 I7 - [Mo22.995μs vs. Mo50.246μs] -54.24% (±0.97%)
    benchMatch # complex shape with optiona.R1 I3 - [Mo30.085μs vs. Mo64.037μs] -53.02% (±0.44%)

\Psl\Tests\Benchmark\Type\VecTypeBench

    benchCoerce # mixed, empty array........R1 I14 - [Mo3.753μs vs. Mo5.125μs] -26.77% (±2.02%)
    benchCoerce # mixed, empty iterable.....R1 I14 - [Mo4.116μs vs. Mo5.125μs] -19.69% (±2.44%)
    benchCoerce # mixed, non-empty array....R1 I14 - [Mo5.602μs vs. Mo6.749μs] -17.00% (±2.27%)
    benchCoerce # mixed, non-empty iterable.R1 I14 - [Mo5.750μs vs. Mo7.000μs] -17.85% (±0.96%)
    benchCoerce # mixed, large array........R1 I14 - [Mo48.082μs vs. Mo49.339μs] -2.55% (±1.26%)
    benchCoerce # mixed, large iterable.....R1 I14 - [Mo51.736μs vs. Mo52.998μs] -2.38% (±2.04%)
    benchCoerce # int, empty array..........R1 I10 - [Mo3.770μs vs. Mo5.125μs] -26.45% (±2.76%)
    benchCoerce # int, empty iterable.......R2 I8 - [Mo3.998μs vs. Mo5.191μs] -22.99% (±2.05%)
    benchCoerce # int, non-empty array......R2 I4 - [Mo5.620μs vs. Mo6.699μs] -16.10% (±1.89%)
    benchCoerce # int, non-empty iterable...R2 I14 - [Mo5.779μs vs. Mo7.000μs] -17.45% (±2.14%)
    benchAssert # mixed, empty array........R1 I10 - [Mo3.625μs vs. Mo5.125μs] -29.26% (±2.52%)
    benchAssert # mixed, non-empty array....R1 I14 - [Mo5.750μs vs. Mo7.245μs] -20.64% (±0.87%)
    benchAssert # mixed, large array........R1 I14 - [Mo64.692μs vs. Mo66.096μs] -2.12% (±1.18%)
    benchAssert # int, empty array..........R1 I14 - [Mo3.741μs vs. Mo5.125μs] -27.00% (±2.38%)
    benchAssert # int, non-empty array......R13 I14 - [Mo5.752μs vs. Mo7.269μs] -20.86% (±1.41%)
    benchMatch # mixed, empty array.........R1 I13 - [Mo1.125μs vs. Mo1.250μs] -10.00% (±0.00%)
    benchMatch # mixed, non-empty array.....R1 I4 - [Mo2.875μs vs. Mo3.125μs] -8.03% (±2.21%)
    benchMatch # mixed, large array.........R2 I6 - [Mo54.026μs vs. Mo53.978μs] +0.09% (±0.69%)
    benchMatch # int, empty array...........R1 I0 - [Mo1.125μs vs. Mo1.250μs] -10.00% (±0.00%)
    benchMatch # int, non-empty array.......R1 I4 - [Mo2.875μs vs. Mo3.125μs] -8.01% (±2.49%)

\Psl\Tests\Benchmark\Type\DictTypeBench

    benchCoerce # generic array, empty arra.R3 I7 - [Mo6.128μs vs. Mo8.708μs] -29.63% (±1.45%)
    benchCoerce # generic array, empty iter.R1 I1 - [Mo6.376μs vs. Mo8.850μs] -27.95% (±1.33%)
    benchCoerce # generic array, non-empty .R1 I2 - [Mo7.374μs vs. Mo10.614μs] -30.53% (±1.70%)
    benchCoerce # generic array, non-empty .R1 I14 - [Mo7.600μs vs. Mo10.875μs] -30.12% (±1.80%)
    benchCoerce # generic array, large arra.R1 I5 - [Mo99.035μs vs. Mo3.702ms] -97.33% (±2.06%)
    benchCoerce # generic array, large iter.R1 I5 - [Mo103.920μs vs. Mo3.086ms] -96.63% (±1.47%)
    benchCoerce # int array, empty array....R1 I3 - [Mo6.103μs vs. Mo8.436μs] -27.65% (±1.67%)
    benchCoerce # int array, empty iterable.R1 I10 - [Mo6.153μs vs. Mo8.760μs] -29.77% (±1.85%)
    benchCoerce # int array, non-empty arra.R1 I13 - [Mo9.011μs vs. Mo11.639μs] -22.58% (±1.40%)
    benchCoerce # int array, non-empty iter.R1 I6 - [Mo9.428μs vs. Mo12.013μs] -21.52% (±1.26%)
    benchCoerce # int array, large array....R2 I9 - [Mo100.810μs vs. Mo102.101μs] -1.26% (±2.02%)
    benchCoerce # int array, large iterable.R1 I4 - [Mo104.550μs vs. Mo107.096μs] -2.38% (±1.10%)
    benchCoerce # map, empty array..........R2 I8 - [Mo6.082μs vs. Mo8.475μs] -28.24% (±1.93%)
    benchCoerce # map, empty iterable.......R2 I13 - [Mo6.246μs vs. Mo8.604μs] -27.40% (±1.44%)
    benchCoerce # map, non-empty array......R1 I9 - [Mo9.001μs vs. Mo11.503μs] -21.75% (±0.82%)
    benchCoerce # map, non-empty iterable...R2 I13 - [Mo9.575μs vs. Mo11.875μs] -19.38% (±1.56%)
    benchCoerce # map, large array..........R2 I14 - [Mo102.754μs vs. Mo104.467μs] -1.64% (±2.33%)
    benchCoerce # map, large iterable.......R1 I2 - [Mo106.440μs vs. Mo109.807μs] -3.07% (±1.45%)
    benchAssert # generic array, empty arra.R1 I14 - [Mo5.750μs vs. Mo8.248μs] -30.29% (±0.54%)
    benchAssert # generic array, non-empty .R1 I14 - [Mo6.986μs vs. Mo9.750μs] -28.35% (±1.45%)
    benchAssert # generic array, large arra.R4 I10 - [Mo98.287μs vs. Mo3.511ms] -97.20% (±1.85%)
    benchAssert # int array, empty array....R3 I12 - [Mo5.750μs vs. Mo8.250μs] -30.31% (±1.10%)
    benchAssert # int array, non-empty arra.R3 I13 - [Mo8.737μs vs. Mo11.286μs] -22.59% (±1.64%)
    benchAssert # int array, large array....R2 I8 - [Mo98.272μs vs. Mo101.161μs] -2.86% (±1.21%)
    benchAssert # map, empty array..........R2 I14 - [Mo5.745μs vs. Mo8.250μs] -30.36% (±1.49%)
    benchAssert # map, non-empty array......R6 I11 - [Mo8.702μs vs. Mo11.181μs] -22.17% (±1.47%)
    benchAssert # map, large array..........R1 I7 - [Mo102.052μs vs. Mo104.321μs] -2.17% (±1.40%)
    benchMatch # generic array, empty array.R1 I14 - [Mo6.148μs vs. Mo8.651μs] -28.93% (±2.49%)
    benchMatch # generic array, non-empty a.R7 I13 - [Mo7.375μs vs. Mo10.256μs] -28.09% (±1.77%)
    benchMatch # generic array, large array.R1 I6 - [Mo100.021μs vs. Mo4.486ms] -97.77% (±1.98%)
    benchMatch # int array, empty array.....R1 I14 - [Mo6.227μs vs. Mo8.699μs] -28.41% (±2.21%)
    benchMatch # int array, non-empty array.R1 I14 - [Mo9.000μs vs. Mo11.664μs] -22.83% (±0.69%)
    benchMatch # int array, large array.....R1 I1 - [Mo98.781μs vs. Mo101.539μs] -2.72% (±1.67%)
    benchMatch # map, empty array...........R6 I14 - [Mo6.248μs vs. Mo8.625μs] -27.57% (±2.31%)
    benchMatch # map, non-empty array.......R6 I14 - [Mo9.017μs vs. Mo11.552μs] -21.95% (±1.28%)
    benchMatch # map, large array...........R6 I14 - [Mo102.852μs vs. Mo105.609μs] -2.61% (±1.44%)

\Psl\Tests\Benchmark\Type\ArrayKeyTypeBench

    benchCoerce # string....................R1 I0 - [Mo1.000μs vs. Mo1.750μs] -42.86% (±0.00%)
    benchCoerce # int.......................R1 I12 - [Mo1.000μs vs. Mo19.582μs] -94.89% (±0.00%)
    benchCoerce # instanceof Stringable (ex.R2 I7 - [Mo61.066μs vs. Mo53.186μs] +14.82% (±1.27%)
    benchCoerce # instanceof Stringable (im.R1 I4 - [Mo61.126μs vs. Mo52.867μs] +15.62% (±1.32%)
    benchAssert # string....................R1 I0 - [Mo1.125μs vs. Mo1.500μs] -25.00% (±0.00%)
    benchAssert # int.......................R2 I4 - [Mo1.125μs vs. Mo17.236μs] -93.47% (±0.00%)
    benchMatch # string.....................R1 I11 - [Mo1.000μs vs. Mo1.375μs] -27.27% (±0.00%)
    benchMatch # int........................R1 I10 - [Mo1.000μs vs. Mo1.875μs] -46.67% (±0.00%)

\Psl\Tests\Benchmark\Type\NonEmptyStringTypeBench

    benchCoerce # string....................R2 I8 - [Mo1.000μs vs. Mo1.375μs] -27.27% (±0.00%)
    benchCoerce # int.......................R2 I13 - [Mo1.125μs vs. Mo1.500μs] -25.00% (±0.00%)
    benchCoerce # instanceof Stringable (ex.R1 I5 - [Mo1.625μs vs. Mo2.500μs] -35.01% (±3.89%)
    benchCoerce # instanceof Stringable (im.R1 I11 - [Mo1.625μs vs. Mo2.500μs] -34.99% (±0.00%)
    benchAssert.............................R1 I7 - [Mo1.125μs vs. Mo1.375μs] -18.18% (±0.00%)
    benchMatch..............................R1 I7 - [Mo1.000μs vs. Mo1.250μs] -20.00% (±0.00%)

\Psl\Tests\Benchmark\Type\IntTypeBench

    benchCoerce # int.......................R1 I2 - [Mo1.000μs vs. Mo1.000μs] 0.00% (±0.00%)
    benchCoerce # string....................R3 I13 - [Mo1.250μs vs. Mo1.875μs] -33.32% (±0.00%)
    benchCoerce # float.....................R2 I5 - [Mo1.125μs vs. Mo1.250μs] -10.00% (±0.00%)
    benchCoerce # instanceof Stringable (ex.R5 I11 - [Mo1.750μs vs. Mo2.625μs] -33.35% (±3.69%)
    benchCoerce # instanceof Stringable (im.R2 I12 - [Mo1.750μs vs. Mo2.500μs] -30.01% (±0.00%)
    benchAssert.............................R1 I2 - [Mo1.125μs vs. Mo1.125μs] 0.00% (±0.00%)
    benchMatch..............................R1 I7 - [Mo0.875μs vs. Mo1.000μs] -12.50% (±0.00%)

Subjects: 21, Assertions: 0, Failures: 0, Errors: 0

Dependencies

…ype\shape()` example

To run it:

 * `make install-static-analysis-dependencies`
 * `make benchmark`
Makefile Show resolved Hide resolved
Makefile Show resolved Hide resolved
src/Psl/Type/Internal/ShapeType.php Show resolved Hide resolved
tools/phpbench/composer.lock Show resolved Hide resolved
tools/psalm/psalm.xml Show resolved Hide resolved
@Ocramius
Copy link
Contributor Author

Ocramius commented Sep 3, 2021

@azjezz one big part that is relevant to me is optimizing the IterableType and VecType, which are intensively used in JSON decode operations in most biz domains I'm touching.

If you like where this is going (and before I add any more terrible things to it), I'll gladly expand the patch.

@Ocramius
Copy link
Contributor Author

Ocramius commented Sep 3, 2021

Note:

opcache ❌

I expect even better results when running with OPCache enabled, but don't have a local php installation where to try it out at this moment.

@Ocramius
Copy link
Contributor Author

Ocramius commented Sep 3, 2021

One failing test reports:

bash-5.1# ./tools/phpunit/vendor/bin/phpunit -c tools/phpunit/phpunit.xml.dist tests/unit/Type/ShapeAllowUnknownFieldsTypeTest.php 
PHPUnit 9.5.9 by Sebastian Bergmann and contributors.

Warning:       No code coverage driver available

...................F

Time: 00:00.020, Memory: 8.00 MB

There was 1 failure:

1) Psl\Tests\Unit\Type\ShapeAllowUnknownFieldsTypeTest::testValidCoercion with data set #1 (array('saif', '[email protected]', Psl\Collection\Vector Object (...)), array('saif', array(array('Foo', 'Baz', 0)), '[email protected]'))
Failed asserting that false is true.

/app/tests/unit/Type/TypeTest.php:111

Comparing $expected and $actual, I saw this:

array(3) {
  ["name"]=>
  string(4) "saif"
  ["articles"]=>
  array(1) {
    [0]=>
    array(3) {
      ["title"]=>
      string(3) "Foo"
      ["content"]=>
      string(3) "Baz"
      ["likes"]=>
      int(0)
    }
  }
  ["email"]=>
  string(18) "[email protected]"
}
array(3) {
  ["name"]=>
  string(4) "saif"
  ["email"]=>
  string(18) "[email protected]"
  ["articles"]=>
  array(1) {
    [0]=>
    array(3) {
      ["title"]=>
      string(3) "Foo"
      ["content"]=>
      string(3) "Baz"
      ["likes"]=>
      int(0)
    }
  }
}

I wonder if this scenario is valid? Is coerce() supposed to change the key order?

@azjezz
Copy link
Owner

azjezz commented Sep 4, 2021

If you like where this is going (and before I add any more terrible things to it), I'll gladly expand the patch.

This looks good to me so far 👍

I wonder if this scenario is valid? Is coerce() supposed to change the key order?

No 🤔 not sure why this is happening

@azjezz azjezz added Priority: High After critical issues are fixed, these should be dealt with before any further issues. Status: In Progress This issue is being worked on, and has someone assigned. Type: Enhancement Most issues will probably ask for additions or changes. labels Sep 4, 2021
@azjezz azjezz added this to the 1.8.0 milestone Sep 4, 2021
@coveralls
Copy link

coveralls commented Sep 4, 2021

Pull Request Test Coverage Report for Build 1213779701

  • 141 of 141 (100.0%) changed or added relevant lines in 8 files are covered.
  • No unchanged relevant lines lost coverage.
  • Overall coverage increased (+0.0005%) to 99.904%

Totals Coverage Status
Change from base Build 1125701052: 0.0005%
Covered Lines: 3118
Relevant Lines: 3121

💛 - Coveralls

@azjezz azjezz linked an issue Sep 4, 2021 that may be closed by this pull request
@Ocramius Ocramius force-pushed the feature/benchmarks-and-performance-improvements branch from e43e8e4 to 68da707 Compare September 5, 2021 16:41
@Ocramius
Copy link
Contributor Author

Ocramius commented Sep 5, 2021

Latest results can be seen in the commit message of 68da707 - overall quite happy with it, but wish I could make VecType and DictType faster (couldn't find a way, they are O(n), and there's no shortcut, IMO).

I've resorted to improving some of the base types, where possible.

The ridiculous amount of scenarios is due to a @phpbench bug that I haven't yet investigated: it creates permutations of every benchmark scenario, because parent class / child class data providers are both considered, for some reason (parent class is supposed to only provide the signature).

Note: I've only run unit tests and benchmarks.

I'll fight Psalm/PHPCS another time :)

… values passed to `ShapeType::coerce()`

This is just a prototype, and we can likely do the same with `assert()` and `matches()`, but it's just to show
the theory of operation.

Results:

```
./tools/phpbench/vendor/bin/phpbench run --config tools/phpbench/phpbench.json --ref=benchmark_reference
PHPBench (1.1.0) running benchmarks...
with configuration file: /app/tools/phpbench/phpbench.json
with PHP version 8.0.9, xdebug ❌, opcache ❌
comparing [actual vs. benchmark_reference]

\Psl\Tests\Benchmark\Type\ShapeTypeBench

    benchEmptyShapeCoercionAgainstEmptyArra.R1 I1 - [Mo0.500μs vs. Mo4.500μs] -88.89% (±0.00%)
    benchEmptyShapeCoercionAgainstNonEmptyA.R3 I3 - [Mo0.700μs vs. Mo6.103μs] -88.53% (±0.00%)
    benchComplexShapeCoercionAgainstValidSt.R3 I4 - [Mo1.603μs vs. Mo17.348μs] -90.76% (±2.99%)
    benchComplexShapeCoercionAgainstValidSt.R1 I3 - [Mo2.500μs vs. Mo24.120μs] -89.64% (±1.61%)

Subjects: 4, Assertions: 0, Failures: 0, Errors: 0
```
…nknown_fields` is `true`

Leads to some marginal improvement:

```
bash-5.1# make compare-benchmark-to-reference
./tools/phpbench/vendor/bin/phpbench run --config tools/phpbench/phpbench.json --ref=benchmark_reference
PHPBench (1.1.0) running benchmarks...
with configuration file: /app/tools/phpbench/phpbench.json
with PHP version 8.0.9, xdebug ❌, opcache ❌
comparing [actual vs. benchmark_reference]

\Psl\Tests\Benchmark\Type\ShapeTypeBench

    benchEmptyShapeCoercionAgainstEmptyArra.R1 I4 - [Mo0.600μs vs. Mo4.500μs] -86.67% (±0.00%)
    benchEmptyShapeCoercionAgainstNonEmptyA.R1 I4 - [Mo0.900μs vs. Mo6.103μs] -85.25% (±0.00%)
    benchComplexShapeCoercionAgainstValidSt.R1 I4 - [Mo1.500μs vs. Mo17.348μs] -91.35% (±0.00%)
    benchComplexShapeCoercionAgainstValidSt.R1 I1 - [Mo2.300μs vs. Mo24.120μs] -90.46% (±1.72%)

Subjects: 4, Assertions: 0, Failures: 0, Errors: 0
```
Results:

```
bash-5.1# make compare-benchmark-to-reference
./tools/phpbench/vendor/bin/phpbench run --config tools/phpbench/phpbench.json --ref=benchmark_reference
PHPBench (1.1.0) running benchmarks...
with configuration file: /app/tools/phpbench/phpbench.json
with PHP version 8.0.9, xdebug ❌, opcache ❌
comparing [actual vs. benchmark_reference]

\Psl\Tests\Benchmark\Type\StringTypeBench

    benchCoerce # string,string.............R5 I4 - [Mo0.100μs vs. Mo0.100μs] 0.00% (±0.00%)
    benchCoerce # int,string................R2 I3 - [Mo0.100μs vs. Mo0.100μs] 0.00% (±0.00%)
    benchCoerce # instanceof Stringable (ex.R5 I4 - [Mo0.100μs vs. Mo0.100μs] 0.00% (±0.00%)
    benchCoerce # instanceof Stringable (im.R5 I4 - [Mo0.100μs vs. Mo0.100μs] 0.00% (±0.00%)
    benchCoerce # string,int................R2 I4 - [Mo0.200μs vs. Mo0.200μs] 0.00% (±0.00%)
    benchCoerce # int,int...................R2 I3 - [Mo0.200μs vs. Mo0.200μs] 0.00% (±0.00%)
    benchCoerce # instanceof Stringable (ex.R5 I4 - [Mo0.200μs vs. Mo0.200μs] 0.00% (±0.00%)
    benchCoerce # instanceof Stringable (im.R5 I4 - [Mo0.200μs vs. Mo0.200μs] 0.00% (±0.00%)
    benchCoerce # string,instanceof Stringa.R2 I1 - [Mo0.200μs vs. Mo0.400μs] -50.00% (±0.00%)
    benchCoerce # int,instanceof Stringable.R2 I3 - [Mo0.200μs vs. Mo0.400μs] -50.00% (±0.00%)
    benchCoerce # instanceof Stringable (ex.R2 I4 - [Mo0.200μs vs. Mo0.400μs] -50.00% (±0.00%)
    benchCoerce # instanceof Stringable (im.R5 I4 - [Mo0.200μs vs. Mo0.400μs] -50.00% (±0.00%)
    benchCoerce # string,instanceof Stringa.R5 I4 - [Mo0.200μs vs. Mo0.300μs] -33.33% (±0.00%)
    benchCoerce # int,instanceof Stringable.R2 I2 - [Mo0.200μs vs. Mo0.400μs] -50.00% (±0.00%)
    benchCoerce # instanceof Stringable (ex.R2 I2 - [Mo0.200μs vs. Mo0.400μs] -50.00% (±0.00%)
    benchCoerce # instanceof Stringable (im.R2 I4 - [Mo0.200μs vs. Mo0.400μs] -50.00% (±0.00%)
    benchAssert.............................R2 I3 - [Mo0.100μs vs. Mo0.100μs] 0.00% (±0.00%)
    benchMatch..............................R5 I4 - [Mo0.100μs vs. Mo0.100μs] 0.00% (±0.00%)

\Psl\Tests\Benchmark\Type\ShapeTypeBench

    benchCoerce # empty shape, empty array .R5 I4 - [Mo0.600μs vs. Mo4.439μs] -86.48% (±0.00%)
    benchCoerce # empty shape, empty iterab.R1 I2 - [Mo0.600μs vs. Mo4.500μs] -86.67% (±0.00%)
    benchCoerce # empty shape, non-empty ar.R5 I4 - [Mo0.600μs vs. Mo4.500μs] -86.67% (±0.00%)
    benchCoerce # empty shape, non-empty it.R1 I4 - [Mo0.700μs vs. Mo4.461μs] -84.31% (±0.00%)
    benchCoerce # complex shape with option.R1 I1 - [Mo0.700μs vs. Mo4.500μs] -84.45% (±0.00%)
    benchCoerce # complex shape with option.R1 I3 - [Mo0.600μs vs. Mo4.461μs] -86.55% (±0.00%)
    benchCoerce # complex shape with option.R1 I3 - [Mo0.700μs vs. Mo4.503μs] -84.46% (±0.00%)
    benchCoerce # complex shape with option.R1 I2 - [Mo0.600μs vs. Mo4.500μs] -86.67% (±0.00%)
    benchCoerce # empty shape, empty array .R1 I4 - [Mo1.203μs vs. Mo4.700μs] -74.40% (±3.95%)
    benchCoerce # empty shape, empty iterab.R1 I3 - [Mo1.300μs vs. Mo4.700μs] -72.34% (±0.00%)
    benchCoerce # empty shape, non-empty ar.R1 I2 - [Mo1.300μs vs. Mo4.603μs] -71.76% (±0.00%)
    benchCoerce # empty shape, non-empty it.R1 I0 - [Mo1.300μs vs. Mo4.613μs] -71.82% (±0.00%)
    benchCoerce # complex shape with option.R1 I4 - [Mo1.203μs vs. Mo4.757μs] -74.71% (±3.95%)
    benchCoerce # complex shape with option.R1 I4 - [Mo1.203μs vs. Mo4.600μs] -73.84% (±3.95%)
    benchCoerce # complex shape with option.R1 I4 - [Mo1.297μs vs. Mo4.700μs] -72.41% (±3.89%)
    benchCoerce # complex shape with option.R1 I4 - [Mo1.300μs vs. Mo4.661μs] -72.11% (±0.00%)
    benchCoerce # empty shape, empty array .R1 I4 - [Mo0.900μs vs. Mo6.100μs] -85.25% (±0.00%)
    benchCoerce # empty shape, empty iterab.R2 I4 - [Mo0.900μs vs. Mo6.100μs] -85.25% (±0.00%)
    benchCoerce # empty shape, non-empty ar.R1 I4 - [Mo0.900μs vs. Mo6.100μs] -85.25% (±0.00%)
    benchCoerce # empty shape, non-empty it.R1 I0 - [Mo0.900μs vs. Mo6.100μs] -85.25% (±0.00%)
    benchCoerce # complex shape with option.R1 I4 - [Mo0.900μs vs. Mo6.100μs] -85.25% (±0.00%)
    benchCoerce # complex shape with option.R1 I0 - [Mo0.900μs vs. Mo6.100μs] -85.25% (±0.00%)
    benchCoerce # complex shape with option.R2 I1 - [Mo0.900μs vs. Mo6.100μs] -85.25% (±0.00%)
    benchCoerce # complex shape with option.R1 I0 - [Mo0.900μs vs. Mo6.100μs] -85.25% (±0.00%)
    benchCoerce # empty shape, empty array .R1 I4 - [Mo1.797μs vs. Mo6.593μs] -72.75% (±2.78%)
    benchCoerce # empty shape, empty iterab.R1 I4 - [Mo1.897μs vs. Mo6.587μs] -71.21% (±2.63%)
    benchCoerce # empty shape, non-empty ar.R1 I4 - [Mo1.897μs vs. Mo6.600μs] -71.26% (±2.63%)
    benchCoerce # empty shape, non-empty it.R1 I4 - [Mo1.897μs vs. Mo6.581μs] -71.18% (±2.63%)
    benchCoerce # complex shape with option.R1 I4 - [Mo1.803μs vs. Mo6.597μs] -72.66% (±2.66%)
    benchCoerce # complex shape with option.R1 I4 - [Mo1.897μs vs. Mo6.600μs] -71.26% (±2.63%)
    benchCoerce # complex shape with option.R1 I1 - [Mo1.800μs vs. Mo6.600μs] -72.73% (±0.00%)
    benchCoerce # complex shape with option.R1 I4 - [Mo1.900μs vs. Mo6.600μs] -71.21% (±2.13%)
    benchCoerce # empty shape, empty array .R1 I2 - [Mo1.400μs vs. Mo17.214μs] -91.87% (±0.00%)
    benchCoerce # empty shape, empty iterab.R1 I4 - [Mo1.500μs vs. Mo17.100μs] -91.23% (±0.00%)
    benchCoerce # empty shape, non-empty ar.R1 I4 - [Mo1.497μs vs. Mo17.345μs] -91.37% (±3.36%)
    benchCoerce # empty shape, non-empty it.R1 I4 - [Mo1.500μs vs. Mo17.300μs] -91.33% (±0.00%)
    benchCoerce # complex shape with option.R1 I1 - [Mo1.500μs vs. Mo17.107μs] -91.23% (±0.00%)
    benchCoerce # complex shape with option.R4 I4 - [Mo1.403μs vs. Mo17.204μs] -91.84% (±3.40%)
    benchCoerce # complex shape with option.R1 I4 - [Mo1.500μs vs. Mo17.092μs] -91.22% (±0.00%)
    benchCoerce # complex shape with option.R3 I4 - [Mo1.403μs vs. Mo17.213μs] -91.85% (±3.40%)
    benchCoerce # empty shape, empty array .R5 I4 - [Mo8.939μs vs. Mo17.939μs] -50.17% (±0.84%)
    benchCoerce # empty shape, empty iterab.R5 I4 - [Mo8.855μs vs. Mo17.987μs] -50.77% (±1.31%)
    benchCoerce # empty shape, non-empty ar.R5 I4 - [Mo8.845μs vs. Mo17.889μs] -50.56% (±2.07%)
    benchCoerce # empty shape, non-empty it.R5 I4 - [Mo8.893μs vs. Mo17.909μs] -50.34% (±1.11%)
    benchCoerce # complex shape with option.R5 I4 - [Mo9.097μs vs. Mo17.999μs] -49.46% (±1.50%)
    benchCoerce # complex shape with option.R5 I4 - [Mo9.034μs vs. Mo17.953μs] -49.68% (±1.67%)
    benchCoerce # complex shape with option.R5 I4 - [Mo8.909μs vs. Mo17.792μs] -49.93% (±1.14%)
    benchCoerce # complex shape with option.R5 I4 - [Mo8.913μs vs. Mo17.876μs] -50.14% (±0.89%)
    benchCoerce # empty shape, empty array .R5 I4 - [Mo2.200μs vs. Mo23.899μs] -90.79% (±1.80%)
    benchCoerce # empty shape, empty iterab.R5 I4 - [Mo2.300μs vs. Mo23.953μs] -90.40% (±2.75%)
    benchCoerce # empty shape, non-empty ar.R5 I4 - [Mo2.297μs vs. Mo24.093μs] -90.47% (±2.17%)
    benchCoerce # empty shape, non-empty it.R5 I4 - [Mo2.200μs vs. Mo24.014μs] -90.84% (±1.80%)
    benchCoerce # complex shape with option.R5 I4 - [Mo2.297μs vs. Mo24.023μs] -90.44% (±2.17%)
    benchCoerce # complex shape with option.R5 I4 - [Mo2.300μs vs. Mo24.013μs] -90.42% (±2.75%)
    benchCoerce # complex shape with option.R5 I4 - [Mo2.243μs vs. Mo23.981μs] -90.65% (±3.89%)
    benchCoerce # complex shape with option.R5 I4 - [Mo2.203μs vs. Mo23.945μs] -90.80% (±2.19%)
    benchCoerce # empty shape, empty array .R5 I4 - [Mo11.497μs vs. Mo25.261μs] -54.49% (±0.43%)
    benchCoerce # empty shape, empty iterab.R5 I4 - [Mo11.395μs vs. Mo25.138μs] -54.67% (±1.28%)
    benchCoerce # empty shape, non-empty ar.R5 I4 - [Mo11.303μs vs. Mo25.329μs] -55.37% (±0.43%)
    benchCoerce # empty shape, non-empty it.R5 I4 - [Mo11.400μs vs. Mo25.187μs] -54.74% (±0.78%)
    benchCoerce # complex shape with option.R5 I4 - [Mo11.403μs vs. Mo25.191μs] -54.73% (±1.18%)
    benchCoerce # complex shape with option.R3 I4 - [Mo11.487μs vs. Mo25.113μs] -54.26% (±0.70%)
    benchCoerce # complex shape with option.R3 I4 - [Mo11.361μs vs. Mo25.180μs] -54.88% (±0.66%)
    benchCoerce # complex shape with option.R3 I4 - [Mo11.303μs vs. Mo25.191μs] -55.13% (±0.43%)
    benchAssert # empty shape, empty array .R2 I2 - [Mo0.200μs vs. Mo4.000μs] -95.00% (±0.00%)
    benchAssert # empty shape, non-empty ar.R5 I4 - [Mo0.100μs vs. Mo4.000μs] -97.50% (±0.00%)
    benchAssert # complex shape with option.R5 I4 - [Mo0.100μs vs. Mo3.991μs] -97.49% (±0.00%)
    benchAssert # complex shape with option.R2 I4 - [Mo0.200μs vs. Mo3.997μs] -95.00% (±0.00%)
    benchAssert # empty shape, empty array .R1 I4 - [Mo0.500μs vs. Mo4.700μs] -89.36% (±0.00%)
    benchAssert # empty shape, non-empty ar.R1 I4 - [Mo0.500μs vs. Mo4.600μs] -89.13% (±0.00%)
    benchAssert # complex shape with option.R1 I4 - [Mo0.500μs vs. Mo4.600μs] -89.13% (±0.00%)
    benchAssert # complex shape with option.R1 I4 - [Mo0.500μs vs. Mo4.603μs] -89.14% (±0.00%)
    benchAssert # empty shape, empty array .R1 I4 - [Mo7.109μs vs. Mo14.130μs] -49.69% (±1.43%)
    benchAssert # empty shape, non-empty ar.R1 I3 - [Mo7.139μs vs. Mo13.903μs] -48.65% (±1.05%)
    benchAssert # complex shape with option.R1 I4 - [Mo7.091μs vs. Mo13.839μs] -48.76% (±1.44%)
    benchAssert # complex shape with option.R1 I4 - [Mo7.114μs vs. Mo13.800μs] -48.45% (±1.38%)
    benchAssert # empty shape, empty array .R1 I4 - [Mo9.139μs vs. Mo16.903μs] -45.93% (±0.82%)
    benchAssert # empty shape, non-empty ar.R1 I4 - [Mo9.100μs vs. Mo17.000μs] -46.47% (±0.44%)
    benchAssert # complex shape with option.R1 I4 - [Mo9.187μs vs. Mo17.091μs] -46.25% (±0.88%)
    benchAssert # complex shape with option.R1 I4 - [Mo9.200μs vs. Mo17.147μs] -46.35% (±0.44%)
    benchMatch # empty shape, empty array v.R5 I4 - [Mo0.300μs vs. Mo4.100μs] -92.68% (±0.00%)
    benchMatch # empty shape, non-empty arr.R5 I4 - [Mo0.300μs vs. Mo4.003μs] -92.51% (±0.00%)
    benchMatch # complex shape with optiona.R5 I4 - [Mo0.300μs vs. Mo4.100μs] -92.68% (±0.00%)
    benchMatch # complex shape with optiona.R5 I4 - [Mo0.300μs vs. Mo4.100μs] -92.68% (±0.00%)
    benchMatch # empty shape, empty array v.R5 I4 - [Mo0.500μs vs. Mo4.791μs] -89.56% (±0.00%)
    benchMatch # empty shape, non-empty arr.R1 I1 - [Mo0.500μs vs. Mo4.797μs] -89.58% (±0.00%)
    benchMatch # complex shape with optiona.R1 I2 - [Mo0.500μs vs. Mo4.757μs] -89.49% (±0.00%)
    benchMatch # complex shape with optiona.R1 I4 - [Mo0.500μs vs. Mo4.761μs] -89.50% (±0.00%)
    benchMatch # empty shape, empty array v.R1 I4 - [Mo7.203μs vs. Mo13.861μs] -48.03% (±1.87%)
    benchMatch # empty shape, non-empty arr.R1 I4 - [Mo7.187μs vs. Mo13.956μs] -48.50% (±1.12%)
    benchMatch # complex shape with optiona.R1 I4 - [Mo7.100μs vs. Mo14.039μs] -49.42% (±0.89%)
    benchMatch # complex shape with optiona.R3 I4 - [Mo7.114μs vs. Mo13.903μs] -48.83% (±1.38%)
    benchMatch # empty shape, empty array v.R3 I4 - [Mo9.200μs vs. Mo17.248μs] -46.66% (±0.87%)
    benchMatch # empty shape, non-empty arr.R1 I4 - [Mo9.197μs vs. Mo17.261μs] -46.72% (±0.53%)
    benchMatch # complex shape with optiona.R1 I4 - [Mo9.247μs vs. Mo17.081μs] -45.87% (±1.44%)
    benchMatch # complex shape with optiona.R1 I4 - [Mo9.203μs vs. Mo17.114μs] -46.22% (±0.53%)

\Psl\Tests\Benchmark\Type\VecTypeBench

    benchCoerce # mixed, empty array,mixed,.R1 I4 - [Mo1.000μs vs. Mo1.303μs] -23.27% (±0.00%)
    benchCoerce # mixed, empty iterable,mix.R1 I0 - [Mo1.000μs vs. Mo1.300μs] -23.08% (±0.00%)
    benchCoerce # mixed, non-empty array,mi.R1 I0 - [Mo1.000μs vs. Mo1.400μs] -28.57% (±0.00%)
    benchCoerce # mixed, non-empty iterable.R2 I4 - [Mo1.000μs vs. Mo1.400μs] -28.57% (±0.00%)
    benchCoerce # mixed, large array,mixed,.R1 I0 - [Mo1.000μs vs. Mo1.300μs] -23.08% (±0.00%)
    benchCoerce # mixed, large iterable,mix.R1 I0 - [Mo1.000μs vs. Mo1.397μs] -28.40% (±0.00%)
    benchCoerce # int, empty array,mixed, e.R1 I1 - [Mo1.000μs vs. Mo1.303μs] -23.27% (±0.00%)
    benchCoerce # int, empty iterable,mixed.R1 I4 - [Mo1.000μs vs. Mo1.400μs] -28.57% (±0.00%)
    benchCoerce # int, non-empty array,mixe.R1 I4 - [Mo1.000μs vs. Mo1.303μs] -23.27% (±0.00%)
    benchCoerce # int, non-empty iterable,m.R1 I4 - [Mo1.000μs vs. Mo1.400μs] -28.57% (±0.00%)
    benchCoerce # mixed, empty array,mixed,.R1 I4 - [Mo1.000μs vs. Mo1.400μs] -28.57% (±0.00%)
    benchCoerce # mixed, empty iterable,mix.R1 I4 - [Mo1.000μs vs. Mo1.500μs] -33.33% (±0.00%)
    benchCoerce # mixed, non-empty array,mi.R5 I4 - [Mo1.000μs vs. Mo1.403μs] -28.74% (±0.00%)
    benchCoerce # mixed, non-empty iterable.R1 I0 - [Mo1.000μs vs. Mo1.500μs] -33.33% (±0.00%)
    benchCoerce # mixed, large array,mixed,.R2 I1 - [Mo1.000μs vs. Mo1.500μs] -33.33% (±0.00%)
    benchCoerce # mixed, large iterable,mix.R2 I4 - [Mo1.000μs vs. Mo1.500μs] -33.33% (±0.00%)
    benchCoerce # int, empty array,mixed, e.R2 I4 - [Mo1.000μs vs. Mo1.497μs] -33.19% (±0.00%)
    benchCoerce # int, empty iterable,mixed.R1 I0 - [Mo1.000μs vs. Mo1.400μs] -28.57% (±0.00%)
    benchCoerce # int, non-empty array,mixe.R1 I4 - [Mo1.000μs vs. Mo1.403μs] -28.74% (±0.00%)
    benchCoerce # int, non-empty iterable,m.R1 I2 - [Mo1.000μs vs. Mo1.500μs] -33.33% (±0.00%)
    benchCoerce # mixed, empty array,mixed,.R1 I4 - [Mo1.300μs vs. Mo1.600μs] -18.75% (±0.00%)
    benchCoerce # mixed, empty iterable,mix.R1 I4 - [Mo1.300μs vs. Mo1.600μs] -18.75% (±0.00%)
    benchCoerce # mixed, non-empty array,mi.R1 I4 - [Mo1.203μs vs. Mo1.503μs] -19.96% (±3.95%)
    benchCoerce # mixed, non-empty iterable.R1 I4 - [Mo1.300μs vs. Mo1.600μs] -18.76% (±0.00%)
    benchCoerce # mixed, large array,mixed,.R1 I0 - [Mo1.200μs vs. Mo1.697μs] -29.27% (±0.00%)
    benchCoerce # mixed, large iterable,mix.R3 I4 - [Mo1.300μs vs. Mo1.603μs] -18.92% (±0.00%)
    benchCoerce # int, empty array,mixed, n.R3 I4 - [Mo1.203μs vs. Mo1.597μs] -24.64% (±3.95%)
    benchCoerce # int, empty iterable,mixed.R1 I1 - [Mo1.300μs vs. Mo1.603μs] -18.92% (±0.00%)
    benchCoerce # int, non-empty array,mixe.R1 I2 - [Mo1.300μs vs. Mo1.603μs] -18.92% (±0.00%)
    benchCoerce # int, non-empty iterable,m.R1 I4 - [Mo1.203μs vs. Mo1.597μs] -24.64% (±3.95%)
    benchCoerce # mixed, empty array,mixed,.R1 I2 - [Mo1.500μs vs. Mo1.900μs] -21.04% (±0.00%)
    benchCoerce # mixed, empty iterable,mix.R1 I4 - [Mo1.497μs vs. Mo1.900μs] -21.22% (±3.36%)
    benchCoerce # mixed, non-empty array,mi.R1 I4 - [Mo1.500μs vs. Mo1.897μs] -20.91% (±0.00%)
    benchCoerce # mixed, non-empty iterable.R1 I4 - [Mo1.500μs vs. Mo1.897μs] -20.91% (±0.00%)
    benchCoerce # mixed, large array,mixed,.R1 I4 - [Mo1.500μs vs. Mo1.897μs] -20.91% (±0.00%)
    benchCoerce # mixed, large iterable,mix.R1 I1 - [Mo1.500μs vs. Mo1.800μs] -16.67% (±0.00%)
    benchCoerce # int, empty array,mixed, n.R1 I4 - [Mo1.500μs vs. Mo1.897μs] -20.91% (±0.00%)
    benchCoerce # int, empty iterable,mixed.R1 I4 - [Mo1.500μs vs. Mo1.803μs] -16.82% (±0.00%)
    benchCoerce # int, non-empty array,mixe.R1 I3 - [Mo1.500μs vs. Mo1.900μs] -21.04% (±0.00%)
    benchCoerce # int, non-empty iterable,m.R1 I4 - [Mo1.500μs vs. Mo1.803μs] -16.82% (±0.00%)
    benchCoerce # mixed, empty array,mixed,.R1 I4 - [Mo6.700μs vs. Mo7.197μs] -6.90% (±0.60%)
    benchCoerce # mixed, empty iterable,mix.R1 I4 - [Mo6.752μs vs. Mo7.187μs] -6.05% (±1.61%)
    benchCoerce # mixed, non-empty array,mi.R1 I4 - [Mo6.703μs vs. Mo7.103μs] -5.64% (±2.54%)
    benchCoerce # mixed, non-empty iterable.R1 I4 - [Mo6.797μs vs. Mo7.079μs] -3.99% (±0.72%)
    benchCoerce # mixed, large array,mixed,.R1 I4 - [Mo6.700μs vs. Mo7.171μs] -6.57% (±0.60%)
    benchCoerce # mixed, large iterable,mix.R1 I4 - [Mo6.700μs vs. Mo7.200μs] -6.94% (±0.60%)
    benchCoerce # int, empty array,mixed, l.R1 I4 - [Mo6.787μs vs. Mo7.197μs] -5.69% (±1.19%)
    benchCoerce # int, empty iterable,mixed.R1 I4 - [Mo6.700μs vs. Mo7.200μs] -6.94% (±0.94%)
    benchCoerce # int, non-empty array,mixe.R1 I4 - [Mo6.797μs vs. Mo7.200μs] -5.60% (±0.72%)
    benchCoerce # int, non-empty iterable,m.R2 I3 - [Mo6.700μs vs. Mo7.043μs] -4.87% (±0.60%)
    benchCoerce # mixed, empty array,mixed,.R2 I4 - [Mo9.352μs vs. Mo9.823μs] -4.79% (±1.17%)
    benchCoerce # mixed, empty iterable,mix.R2 I4 - [Mo9.396μs vs. Mo9.873μs] -4.83% (±2.14%)
    benchCoerce # mixed, non-empty array,mi.R2 I4 - [Mo9.451μs vs. Mo9.786μs] -3.42% (±2.25%)
    benchCoerce # mixed, non-empty iterable.R2 I4 - [Mo9.493μs vs. Mo9.814μs] -3.27% (±1.04%)
    benchCoerce # mixed, large array,mixed,.R2 I4 - [Mo9.352μs vs. Mo9.700μs] -3.59% (±1.96%)
    benchCoerce # mixed, large iterable,mix.R1 I0 - [Mo9.491μs vs. Mo9.797μs] -3.12% (±1.08%)
    benchCoerce # int, empty array,mixed, l.R1 I0 - [Mo9.497μs vs. Mo9.839μs] -3.48% (±1.44%)
    benchCoerce # int, empty iterable,mixed.R1 I4 - [Mo9.300μs vs. Mo9.797μs] -5.07% (±0.43%)
    benchCoerce # int, non-empty array,mixe.R1 I4 - [Mo9.400μs vs. Mo9.752μs] -3.61% (±0.95%)
    benchCoerce # int, non-empty iterable,m.R1 I4 - [Mo9.303μs vs. Mo9.910μs] -6.12% (±0.52%)
    benchCoerce # mixed, empty array,int, e.R5 I4 - [Mo1.000μs vs. Mo1.303μs] -23.27% (±0.00%)
    benchCoerce # mixed, empty iterable,int.R5 I4 - [Mo1.000μs vs. Mo1.400μs] -28.57% (±0.00%)
    benchCoerce # mixed, non-empty array,in.R5 I4 - [Mo1.000μs vs. Mo1.203μs] -16.90% (±0.00%)
    benchCoerce # mixed, non-empty iterable.R5 I4 - [Mo1.000μs vs. Mo1.303μs] -23.27% (±0.00%)
    benchCoerce # mixed, large array,int, e.R5 I4 - [Mo1.000μs vs. Mo1.400μs] -28.57% (±0.00%)
    benchCoerce # mixed, large iterable,int.R5 I4 - [Mo1.000μs vs. Mo1.400μs] -28.57% (±0.00%)
    benchCoerce # int, empty array,int, emp.R5 I4 - [Mo1.000μs vs. Mo1.400μs] -28.57% (±0.00%)
    benchCoerce # int, empty iterable,int, .R1 I1 - [Mo1.000μs vs. Mo1.400μs] -28.57% (±0.00%)
    benchCoerce # int, non-empty array,int,.R1 I4 - [Mo1.000μs vs. Mo1.397μs] -28.40% (±0.00%)
    benchCoerce # int, non-empty iterable,i.R1 I4 - [Mo1.000μs vs. Mo1.397μs] -28.40% (±0.00%)
    benchCoerce # mixed, empty array,int, e.R1 I1 - [Mo1.000μs vs. Mo1.500μs] -33.33% (±0.00%)
    benchCoerce # mixed, empty iterable,int.R1 I4 - [Mo1.000μs vs. Mo1.500μs] -33.33% (±0.00%)
    benchCoerce # mixed, non-empty array,in.R1 I4 - [Mo1.000μs vs. Mo1.497μs] -33.19% (±0.00%)
    benchCoerce # mixed, non-empty iterable.R1 I0 - [Mo1.000μs vs. Mo1.403μs] -28.74% (±0.00%)
    benchCoerce # mixed, large array,int, e.R2 I3 - [Mo1.000μs vs. Mo1.500μs] -33.33% (±0.00%)
    benchCoerce # mixed, large iterable,int.R2 I4 - [Mo1.000μs vs. Mo1.400μs] -28.57% (±0.00%)
    benchCoerce # int, empty array,int, emp.R1 I4 - [Mo1.000μs vs. Mo1.500μs] -33.33% (±0.00%)
    benchCoerce # int, empty iterable,int, .R1 I3 - [Mo1.000μs vs. Mo1.497μs] -33.19% (±0.00%)
    benchCoerce # int, non-empty array,int,.R1 I4 - [Mo1.000μs vs. Mo1.500μs] -33.33% (±0.00%)
    benchCoerce # int, non-empty iterable,i.R2 I4 - [Mo1.000μs vs. Mo1.500μs] -33.33% (±0.00%)
    benchCoerce # mixed, empty array,int, n.R4 I4 - [Mo1.203μs vs. Mo1.603μs] -24.95% (±3.95%)
    benchCoerce # mixed, empty iterable,int.R1 I1 - [Mo1.200μs vs. Mo1.603μs] -25.16% (±0.00%)
    benchCoerce # mixed, non-empty array,in.R1 I1 - [Mo1.300μs vs. Mo1.597μs] -18.58% (±0.00%)
    benchCoerce # mixed, non-empty iterable.R5 I4 - [Mo1.297μs vs. Mo1.597μs] -18.79% (±3.89%)
    benchCoerce # mixed, large array,int, n.R3 I2 - [Mo1.297μs vs. Mo1.603μs] -19.13% (±3.89%)
    benchCoerce # mixed, large iterable,int.R5 I4 - [Mo1.203μs vs. Mo1.600μs] -24.79% (±3.95%)
    benchCoerce # int, empty array,int, non.R5 I4 - [Mo1.203μs vs. Mo1.600μs] -24.80% (±3.95%)
    benchCoerce # int, empty iterable,int, .R1 I1 - [Mo1.300μs vs. Mo1.600μs] -18.76% (±0.00%)
    benchCoerce # int, non-empty array,int,.R1 I3 - [Mo1.300μs vs. Mo1.600μs] -18.75% (±0.00%)
    benchCoerce # int, non-empty iterable,i.R1 I4 - [Mo1.300μs vs. Mo1.500μs] -13.33% (±0.00%)
    benchCoerce # mixed, empty array,int, n.R1 I4 - [Mo1.500μs vs. Mo1.900μs] -21.06% (±0.00%)
    benchCoerce # mixed, empty iterable,int.R5 I4 - [Mo1.500μs vs. Mo1.900μs] -21.04% (±0.00%)
    benchCoerce # mixed, non-empty array,in.R5 I4 - [Mo1.500μs vs. Mo1.903μs] -21.19% (±0.00%)
    benchCoerce # mixed, non-empty iterable.R5 I4 - [Mo1.500μs vs. Mo1.897μs] -20.91% (±0.00%)
    benchCoerce # mixed, large array,int, n.R5 I4 - [Mo1.500μs vs. Mo1.803μs] -16.82% (±0.00%)
    benchCoerce # mixed, large iterable,int.R1 I0 - [Mo1.500μs vs. Mo1.897μs] -20.91% (±0.00%)
    benchCoerce # int, empty array,int, non.R5 I4 - [Mo1.500μs vs. Mo1.900μs] -21.05% (±0.00%)
    benchCoerce # int, empty iterable,int, .R1 I2 - [Mo1.500μs vs. Mo1.803μs] -16.82% (±0.00%)
    benchCoerce # int, non-empty array,int,.R1 I3 - [Mo1.500μs vs. Mo1.800μs] -16.68% (±0.00%)
    benchCoerce # int, non-empty iterable,i.R1 I4 - [Mo1.500μs vs. Mo1.900μs] -21.05% (±0.00%)
    benchAssert # mixed, empty array,mixed,.R1 I3 - [Mo1.000μs vs. Mo1.203μs] -16.90% (±0.00%)
    benchAssert # mixed, non-empty array,mi.R5 I4 - [Mo1.000μs vs. Mo1.397μs] -28.40% (±0.00%)
    benchAssert # mixed, large array,mixed,.R1 I0 - [Mo1.000μs vs. Mo1.297μs] -22.88% (±0.00%)
    benchAssert # int, empty array,mixed, e.R1 I0 - [Mo0.900μs vs. Mo1.200μs] -25.00% (±0.00%)
    benchAssert # int, non-empty array,mixe.R1 I4 - [Mo1.000μs vs. Mo1.203μs] -16.90% (±0.00%)
    benchAssert # mixed, empty array,mixed,.R1 I3 - [Mo1.400μs vs. Mo1.600μs] -12.51% (±0.00%)
    benchAssert # mixed, non-empty array,mi.R2 I4 - [Mo1.400μs vs. Mo1.603μs] -12.68% (±0.00%)
    benchAssert # mixed, large array,mixed,.R1 I1 - [Mo1.397μs vs. Mo1.697μs] -17.68% (±3.60%)
    benchAssert # int, empty array,mixed, n.R1 I2 - [Mo1.400μs vs. Mo1.700μs] -17.64% (±0.00%)
    benchAssert # int, non-empty array,mixe.R1 I4 - [Mo1.400μs vs. Mo1.600μs] -12.50% (±0.00%)
    benchAssert # mixed, empty array,mixed,.R1 I4 - [Mo8.200μs vs. Mo8.597μs] -4.61% (±0.49%)
    benchAssert # mixed, non-empty array,mi.R1 I2 - [Mo8.207μs vs. Mo8.697μs] -5.63% (±1.18%)
    benchAssert # mixed, large array,mixed,.R1 I4 - [Mo8.213μs vs. Mo8.609μs] -4.60% (±0.97%)
    benchAssert # int, empty array,mixed, l.R1 I4 - [Mo8.200μs vs. Mo8.639μs] -5.08% (±0.00%)
    benchAssert # int, non-empty array,mixe.R1 I4 - [Mo8.200μs vs. Mo8.579μs] -4.42% (±0.49%)
    benchAssert # mixed, empty array,int, e.R1 I4 - [Mo1.000μs vs. Mo1.203μs] -16.90% (±0.00%)
    benchAssert # mixed, non-empty array,in.R1 I4 - [Mo1.000μs vs. Mo1.203μs] -16.90% (±0.00%)
    benchAssert # mixed, large array,int, e.R5 I4 - [Mo1.000μs vs. Mo1.300μs] -23.08% (±0.00%)
    benchAssert # int, empty array,int, emp.R5 I4 - [Mo1.000μs vs. Mo1.203μs] -16.90% (±0.00%)
    benchAssert # int, non-empty array,int,.R5 I4 - [Mo1.000μs vs. Mo1.300μs] -23.08% (±0.00%)
    benchAssert # mixed, empty array,int, n.R1 I1 - [Mo1.400μs vs. Mo1.600μs] -12.51% (±0.00%)
    benchAssert # mixed, non-empty array,in.R1 I4 - [Mo1.397μs vs. Mo1.600μs] -12.72% (±3.60%)
    benchAssert # mixed, large array,int, n.R1 I2 - [Mo1.400μs vs. Mo1.600μs] -12.51% (±0.00%)
    benchAssert # int, empty array,int, non.R1 I4 - [Mo1.400μs vs. Mo1.600μs] -12.51% (±0.00%)
    benchAssert # int, non-empty array,int,.R1 I0 - [Mo1.400μs vs. Mo1.603μs] -12.68% (±0.00%)
    benchMatch # mixed, empty array,mixed, .R5 I4 - [Mo0.100μs vs. Mo0.100μs] 0.00% (±0.00%)
    benchMatch # mixed, non-empty array,mix.R2 I4 - [Mo0.100μs vs. Mo0.100μs] 0.00% (±0.00%)
    benchMatch # mixed, large array,mixed, .R5 I4 - [Mo0.100μs vs. Mo0.100μs] 0.00% (±0.00%)
    benchMatch # int, empty array,mixed, em.R5 I4 - [Mo0.100μs vs. Mo0.100μs] 0.00% (±0.00%)
    benchMatch # int, non-empty array,mixed.R5 I4 - [Mo0.100μs vs. Mo0.100μs] 0.00% (±0.00%)
    benchMatch # mixed, empty array,mixed, .R5 I4 - [Mo0.500μs vs. Mo0.500μs] 0.00% (±0.00%)
    benchMatch # mixed, non-empty array,mix.R5 I4 - [Mo0.500μs vs. Mo0.500μs] 0.00% (±0.00%)
    benchMatch # mixed, large array,mixed, .R1 I4 - [Mo0.500μs vs. Mo0.500μs] 0.00% (±0.00%)
    benchMatch # int, empty array,mixed, no.R1 I4 - [Mo0.500μs vs. Mo0.500μs] 0.00% (±0.00%)
    benchMatch # int, non-empty array,mixed.R1 I2 - [Mo0.500μs vs. Mo0.500μs] 0.00% (±0.00%)
    benchMatch # mixed, empty array,mixed, .R4 I4 - [Mo6.986μs vs. Mo7.200μs] -2.98% (±1.40%)
    benchMatch # mixed, non-empty array,mix.R4 I4 - [Mo7.000μs vs. Mo7.120μs] -1.68% (±0.00%)
    benchMatch # mixed, large array,mixed, .R4 I4 - [Mo6.986μs vs. Mo7.197μs] -2.93% (±1.40%)
    benchMatch # int, empty array,mixed, la.R4 I4 - [Mo6.900μs vs. Mo7.152μs] -3.52% (±0.92%)
    benchMatch # int, non-empty array,mixed.R4 I4 - [Mo6.986μs vs. Mo7.161μs] -2.45% (±1.40%)
    benchMatch # mixed, empty array,int, em.R4 I4 - [Mo0.200μs vs. Mo0.200μs] 0.00% (±0.00%)
    benchMatch # mixed, non-empty array,int.R5 I4 - [Mo0.100μs vs. Mo0.100μs] 0.00% (±0.00%)
    benchMatch # mixed, large array,int, em.R5 I4 - [Mo0.100μs vs. Mo0.200μs] -50.00% (±0.00%)
    benchMatch # int, empty array,int, empt.R5 I4 - [Mo0.100μs vs. Mo0.100μs] 0.00% (±0.00%)
    benchMatch # int, non-empty array,int, .R5 I4 - [Mo0.100μs vs. Mo0.100μs] 0.00% (±0.00%)
    benchMatch # mixed, empty array,int, no.R5 I4 - [Mo0.500μs vs. Mo0.500μs] 0.00% (±0.00%)
    benchMatch # mixed, non-empty array,int.R5 I4 - [Mo0.500μs vs. Mo0.600μs] -16.67% (±0.00%)
    benchMatch # mixed, large array,int, no.R5 I4 - [Mo0.500μs vs. Mo0.500μs] 0.00% (±0.00%)
    benchMatch # int, empty array,int, non-.R5 I4 - [Mo0.500μs vs. Mo0.500μs] 0.00% (±0.00%)
    benchMatch # int, non-empty array,int, .R1 I1 - [Mo0.500μs vs. Mo0.500μs] 0.00% (±0.00%)

\Psl\Tests\Benchmark\Type\DictTypeBench

    benchCoerce # generic array, empty arra.R1 I4 - [Mo1.797μs vs. Mo2.300μs] -21.89% (±2.78%)
    benchCoerce # generic array, empty iter.R1 I4 - [Mo1.800μs vs. Mo2.303μs] -21.84% (±2.20%)
    benchCoerce # generic array, non-empty .R1 I4 - [Mo1.703μs vs. Mo2.400μs] -29.02% (±2.82%)
    benchCoerce # generic array, non-empty .R2 I4 - [Mo1.800μs vs. Mo2.397μs] -24.90% (±2.25%)
    benchCoerce # generic array, large arra.R1 I2 - [Mo1.703μs vs. Mo2.303μs] -26.05% (±2.82%)
    benchCoerce # generic array, large iter.R1 I4 - [Mo1.800μs vs. Mo2.397μs] -24.90% (±2.25%)
    benchCoerce # int array, empty array,ge.R1 I0 - [Mo1.700μs vs. Mo2.303μs] -26.19% (±2.33%)
    benchCoerce # int array, empty iterable.R1 I4 - [Mo1.797μs vs. Mo2.400μs] -25.13% (±2.78%)
    benchCoerce # int array, non-empty arra.R1 I4 - [Mo1.797μs vs. Mo2.397μs] -25.03% (±2.78%)
    benchCoerce # int array, non-empty iter.R1 I1 - [Mo1.703μs vs. Mo2.400μs] -29.02% (±2.82%)
    benchCoerce # int array, large array,ge.R1 I4 - [Mo1.797μs vs. Mo2.397μs] -25.03% (±2.78%)
    benchCoerce # int array, large iterable.R1 I2 - [Mo1.797μs vs. Mo2.397μs] -25.03% (±2.78%)
    benchCoerce # map, empty array,generic .R1 I4 - [Mo1.700μs vs. Mo2.397μs] -29.06% (±2.33%)
    benchCoerce # map, empty iterable,gener.R1 I3 - [Mo1.797μs vs. Mo2.397μs] -25.03% (±2.78%)
    benchCoerce # map, non-empty array,gene.R1 I4 - [Mo1.703μs vs. Mo2.303μs] -26.05% (±2.82%)
    benchCoerce # map, non-empty iterable,g.R1 I4 - [Mo1.800μs vs. Mo2.397μs] -24.90% (±2.25%)
    benchCoerce # map, large array,generic .R1 I4 - [Mo1.803μs vs. Mo2.439μs] -26.06% (±2.66%)
    benchCoerce # map, large iterable,gener.R2 I3 - [Mo1.800μs vs. Mo2.300μs] -21.72% (±2.20%)
    benchCoerce # generic array, empty arra.R2 I2 - [Mo1.900μs vs. Mo2.497μs] -23.91% (±2.13%)
    benchCoerce # generic array, empty iter.R2 I4 - [Mo1.900μs vs. Mo2.497μs] -23.91% (±2.13%)
    benchCoerce # generic array, non-empty .R2 I4 - [Mo1.897μs vs. Mo2.403μs] -21.08% (±2.63%)
    benchCoerce # generic array, non-empty .R2 I3 - [Mo1.900μs vs. Mo2.403μs] -20.95% (±2.13%)
    benchCoerce # generic array, large arra.R2 I1 - [Mo1.900μs vs. Mo2.403μs] -20.94% (±0.00%)
    benchCoerce # generic array, large iter.R2 I4 - [Mo1.900μs vs. Mo2.500μs] -24.00% (±2.13%)
    benchCoerce # int array, empty array,ge.R1 I0 - [Mo1.800μs vs. Mo2.497μs] -27.90% (±0.00%)
    benchCoerce # int array, empty iterable.R2 I1 - [Mo1.900μs vs. Mo2.400μs] -20.83% (±0.00%)
    benchCoerce # int array, non-empty arra.R2 I3 - [Mo1.897μs vs. Mo2.497μs] -24.03% (±2.63%)
    benchCoerce # int array, non-empty iter.R1 I4 - [Mo1.997μs vs. Mo2.439μs] -18.13% (±2.50%)
    benchCoerce # int array, large array,ge.R1 I4 - [Mo1.903μs vs. Mo2.500μs] -23.86% (±2.53%)
    benchCoerce # int array, large iterable.R1 I4 - [Mo1.803μs vs. Mo2.500μs] -27.86% (±2.66%)
    benchCoerce # map, empty array,generic .R1 I4 - [Mo1.900μs vs. Mo2.403μs] -20.95% (±2.13%)
    benchCoerce # map, empty iterable,gener.R1 I4 - [Mo1.900μs vs. Mo2.500μs] -24.00% (±2.13%)
    benchCoerce # map, non-empty array,gene.R2 I4 - [Mo1.900μs vs. Mo2.497μs] -23.90% (±0.00%)
    benchCoerce # map, non-empty iterable,g.R1 I2 - [Mo1.900μs vs. Mo2.500μs] -24.00% (±2.13%)
    benchCoerce # map, large array,generic .R1 I4 - [Mo1.900μs vs. Mo2.497μs] -23.89% (±2.08%)
    benchCoerce # map, large iterable,gener.R1 I1 - [Mo1.900μs vs. Mo2.497μs] -23.89% (±2.08%)
    benchCoerce # generic array, empty arra.R1 I4 - [Mo2.097μs vs. Mo2.797μs] -25.03% (±2.38%)
    benchCoerce # generic array, empty iter.R1 I4 - [Mo2.003μs vs. Mo2.739μs] -26.86% (±2.40%)
    benchCoerce # generic array, non-empty .R1 I4 - [Mo2.000μs vs. Mo2.661μs] -24.84% (±0.00%)
    benchCoerce # generic array, non-empty .R1 I3 - [Mo2.000μs vs. Mo2.797μs] -28.48% (±1.98%)
    benchCoerce # generic array, large arra.R1 I4 - [Mo2.000μs vs. Mo2.700μs] -25.92% (±0.00%)
    benchCoerce # generic array, large iter.R1 I4 - [Mo2.000μs vs. Mo2.757μs] -27.47% (±0.00%)
    benchCoerce # int array, empty array,ge.R1 I4 - [Mo2.000μs vs. Mo2.697μs] -25.83% (±0.00%)
    benchCoerce # int array, empty iterable.R1 I4 - [Mo2.000μs vs. Mo2.703μs] -26.01% (±1.98%)
    benchCoerce # int array, non-empty arra.R1 I4 - [Mo2.000μs vs. Mo2.800μs] -28.57% (±0.00%)
    benchCoerce # int array, non-empty iter.R1 I3 - [Mo2.000μs vs. Mo2.697μs] -25.83% (±0.00%)
    benchCoerce # int array, large array,ge.R1 I0 - [Mo2.003μs vs. Mo2.703μs] -25.89% (±2.40%)
    benchCoerce # int array, large iterable.R1 I4 - [Mo2.003μs vs. Mo2.757μs] -27.35% (±2.40%)
    benchCoerce # map, empty array,generic .R1 I4 - [Mo2.000μs vs. Mo2.603μs] -23.18% (±0.00%)
    benchCoerce # map, empty iterable,gener.R1 I4 - [Mo2.000μs vs. Mo2.661μs] -24.84% (±0.00%)
    benchCoerce # map, non-empty array,gene.R1 I4 - [Mo2.000μs vs. Mo2.739μs] -26.97% (±1.98%)
    benchCoerce # map, non-empty iterable,g.R1 I4 - [Mo2.000μs vs. Mo2.600μs] -23.08% (±1.98%)
    benchCoerce # map, large array,generic .R1 I4 - [Mo2.000μs vs. Mo2.697μs] -25.83% (±0.00%)
    benchCoerce # map, large iterable,gener.R1 I0 - [Mo2.000μs vs. Mo2.600μs] -23.08% (±1.98%)
    benchCoerce # generic array, empty arra.R1 I0 - [Mo2.197μs vs. Mo2.900μs] -24.25% (±2.27%)
    benchCoerce # generic array, empty iter.R1 I4 - [Mo2.197μs vs. Mo2.900μs] -24.26% (±2.27%)
    benchCoerce # generic array, non-empty .R1 I2 - [Mo2.300μs vs. Mo2.900μs] -20.70% (±0.00%)
    benchCoerce # generic array, non-empty .R5 I4 - [Mo2.297μs vs. Mo2.900μs] -20.80% (±2.17%)
    benchCoerce # generic array, large arra.R5 I4 - [Mo2.103μs vs. Mo2.900μs] -27.47% (±2.29%)
    benchCoerce # generic array, large iter.R1 I1 - [Mo2.297μs vs. Mo2.803μs] -18.07% (±2.17%)
    benchCoerce # int array, empty array,ge.R1 I4 - [Mo2.200μs vs. Mo2.900μs] -24.14% (±1.83%)
    benchCoerce # int array, empty iterable.R1 I1 - [Mo2.203μs vs. Mo2.900μs] -24.02% (±2.19%)
    benchCoerce # int array, non-empty arra.R1 I4 - [Mo2.203μs vs. Mo2.843μs] -22.49% (±2.19%)
    benchCoerce # int array, non-empty iter.R1 I4 - [Mo2.200μs vs. Mo2.800μs] -21.44% (±2.87%)
    benchCoerce # int array, large array,ge.R1 I3 - [Mo2.203μs vs. Mo2.900μs] -24.02% (±2.19%)
    benchCoerce # int array, large iterable.R1 I4 - [Mo2.200μs vs. Mo2.900μs] -24.15% (±1.83%)
    benchCoerce # map, empty array,generic .R1 I0 - [Mo2.203μs vs. Mo2.900μs] -24.02% (±2.19%)
    benchCoerce # map, empty iterable,gener.R1 I4 - [Mo2.203μs vs. Mo2.861μs] -22.99% (±2.19%)
    benchCoerce # map, non-empty array,gene.R1 I4 - [Mo2.297μs vs. Mo2.861μs] -19.73% (±2.17%)
    benchCoerce # map, non-empty iterable,g.R1 I4 - [Mo2.197μs vs. Mo2.861μs] -23.22% (±2.27%)
    benchCoerce # map, large array,generic .R1 I4 - [Mo2.197μs vs. Mo2.843μs] -22.72% (±2.27%)
    benchCoerce # map, large iterable,gener.R1 I4 - [Mo2.100μs vs. Mo2.939μs] -28.54% (±1.89%)
    benchCoerce # generic array, empty arra.R1 I4 - [Mo18.103μs vs. Mo326.937μs] -94.46% (±0.75%)
    benchCoerce # generic array, empty iter.R1 I4 - [Mo18.052μs vs. Mo325.946μs] -94.46% (±0.61%)
    benchCoerce # generic array, non-empty .R1 I4 - [Mo18.599μs vs. Mo324.214μs] -94.26% (±1.22%)
    benchCoerce # generic array, non-empty .R1 I4 - [Mo18.170μs vs. Mo327.802μs] -94.46% (±1.94%)
    benchCoerce # generic array, large arra.R1 I4 - [Mo18.247μs vs. Mo326.870μs] -94.42% (±0.73%)
    benchCoerce # generic array, large iter.R1 I4 - [Mo18.092μs vs. Mo328.002μs] -94.48% (±0.66%)
    benchCoerce # int array, empty array,ge.R1 I4 - [Mo18.126μs vs. Mo329.762μs] -94.50% (±0.88%)
    benchCoerce # int array, empty iterable.R1 I4 - [Mo18.317μs vs. Mo327.166μs] -94.40% (±0.88%)
    benchCoerce # int array, non-empty arra.R1 I4 - [Mo18.052μs vs. Mo326.338μs] -94.47% (±0.81%)
    benchCoerce # int array, non-empty iter.R1 I4 - [Mo18.066μs vs. Mo329.029μs] -94.51% (±1.57%)
    benchCoerce # int array, large array,ge.R1 I4 - [Mo18.116μs vs. Mo327.405μs] -94.47% (±1.37%)
    benchCoerce # int array, large iterable.R1 I4 - [Mo18.081μs vs. Mo328.705μs] -94.50% (±0.75%)
    benchCoerce # map, empty array,generic .R1 I4 - [Mo18.122μs vs. Mo324.396μs] -94.41% (±1.78%)
    benchCoerce # map, empty iterable,gener.R1 I4 - [Mo18.189μs vs. Mo326.667μs] -94.43% (±2.25%)
    benchCoerce # map, non-empty array,gene.R1 I4 - [Mo18.227μs vs. Mo326.286μs] -94.41% (±2.13%)
    benchCoerce # map, non-empty iterable,g.R1 I4 - [Mo18.183μs vs. Mo332.231μs] -94.53% (±0.88%)
    benchCoerce # map, large array,generic .R1 I4 - [Mo18.102μs vs. Mo324.131μs] -94.42% (±1.15%)
    benchCoerce # map, large iterable,gener.R1 I4 - [Mo18.112μs vs. Mo326.523μs] -94.45% (±1.17%)
    benchCoerce # generic array, empty arra.R1 I0 - [Mo21.448μs vs. Mo335.466μs] -93.61% (±0.51%)
    benchCoerce # generic array, empty iter.R1 I4 - [Mo21.252μs vs. Mo332.853μs] -93.62% (±0.69%)
    benchCoerce # generic array, non-empty .R1 I4 - [Mo21.309μs vs. Mo331.768μs] -93.58% (±0.48%)
    benchCoerce # generic array, non-empty .R1 I4 - [Mo21.389μs vs. Mo336.761μs] -93.65% (±1.39%)
    benchCoerce # generic array, large arra.R1 I4 - [Mo21.352μs vs. Mo333.064μs] -93.59% (±0.51%)
    benchCoerce # generic array, large iter.R1 I4 - [Mo21.203μs vs. Mo332.537μs] -93.62% (±0.23%)
    benchCoerce # int array, empty array,ge.R1 I4 - [Mo21.200μs vs. Mo334.033μs] -93.65% (±0.19%)
    benchCoerce # int array, empty iterable.R1 I4 - [Mo21.284μs vs. Mo334.392μs] -93.64% (±1.60%)
    benchCoerce # int array, non-empty arra.R1 I4 - [Mo21.378μs vs. Mo331.303μs] -93.55% (±0.70%)
    benchCoerce # int array, non-empty iter.R1 I0 - [Mo21.357μs vs. Mo332.874μs] -93.58% (±1.53%)
    benchCoerce # int array, large array,ge.R1 I4 - [Mo21.292μs vs. Mo332.954μs] -93.61% (±0.56%)
    benchCoerce # int array, large iterable.R1 I4 - [Mo21.400μs vs. Mo334.819μs] -93.61% (±0.19%)
    benchCoerce # map, empty array,generic .R1 I4 - [Mo21.395μs vs. Mo334.542μs] -93.60% (±1.08%)
    benchCoerce # map, empty iterable,gener.R1 I4 - [Mo21.504μs vs. Mo334.089μs] -93.56% (±1.48%)
    benchCoerce # map, non-empty array,gene.R1 I4 - [Mo21.554μs vs. Mo332.130μs] -93.51% (±1.19%)
    benchCoerce # map, non-empty iterable,g.R1 I4 - [Mo21.202μs vs. Mo331.910μs] -93.61% (±1.53%)
    benchCoerce # map, large array,generic .R4 I4 - [Mo21.719μs vs. Mo342.579μs] -93.66% (±1.27%)
    benchCoerce # map, large iterable,gener.R2 I4 - [Mo21.437μs vs. Mo337.972μs] -93.66% (±1.90%)
    benchCoerce # generic array, empty arra.R1 I2 - [Mo1.703μs vs. Mo2.200μs] -22.58% (±2.82%)
    benchCoerce # generic array, empty iter.R1 I4 - [Mo1.603μs vs. Mo2.200μs] -27.13% (±2.99%)
    benchCoerce # generic array, non-empty .R1 I4 - [Mo1.697μs vs. Mo2.200μs] -22.89% (±2.95%)
    benchCoerce # generic array, non-empty .R1 I4 - [Mo1.600μs vs. Mo2.297μs] -30.33% (±2.47%)
    benchCoerce # generic array, large arra.R1 I4 - [Mo1.697μs vs. Mo2.200μs] -22.89% (±2.95%)
    benchCoerce # generic array, large iter.R2 I3 - [Mo1.697μs vs. Mo2.297μs] -26.12% (±2.95%)
    benchCoerce # int array, empty array,in.R2 I4 - [Mo1.603μs vs. Mo2.303μs] -30.39% (±2.99%)
    benchCoerce # int array, empty iterable.R1 I0 - [Mo1.703μs vs. Mo2.300μs] -25.94% (±2.82%)
    benchCoerce # int array, non-empty arra.R1 I4 - [Mo1.697μs vs. Mo2.303μs] -26.34% (±2.95%)
    benchCoerce # int array, non-empty iter.R1 I4 - [Mo1.703μs vs. Mo2.200μs] -22.58% (±2.82%)
    benchCoerce # int array, large array,in.R1 I4 - [Mo1.600μs vs. Mo2.200μs] -27.27% (±2.47%)
    benchCoerce # int array, large iterable.R1 I4 - [Mo1.600μs vs. Mo2.203μs] -27.37% (±2.47%)
    benchCoerce # map, empty array,int arra.R1 I1 - [Mo1.697μs vs. Mo2.203μs] -22.99% (±2.95%)
    benchCoerce # map, empty iterable,int a.R1 I4 - [Mo1.603μs vs. Mo2.300μs] -30.28% (±2.99%)
    benchCoerce # map, non-empty array,int .R1 I0 - [Mo1.600μs vs. Mo2.397μs] -33.23% (±2.47%)
    benchCoerce # map, non-empty iterable,i.R1 I4 - [Mo1.797μs vs. Mo2.297μs] -21.77% (±2.78%)
    benchCoerce # map, large array,int arra.R1 I4 - [Mo1.603μs vs. Mo2.200μs] -27.13% (±2.99%)
    benchCoerce # map, large iterable,int a.R1 I2 - [Mo1.600μs vs. Mo2.243μs] -28.65% (±2.47%)
    benchCoerce # generic array, empty arra.R1 I4 - [Mo1.703μs vs. Mo2.400μs] -29.02% (±2.82%)
    benchCoerce # generic array, empty iter.R1 I4 - [Mo1.797μs vs. Mo2.303μs] -22.00% (±2.78%)
    benchCoerce # generic array, non-empty .R1 I0 - [Mo1.797μs vs. Mo2.439μs] -26.33% (±2.78%)
    benchCoerce # generic array, non-empty .R1 I4 - [Mo1.703μs vs. Mo2.400μs] -29.02% (±2.82%)
    benchCoerce # generic array, large arra.R1 I4 - [Mo1.703μs vs. Mo2.300μs] -25.94% (±2.82%)
    benchCoerce # generic array, large iter.R1 I4 - [Mo1.700μs vs. Mo2.400μs] -29.15% (±2.33%)
    benchCoerce # int array, empty array,in.R2 I2 - [Mo1.700μs vs. Mo2.397μs] -29.06% (±2.33%)
    benchCoerce # int array, empty iterable.R5 I4 - [Mo1.797μs vs. Mo2.400μs] -25.13% (±2.78%)
    benchCoerce # int array, non-empty arra.R5 I4 - [Mo1.703μs vs. Mo2.300μs] -25.94% (±2.82%)
    benchCoerce # int array, non-empty iter.R5 I4 - [Mo1.700μs vs. Mo2.400μs] -29.16% (±2.33%)
    benchCoerce # int array, large array,in.R5 I4 - [Mo1.703μs vs. Mo2.400μs] -29.02% (±2.82%)
    benchCoerce # int array, large iterable.R5 I4 - [Mo1.700μs vs. Mo2.397μs] -29.06% (±2.33%)
    benchCoerce # map, empty array,int arra.R5 I4 - [Mo1.703μs vs. Mo2.300μs] -25.95% (±2.82%)
    benchCoerce # map, empty iterable,int a.R5 I4 - [Mo1.797μs vs. Mo2.397μs] -25.03% (±2.78%)
    benchCoerce # map, non-empty array,int .R5 I4 - [Mo1.797μs vs. Mo2.400μs] -25.13% (±2.78%)
    benchCoerce # map, non-empty iterable,i.R2 I3 - [Mo1.700μs vs. Mo2.400μs] -29.16% (±2.33%)
    benchCoerce # map, large array,int arra.R2 I4 - [Mo1.703μs vs. Mo2.400μs] -29.02% (±2.82%)
    benchCoerce # map, large iterable,int a.R1 I1 - [Mo1.703μs vs. Mo2.303μs] -26.05% (±2.82%)
    benchCoerce # generic array, empty arra.R1 I2 - [Mo2.297μs vs. Mo2.897μs] -20.71% (±2.17%)
    benchCoerce # generic array, empty iter.R1 I4 - [Mo2.297μs vs. Mo2.803μs] -18.07% (±2.17%)
    benchCoerce # generic array, non-empty .R1 I4 - [Mo2.203μs vs. Mo2.900μs] -24.02% (±2.19%)
    benchCoerce # generic array, non-empty .R1 I4 - [Mo2.297μs vs. Mo2.900μs] -20.80% (±2.17%)
    benchCoerce # generic array, large arra.R1 I4 - [Mo2.300μs vs. Mo2.900μs] -20.70% (±2.75%)
    benchCoerce # generic array, large iter.R1 I4 - [Mo2.397μs vs. Mo2.800μs] -14.40% (±2.08%)
    benchCoerce # int array, empty array,in.R1 I4 - [Mo2.203μs vs. Mo2.900μs] -24.02% (±2.19%)
    benchCoerce # int array, empty iterable.R2 I4 - [Mo2.200μs vs. Mo2.861μs] -23.11% (±2.87%)
    benchCoerce # int array, non-empty arra.R2 I4 - [Mo2.300μs vs. Mo2.900μs] -20.69% (±2.75%)
    benchCoerce # int array, non-empty iter.R2 I4 - [Mo2.297μs vs. Mo2.900μs] -20.80% (±2.17%)
    benchCoerce # int array, large array,in.R2 I4 - [Mo2.203μs vs. Mo2.803μs] -21.40% (±2.19%)
    benchCoerce # int array, large iterable.R2 I4 - [Mo2.300μs vs. Mo2.807μs] -18.06% (±1.75%)
    benchCoerce # map, empty array,int arra.R2 I4 - [Mo2.300μs vs. Mo2.803μs] -17.96% (±1.75%)
    benchCoerce # map, empty iterable,int a.R1 I1 - [Mo2.297μs vs. Mo2.897μs] -20.71% (±2.17%)
    benchCoerce # map, non-empty array,int .R1 I4 - [Mo2.200μs vs. Mo2.900μs] -24.14% (±1.80%)
    benchCoerce # map, non-empty iterable,i.R1 I4 - [Mo2.200μs vs. Mo2.897μs] -24.05% (±0.00%)
    benchCoerce # map, large array,int arra.R1 I4 - [Mo2.297μs vs. Mo2.900μs] -20.80% (±2.17%)
    benchCoerce # map, large iterable,int a.R1 I4 - [Mo2.203μs vs. Mo2.900μs] -24.03% (±2.19%)
    benchCoerce # generic array, empty arra.R1 I4 - [Mo2.500μs vs. Mo3.100μs] -19.35% (±0.00%)
    benchCoerce # generic array, empty iter.R1 I4 - [Mo2.500μs vs. Mo3.061μs] -18.34% (±1.61%)
    benchCoerce # generic array, non-empty .R1 I4 - [Mo2.500μs vs. Mo3.100μs] -19.36% (±1.61%)
    benchCoerce # generic array, non-empty .R1 I4 - [Mo2.500μs vs. Mo3.103μs] -19.43% (±1.59%)
    benchCoerce # generic array, large arra.R1 I4 - [Mo2.500μs vs. Mo3.097μs] -19.27% (±1.61%)
    benchCoerce # generic array, large iter.R1 I4 - [Mo2.500μs vs. Mo3.000μs] -16.68% (±2.53%)
    benchCoerce # int array, empty array,in.R1 I4 - [Mo2.500μs vs. Mo3.000μs] -16.68% (±1.61%)
    benchCoerce # int array, empty iterable.R1 I4 - [Mo2.500μs vs. Mo3.003μs] -16.76% (±0.00%)
    benchCoerce # int array, non-empty arra.R5 I4 - [Mo2.500μs vs. Mo3.007μs] -16.85% (±0.00%)
    benchCoerce # int array, non-empty iter.R5 I4 - [Mo2.500μs vs. Mo3.013μs] -17.02% (±1.59%)
    benchCoerce # int array, large array,in.R5 I4 - [Mo2.500μs vs. Mo3.100μs] -19.35% (±0.00%)
    benchCoerce # int array, large iterable.R5 I4 - [Mo2.500μs vs. Mo3.100μs] -19.35% (±0.00%)
    benchCoerce # map, empty array,int arra.R5 I4 - [Mo2.500μs vs. Mo3.000μs] -16.67% (±0.00%)
    benchCoerce # map, empty iterable,int a.R5 I4 - [Mo2.500μs vs. Mo3.000μs] -16.67% (±0.00%)
    benchCoerce # map, non-empty array,int .R5 I4 - [Mo2.500μs vs. Mo3.013μs] -17.02% (±0.00%)
    benchCoerce # map, non-empty iterable,i.R5 I4 - [Mo2.500μs vs. Mo3.097μs] -19.27% (±0.00%)
    benchCoerce # map, large array,int arra.R5 I4 - [Mo2.500μs vs. Mo3.000μs] -16.67% (±1.59%)
    benchCoerce # map, large iterable,int a.R5 I4 - [Mo2.500μs vs. Mo3.097μs] -19.27% (±0.00%)
    benchCoerce # generic array, empty arra.R5 I4 - [Mo16.403μs vs. Mo17.213μs] -4.70% (±0.30%)
    benchCoerce # generic array, empty iter.R1 I4 - [Mo16.500μs vs. Mo17.345μs] -4.88% (±0.38%)
    benchCoerce # generic array, non-empty .R1 I4 - [Mo16.413μs vs. Mo17.114μs] -4.10% (±0.49%)
    benchCoerce # generic array, non-empty .R1 I4 - [Mo16.461μs vs. Mo17.287μs] -4.78% (±0.45%)
    benchCoerce # generic array, large arra.R1 I4 - [Mo16.403μs vs. Mo17.390μs] -5.67% (±0.30%)
    benchCoerce # generic array, large iter.R1 I4 - [Mo16.513μs vs. Mo17.516μs] -5.73% (±3.05%)
    benchCoerce # int array, empty array,in.R1 I4 - [Mo16.476μs vs. Mo17.234μs] -4.40% (±2.27%)
    benchCoerce # int array, empty iterable.R1 I4 - [Mo16.424μs vs. Mo17.345μs] -5.31% (±1.17%)
    benchCoerce # int array, non-empty arra.R1 I4 - [Mo16.455μs vs. Mo17.297μs] -4.87% (±0.71%)
    benchCoerce # int array, non-empty iter.R1 I4 - [Mo16.497μs vs. Mo17.380μs] -5.08% (±0.30%)
    benchCoerce # int array, large array,in.R1 I4 - [Mo16.461μs vs. Mo17.209μs] -4.34% (±0.45%)
    benchCoerce # int array, large iterable.R1 I4 - [Mo16.453μs vs. Mo17.209μs] -4.39% (±2.06%)
    benchCoerce # map, empty array,int arra.R1 I4 - [Mo16.539μs vs. Mo17.300μs] -4.40% (±0.45%)
    benchCoerce # map, empty iterable,int a.R1 I4 - [Mo16.539μs vs. Mo17.297μs] -4.38% (±0.45%)
    benchCoerce # map, non-empty array,int .R1 I4 - [Mo16.426μs vs. Mo17.302μs] -5.06% (±0.97%)
    benchCoerce # map, non-empty iterable,i.R1 I4 - [Mo16.409μs vs. Mo17.192μs] -4.55% (±0.62%)
    benchCoerce # map, large array,int arra.R1 I4 - [Mo16.608μs vs. Mo17.209μs] -3.49% (±0.73%)
    benchCoerce # map, large iterable,int a.R1 I0 - [Mo16.539μs vs. Mo17.304μs] -4.42% (±0.45%)
    benchCoerce # generic array, empty arra.R1 I4 - [Mo19.658μs vs. Mo20.890μs] -5.90% (±2.44%)
    benchCoerce # generic array, empty iter.R1 I4 - [Mo19.502μs vs. Mo20.728μs] -5.91% (±2.03%)
    benchCoerce # generic array, non-empty .R1 I4 - [Mo19.561μs vs. Mo20.830μs] -6.09% (±0.38%)
    benchCoerce # generic array, non-empty .R5 I4 - [Mo19.513μs vs. Mo20.752μs] -5.97% (±0.41%)
    benchCoerce # generic array, large arra.R5 I4 - [Mo19.603μs vs. Mo20.789μs] -5.71% (±0.87%)
    benchCoerce # generic array, large iter.R5 I4 - [Mo19.552μs vs. Mo20.978μs] -6.80% (±1.14%)
    benchCoerce # int array, empty array,in.R5 I4 - [Mo19.629μs vs. Mo20.857μs] -5.89% (±2.20%)
    benchCoerce # int array, empty iterable.R5 I4 - [Mo19.576μs vs. Mo20.835μs] -6.04% (±1.91%)
    benchCoerce # int array, non-empty arra.R5 I4 - [Mo19.500μs vs. Mo20.761μs] -6.07% (±0.20%)
    benchCoerce # int array, non-empty iter.R5 I4 - [Mo19.524μs vs. Mo20.800μs] -6.13% (±0.99%)
    benchCoerce # int array, large array,in.R5 I4 - [Mo19.500μs vs. Mo20.791μs] -6.21% (±0.41%)
    benchCoerce # int array, large iterable.R5 I4 - [Mo19.688μs vs. Mo20.889μs] -5.75% (±2.36%)
    benchCoerce # map, empty array,int arra.R5 I4 - [Mo19.517μs vs. Mo20.820μs] -6.26% (±1.24%)
    benchCoerce # map, empty iterable,int a.R5 I4 - [Mo19.570μs vs. Mo20.925μs] -6.47% (±0.94%)
    benchCoerce # map, non-empty array,int .R1 I1 - [Mo19.513μs vs. Mo20.752μs] -5.97% (±0.41%)
    benchCoerce # map, non-empty iterable,i.R1 I4 - [Mo19.657μs vs. Mo21.423μs] -8.24% (±0.46%)
    benchCoerce # map, large array,int arra.R1 I4 - [Mo19.779μs vs. Mo20.814μs] -4.97% (±0.82%)
    benchCoerce # map, large iterable,int a.R1 I4 - [Mo19.639μs vs. Mo20.753μs] -5.37% (±0.38%)
    benchCoerce # generic array, empty arra.R1 I4 - [Mo1.600μs vs. Mo2.300μs] -30.43% (±2.47%)
    benchCoerce # generic array, empty iter.R1 I4 - [Mo1.600μs vs. Mo2.303μs] -30.53% (±2.47%)
    benchCoerce # generic array, non-empty .R1 I2 - [Mo1.703μs vs. Mo2.397μs] -28.93% (±2.82%)
    benchCoerce # generic array, non-empty .R1 I4 - [Mo1.603μs vs. Mo2.300μs] -30.28% (±2.99%)
    benchCoerce # generic array, large arra.R1 I4 - [Mo1.700μs vs. Mo2.203μs] -22.85% (±2.38%)
    benchCoerce # generic array, large iter.R1 I4 - [Mo1.600μs vs. Mo2.303μs] -30.53% (±2.47%)
    benchCoerce # int array, empty array,ma.R1 I4 - [Mo1.603μs vs. Mo2.203μs] -27.23% (±2.99%)
    benchCoerce # int array, empty iterable.R1 I4 - [Mo1.700μs vs. Mo2.203μs] -22.85% (±2.38%)
    benchCoerce # int array, non-empty arra.R2 I3 - [Mo1.700μs vs. Mo2.300μs] -26.09% (±2.38%)
    benchCoerce # int array, non-empty iter.R2 I4 - [Mo1.697μs vs. Mo2.297μs] -26.12% (±2.95%)
    benchCoerce # int array, large array,ma.R2 I3 - [Mo1.697μs vs. Mo2.297μs] -26.12% (±2.95%)
    benchCoerce # int array, large iterable.R2 I4 - [Mo1.700μs vs. Mo2.297μs] -25.98% (±0.00%)
    benchCoerce # map, empty array,map, emp.R2 I4 - [Mo1.697μs vs. Mo2.297μs] -26.12% (±2.95%)
    benchCoerce # map, empty iterable,map, .R1 I0 - [Mo1.697μs vs. Mo2.200μs] -22.89% (±2.95%)
    benchCoerce # map, non-empty array,map,.R4 I4 - [Mo1.700μs vs. Mo2.200μs] -22.74% (±2.38%)
    benchCoerce # map, non-empty iterable,m.R1 I2 - [Mo1.800μs vs. Mo2.200μs] -18.20% (±2.25%)
    benchCoerce # map, large array,map, emp.R1 I0 - [Mo1.603μs vs. Mo2.397μs] -33.10% (±2.99%)
    benchCoerce # map, large iterable,map, .R1 I4 - [Mo1.603μs vs. Mo2.400μs] -33.19% (±2.99%)
    benchCoerce # generic array, empty arra.R1 I4 - [Mo1.703μs vs. Mo2.439μs] -30.16% (±2.82%)
    benchCoerce # generic array, empty iter.R5 I4 - [Mo1.797μs vs. Mo2.397μs] -25.03% (±2.78%)
    benchCoerce # generic array, non-empty .R5 I4 - [Mo1.800μs vs. Mo2.400μs] -24.99% (±2.20%)
    benchCoerce # generic array, non-empty .R1 I4 - [Mo1.797μs vs. Mo2.300μs] -21.89% (±2.78%)
    benchCoerce # generic array, large arra.R1 I4 - [Mo1.703μs vs. Mo2.400μs] -29.03% (±2.82%)
    benchCoerce # generic array, large iter.R3 I4 - [Mo1.703μs vs. Mo2.397μs] -28.93% (±2.82%)
    benchCoerce # int array, empty array,ma.R3 I4 - [Mo1.700μs vs. Mo2.300μs] -26.08% (±2.33%)
    benchCoerce # int array, empty iterable.R1 I1 - [Mo1.703μs vs. Mo2.400μs] -29.03% (±2.82%)
    benchCoerce # int array, non-empty arra.R2 I1 - [Mo1.800μs vs. Mo2.400μs] -25.00% (±2.25%)
    benchCoerce # int array, non-empty iter.R2 I4 - [Mo1.800μs vs. Mo2.397μs] -24.90% (±2.25%)
    benchCoerce # int array, large array,ma.R1 I3 - [Mo1.700μs vs. Mo2.397μs] -29.06% (±2.33%)
    benchCoerce # int array, large iterable.R1 I1 - [Mo1.803μs vs. Mo2.397μs] -24.76% (±2.66%)
    benchCoerce # map, empty array,map, emp.R1 I1 - [Mo1.703μs vs. Mo2.397μs] -28.93% (±2.82%)
    benchCoerce # map, empty iterable,map, .R1 I4 - [Mo1.797μs vs. Mo2.303μs] -22.00% (±2.78%)
    benchCoerce # map, non-empty array,map,.R1 I4 - [Mo1.800μs vs. Mo2.397μs] -24.90% (±0.00%)
    benchCoerce # map, non-empty iterable,m.R1 I4 - [Mo1.800μs vs. Mo2.400μs] -25.01% (±2.25%)
    benchCoerce # map, large array,map, emp.R1 I1 - [Mo1.800μs vs. Mo2.397μs] -24.89% (±2.20%)
    benchCoerce # map, large iterable,map, .R4 I4 - [Mo1.797μs vs. Mo2.303μs] -22.00% (±2.78%)
    benchCoerce # generic array, empty arra.R1 I1 - [Mo2.303μs vs. Mo2.839μs] -18.87% (±2.09%)
    benchCoerce # generic array, empty iter.R1 I0 - [Mo2.203μs vs. Mo2.897μs] -23.94% (±2.19%)
    benchCoerce # generic array, non-empty .R1 I4 - [Mo2.297μs vs. Mo2.861μs] -19.73% (±2.17%)
    benchCoerce # generic array, non-empty .R1 I2 - [Mo2.297μs vs. Mo2.897μs] -20.71% (±2.17%)
    benchCoerce # generic array, large arra.R1 I4 - [Mo2.300μs vs. Mo2.900μs] -20.68% (±1.72%)
    benchCoerce # generic array, large iter.R5 I4 - [Mo2.300μs vs. Mo2.861μs] -19.62% (±2.75%)
    benchCoerce # int array, empty array,ma.R1 I0 - [Mo2.203μs vs. Mo2.813μs] -21.67% (±2.19%)
    benchCoerce # int array, empty iterable.R1 I4 - [Mo2.300μs vs. Mo2.897μs] -20.59% (±1.72%)
    benchCoerce # int array, non-empty arra.R1 I1 - [Mo2.397μs vs. Mo2.900μs] -17.35% (±2.08%)
    benchCoerce # int array, non-empty iter.R1 I4 - [Mo2.203μs vs. Mo2.900μs] -24.02% (±2.19%)
    benchCoerce # int array, large array,ma.R1 I4 - [Mo2.243μs vs. Mo2.800μs] -19.91% (±3.89%)
    benchCoerce # int array, large iterable.R5 I4 - [Mo2.300μs vs. Mo2.897μs] -20.61% (±1.75%)
    benchCoerce # map, empty array,map, non.R1 I2 - [Mo2.400μs vs. Mo2.900μs] -17.24% (±1.68%)
    benchCoerce # map, empty iterable,map, .R1 I1 - [Mo2.200μs vs. Mo2.803μs] -21.52% (±0.00%)
    benchCoerce # map, non-empty array,map,.R1 I3 - [Mo2.200μs vs. Mo2.897μs] -24.04% (±1.80%)
    benchCoerce # map, non-empty iterable,m.R4 I3 - [Mo2.243μs vs. Mo2.897μs] -22.58% (±3.89%)
    benchCoerce # map, large array,map, non.R3 I4 - [Mo2.300μs vs. Mo2.800μs] -17.87% (±2.75%)
    benchCoerce # map, large iterable,map, .R2 I4 - [Mo2.203μs vs. Mo2.897μs] -23.94% (±2.19%)
    benchCoerce # generic array, empty arra.R2 I4 - [Mo2.500μs vs. Mo3.013μs] -17.03% (±1.61%)
    benchCoerce # generic array, empty iter.R2 I4 - [Mo2.500μs vs. Mo3.003μs] -16.76% (±0.00%)
    benchCoerce # generic array, non-empty .R2 I4 - [Mo2.500μs vs. Mo3.003μs] -16.76% (±0.00%)
    benchCoerce # generic array, non-empty .R2 I4 - [Mo2.500μs vs. Mo3.013μs] -17.02% (±0.00%)
    benchCoerce # generic array, large arra.R5 I4 - [Mo2.500μs vs. Mo3.061μs] -18.33% (±0.00%)
    benchCoerce # generic array, large iter.R5 I4 - [Mo2.500μs vs. Mo3.100μs] -19.35% (±0.00%)
    benchCoerce # int array, empty array,ma.R5 I4 - [Mo2.500μs vs. Mo3.013μs] -17.03% (±1.61%)
    benchCoerce # int array, empty iterable.R5 I4 - [Mo2.500μs vs. Mo3.003μs] -16.76% (±0.00%)
    benchCoerce # int array, non-empty arra.R5 I4 - [Mo2.500μs vs. Mo3.003μs] -16.76% (±0.00%)
    benchCoerce # int array, non-empty iter.R5 I4 - [Mo2.500μs vs. Mo3.097μs] -19.27% (±0.00%)
    benchCoerce # int array, large array,ma.R5 I4 - [Mo2.500μs vs. Mo3.000μs] -16.67% (±0.00%)
    benchCoerce # int array, large iterable.R5 I4 - [Mo2.500μs vs. Mo3.100μs] -19.35% (±0.00%)
    benchCoerce # map, empty array,map, non.R5 I4 - [Mo2.500μs vs. Mo3.187μs] -21.55% (±1.59%)
    benchCoerce # map, empty iterable,map, .R5 I4 - [Mo2.500μs vs. Mo3.097μs] -19.26% (±1.59%)
    benchCoerce # map, non-empty array,map,.R5 I4 - [Mo2.500μs vs. Mo3.061μs] -18.33% (±0.00%)
    benchCoerce # map, non-empty iterable,m.R5 I4 - [Mo2.500μs vs. Mo3.013μs] -17.02% (±0.00%)
    benchCoerce # map, large array,map, non.R5 I4 - [Mo2.500μs vs. Mo3.003μs] -16.75% (±1.59%)
    benchCoerce # map, large iterable,map, .R5 I4 - [Mo2.500μs vs. Mo3.013μs] -17.03% (±1.61%)
    benchCoerce # generic array, empty arra.R5 I4 - [Mo17.425μs vs. Mo18.039μs] -3.41% (±1.33%)
    benchCoerce # generic array, empty iter.R5 I4 - [Mo17.400μs vs. Mo17.997μs] -3.32% (±0.00%)
    benchCoerce # generic array, non-empty .R1 I1 - [Mo17.400μs vs. Mo17.978μs] -3.22% (±0.36%)
    benchCoerce # generic array, non-empty .R1 I4 - [Mo17.400μs vs. Mo18.052μs] -3.61% (±0.36%)
    benchCoerce # generic array, large arra.R1 I4 - [Mo17.387μs vs. Mo18.000μs] -3.41% (±0.46%)
    benchCoerce # generic array, large iter.R1 I4 - [Mo17.449μs vs. Mo18.000μs] -3.06% (±2.20%)
    benchCoerce # int array, empty array,ma.R1 I4 - [Mo17.400μs vs. Mo18.000μs] -3.33% (±0.00%)
    benchCoerce # int array, empty iterable.R1 I4 - [Mo17.433μs vs. Mo18.048μs] -3.40% (±2.62%)
    benchCoerce # int array, non-empty arra.R1 I4 - [Mo17.400μs vs. Mo18.002μs] -3.34% (±0.46%)
    benchCoerce # int array, non-empty iter.R1 I4 - [Mo17.400μs vs. Mo18.000μs] -3.33% (±0.00%)
    benchCoerce # int array, large array,ma.R4 I4 - [Mo17.378μs vs. Mo17.997μs] -3.44% (±1.45%)
    benchCoerce # int array, large iterable.R5 I4 - [Mo17.400μs vs. Mo18.000μs] -3.34% (±0.46%)
    benchCoerce # map, empty array,map, lar.R5 I4 - [Mo17.401μs vs. Mo18.000μs] -3.33% (±0.92%)
    benchCoerce # map, empty iterable,map, .R5 I4 - [Mo17.403μs vs. Mo18.001μs] -3.32% (±0.28%)
    benchCoerce # map, non-empty array,map,.R5 I4 - [Mo17.978μs vs. Mo17.983μs] -0.03% (±1.83%)
    benchCoerce # map, non-empty iterable,m.R5 I4 - [Mo17.387μs vs. Mo17.986μs] -3.33% (±0.46%)
    benchCoerce # map, large array,map, lar.R5 I4 - [Mo17.378μs vs. Mo18.000μs] -3.46% (±1.45%)
    benchCoerce # map, large iterable,map, .R1 I3 - [Mo17.400μs vs. Mo18.000μs] -3.33% (±0.23%)
    benchCoerce # generic array, empty arra.R1 I4 - [Mo20.600μs vs. Mo21.202μs] -2.84% (±0.31%)
    benchCoerce # generic array, empty iter.R1 I4 - [Mo20.689μs vs. Mo21.339μs] -3.04% (±1.44%)
    benchCoerce # generic array, non-empty .R1 I0 - [Mo20.500μs vs. Mo21.266μs] -3.60% (±0.19%)
    benchCoerce # generic array, non-empty .R2 I4 - [Mo21.451μs vs. Mo21.201μs] +1.18% (±2.39%)
    benchCoerce # generic array, large arra.R2 I4 - [Mo20.661μs vs. Mo21.448μs] -3.67% (±1.31%)
    benchCoerce # generic array, large iter.R2 I4 - [Mo20.586μs vs. Mo21.284μs] -3.28% (±0.48%)
    benchCoerce # int array, empty array,ma.R5 I4 - [Mo20.639μs vs. Mo21.285μs] -3.04% (±0.36%)
    benchCoerce # int array, empty iterable.R5 I4 - [Mo20.600μs vs. Mo21.598μs] -4.62% (±0.61%)
    benchCoerce # int array, non-empty arra.R5 I4 - [Mo20.734μs vs. Mo21.352μs] -2.89% (±1.11%)
    benchCoerce # int array, non-empty iter.R5 I4 - [Mo21.042μs vs. Mo21.320μs] -1.30% (±1.84%)
    benchCoerce # int array, large array,ma.R5 I4 - [Mo20.555μs vs. Mo21.203μs] -3.05% (±0.57%)
    benchCoerce # int array, large iterable.R5 I4 - [Mo20.600μs vs. Mo21.338μs] -3.46% (±0.31%)
    benchCoerce # map, empty array,map, lar.R5 I4 - [Mo20.797μs vs. Mo21.252μs] -2.14% (±0.65%)
    benchCoerce # map, empty iterable,map, .R5 I4 - [Mo20.576μs vs. Mo21.325μs] -3.51% (±1.63%)
    benchCoerce # map, non-empty array,map,.R5 I4 - [Mo20.602μs vs. Mo21.225μs] -2.93% (±1.38%)
    benchCoerce # map, non-empty iterable,m.R5 I4 - [Mo20.763μs vs. Mo21.286μs] -2.46% (±1.85%)
    benchCoerce # map, large array,map, lar.R5 I4 - [Mo20.626μs vs. Mo21.261μs] -2.98% (±1.69%)
    benchCoerce # map, large iterable,map, .R1 I2 - [Mo20.579μs vs. Mo21.605μs] -4.75% (±1.03%)
    benchAssert # generic array, empty arra.R1 I4 - [Mo1.797μs vs. Mo2.300μs] -21.88% (±2.78%)
    benchAssert # generic array, non-empty .R3 I3 - [Mo1.800μs vs. Mo2.243μs] -19.75% (±2.25%)
    benchAssert # generic array, large arra.R1 I1 - [Mo1.897μs vs. Mo2.300μs] -17.53% (±2.63%)
    benchAssert # int array, empty array,ge.R1 I3 - [Mo1.700μs vs. Mo2.203μs] -22.84% (±0.00%)
    benchAssert # int array, non-empty arra.R3 I3 - [Mo1.900μs vs. Mo2.300μs] -17.40% (±2.13%)
    benchAssert # int array, large array,ge.R2 I3 - [Mo1.800μs vs. Mo2.297μs] -21.63% (±2.25%)
    benchAssert # map, empty array,generic .R1 I0 - [Mo1.703μs vs. Mo2.200μs] -22.57% (±2.82%)
    benchAssert # map, non-empty array,gene.R3 I4 - [Mo1.803μs vs. Mo2.297μs] -21.48% (±2.66%)
    benchAssert # map, large array,generic .R2 I3 - [Mo1.800μs vs. Mo2.203μs] -18.31% (±2.25%)
    benchAssert # generic array, empty arra.R2 I4 - [Mo2.000μs vs. Mo2.500μs] -20.01% (±0.00%)
    benchAssert # generic array, non-empty .R2 I4 - [Mo2.097μs vs. Mo2.500μs] -16.13% (±2.38%)
    benchAssert # generic array, large arra.R1 I1 - [Mo2.000μs vs. Mo2.561μs] -21.90% (±1.98%)
    benchAssert # int array, empty array,ge.R1 I1 - [Mo2.003μs vs. Mo2.500μs] -19.87% (±2.40%)
    benchAssert # int array, non-empty arra.R1 I3 - [Mo2.000μs vs. Mo2.500μs] -20.00% (±0.00%)
    benchAssert # int array, large array,ge.R5 I4 - [Mo2.000μs vs. Mo2.500μs] -20.00% (±1.98%)
    benchAssert # map, empty array,generic .R5 I4 - [Mo2.000μs vs. Mo2.500μs] -20.00% (±1.98%)
    benchAssert # map, non-empty array,gene.R5 I4 - [Mo2.000μs vs. Mo2.639μs] -24.20% (±1.98%)
    benchAssert # map, large array,generic .R5 I4 - [Mo2.000μs vs. Mo2.597μs] -22.97% (±1.98%)
    benchAssert # generic array, empty arra.R5 I4 - [Mo18.248μs vs. Mo303.692μs] -93.99% (±0.60%)
    benchAssert # generic array, non-empty .R5 I4 - [Mo18.035μs vs. Mo299.258μs] -93.97% (±1.08%)
    benchAssert # generic array, large arra.R5 I4 - [Mo18.315μs vs. Mo300.444μs] -93.90% (±2.68%)
    benchAssert # int array, empty array,ge.R4 I3 - [Mo18.134μs vs. Mo309.715μs] -94.14% (±1.27%)
    benchAssert # int array, non-empty arra.R4 I4 - [Mo18.430μs vs. Mo307.895μs] -94.01% (±1.01%)
    benchAssert # int array, large array,ge.R4 I4 - [Mo18.070μs vs. Mo299.722μs] -93.97% (±1.02%)
    benchAssert # map, empty array,generic .R4 I4 - [Mo18.645μs vs. Mo299.843μs] -93.78% (±1.58%)
    benchAssert # map, non-empty array,gene.R4 I4 - [Mo18.100μs vs. Mo303.314μs] -94.03% (±0.22%)
    benchAssert # map, large array,generic .R4 I4 - [Mo18.191μs vs. Mo299.760μs] -93.93% (±0.56%)
    benchAssert # generic array, empty arra.R1 I1 - [Mo1.797μs vs. Mo2.200μs] -18.33% (±2.78%)
    benchAssert # generic array, non-empty .R1 I1 - [Mo1.600μs vs. Mo2.100μs] -23.81% (±2.47%)
    benchAssert # generic array, large arra.R1 I1 - [Mo1.603μs vs. Mo2.197μs] -27.01% (±2.99%)
    benchAssert # int array, empty array,in.R1 I1 - [Mo1.600μs vs. Mo2.203μs] -27.37% (±2.47%)
    benchAssert # int array, non-empty arra.R1 I4 - [Mo1.600μs vs. Mo2.257μs] -29.11% (±2.47%)
    benchAssert # int array, large array,in.R1 I4 - [Mo1.600μs vs. Mo2.100μs] -23.81% (±2.47%)
    benchAssert # map, empty array,int arra.R1 I4 - [Mo1.600μs vs. Mo2.103μs] -23.92% (±2.47%)
    benchAssert # map, non-empty array,int .R1 I0 - [Mo1.603μs vs. Mo2.200μs] -27.12% (±2.99%)
    benchAssert # map, large array,int arra.R1 I4 - [Mo1.600μs vs. Mo2.103μs] -23.92% (±2.47%)
    benchAssert # generic array, empty arra.R1 I4 - [Mo2.200μs vs. Mo2.661μs] -17.32% (±1.80%)
    benchAssert # generic array, non-empty .R1 I4 - [Mo2.257μs vs. Mo2.607μs] -13.40% (±4.07%)
    benchAssert # generic array, large arra.R1 I2 - [Mo2.297μs vs. Mo2.793μs] -17.78% (±2.17%)
    benchAssert # int array, empty array,in.R1 I4 - [Mo2.200μs vs. Mo2.700μs] -18.52% (±2.87%)
    benchAssert # int array, non-empty arra.R1 I4 - [Mo2.200μs vs. Mo2.757μs] -20.22% (±2.87%)
    benchAssert # int array, large array,in.R2 I4 - [Mo2.200μs vs. Mo2.703μs] -18.61% (±1.80%)
    benchAssert # map, empty array,int arra.R1 I4 - [Mo2.203μs vs. Mo2.739μs] -19.56% (±2.19%)
    benchAssert # map, non-empty array,int .R1 I1 - [Mo2.200μs vs. Mo2.661μs] -17.33% (±0.00%)
    benchAssert # map, large array,int arra.R1 I4 - [Mo2.257μs vs. Mo2.700μs] -16.40% (±4.07%)
    benchAssert # generic array, empty arra.R1 I4 - [Mo16.805μs vs. Mo16.507μs] +1.81% (±0.88%)
    benchAssert # generic array, non-empty .R1 I4 - [Mo16.776μs vs. Mo16.653μs] +0.74% (±2.45%)
    benchAssert # generic array, large arra.R1 I4 - [Mo16.600μs vs. Mo16.500μs] +0.61% (±0.48%)
    benchAssert # int array, empty array,in.R1 I1 - [Mo16.597μs vs. Mo16.700μs] -0.62% (±0.30%)
    benchAssert # int array, non-empty arra.R1 I4 - [Mo16.625μs vs. Mo16.600μs] +0.15% (±1.39%)
    benchAssert # int array, large array,in.R1 I4 - [Mo16.503μs vs. Mo16.513μs] -0.06% (±0.30%)
    benchAssert # map, empty array,int arra.R1 I4 - [Mo16.845μs vs. Mo16.552μs] +1.77% (±0.69%)
    benchAssert # map, non-empty array,int .R1 I4 - [Mo16.620μs vs. Mo16.553μs] +0.41% (±0.70%)
    benchAssert # map, large array,int arra.R1 I4 - [Mo16.581μs vs. Mo16.514μs] +0.40% (±0.82%)
    benchAssert # generic array, empty arra.R1 I2 - [Mo1.800μs vs. Mo2.103μs] -14.43% (±2.25%)
    benchAssert # generic array, non-empty .R1 I4 - [Mo1.600μs vs. Mo2.297μs] -30.33% (±2.47%)
    benchAssert # generic array, large arra.R2 I4 - [Mo1.600μs vs. Mo2.103μs] -23.93% (±0.00%)
    benchAssert # int array, empty array,ma.R2 I2 - [Mo1.700μs vs. Mo2.100μs] -19.05% (±2.33%)
    benchAssert # int array, non-empty arra.R2 I4 - [Mo1.600μs vs. Mo2.100μs] -23.80% (±2.47%)
    benchAssert # int array, large array,ma.R1 I0 - [Mo1.600μs vs. Mo2.297μs] -30.33% (±0.00%)
    benchAssert # map, empty array,map, emp.R1 I1 - [Mo1.600μs vs. Mo2.100μs] -23.81% (±2.47%)
    benchAssert # map, non-empty array,map,.R1 I1 - [Mo1.603μs vs. Mo2.197μs] -27.01% (±2.99%)
    benchAssert # map, large array,map, emp.R1 I2 - [Mo1.603μs vs. Mo2.100μs] -23.66% (±2.99%)
    benchAssert # generic array, empty arra.R1 I3 - [Mo2.297μs vs. Mo2.703μs] -15.04% (±2.17%)
    benchAssert # generic array, non-empty .R1 I3 - [Mo2.203μs vs. Mo2.797μs] -21.22% (±2.19%)
    benchAssert # generic array, large arra.R1 I4 - [Mo2.297μs vs. Mo2.797μs] -17.88% (±2.17%)
    benchAssert # int array, empty array,ma.R1 I4 - [Mo2.200μs vs. Mo2.761μs] -20.33% (±2.87%)
    benchAssert # int array, non-empty arra.R1 I2 - [Mo2.203μs vs. Mo2.743μs] -19.66% (±2.19%)
    benchAssert # int array, large array,ma.R1 I4 - [Mo2.257μs vs. Mo2.800μs] -19.38% (±4.07%)
    benchAssert # map, empty array,map, non.R1 I1 - [Mo2.203μs vs. Mo2.803μs] -21.40% (±2.19%)
    benchAssert # map, non-empty array,map,.R1 I4 - [Mo2.203μs vs. Mo2.700μs] -18.40% (±2.19%)
    benchAssert # map, large array,map, non.R1 I4 - [Mo2.300μs vs. Mo2.703μs] -14.93% (±1.75%)
    benchAssert # generic array, empty arra.R1 I4 - [Mo17.379μs vs. Mo18.000μs] -3.45% (±1.22%)
    benchAssert # generic array, non-empty .R5 I4 - [Mo17.400μs vs. Mo18.000μs] -3.33% (±0.23%)
    benchAssert # generic array, large arra.R5 I4 - [Mo17.357μs vs. Mo18.000μs] -3.57% (±0.52%)
    benchAssert # int array, empty array,ma.R5 I4 - [Mo17.400μs vs. Mo17.993μs] -3.30% (±0.00%)
    benchAssert # int array, non-empty arra.R5 I4 - [Mo17.387μs vs. Mo17.814μs] -2.40% (±0.46%)
    benchAssert # int array, large array,ma.R5 I4 - [Mo17.397μs vs. Mo17.997μs] -3.33% (±0.78%)
    benchAssert # map, empty array,map, lar.R5 I4 - [Mo17.381μs vs. Mo17.961μs] -3.23% (±0.78%)
    benchAssert # map, non-empty array,map,.R5 I4 - [Mo17.400μs vs. Mo18.000μs] -3.33% (±0.00%)
    benchAssert # map, large array,map, lar.R5 I4 - [Mo17.387μs vs. Mo18.000μs] -3.41% (±0.46%)
    benchMatch # generic array, empty array.R2 I4 - [Mo1.900μs vs. Mo2.400μs] -20.84% (±2.13%)
    benchMatch # generic array, non-empty a.R3 I3 - [Mo1.900μs vs. Mo2.397μs] -20.72% (±0.00%)
    benchMatch # generic array, large array.R1 I4 - [Mo1.903μs vs. Mo2.397μs] -20.58% (±2.53%)
    benchMatch # int array, empty array,gen.R2 I2 - [Mo1.900μs vs. Mo2.397μs] -20.72% (±0.00%)
    benchMatch # int array, non-empty array.R2 I4 - [Mo1.900μs vs. Mo2.397μs] -20.72% (±0.00%)
    benchMatch # int array, large array,gen.R2 I1 - [Mo1.803μs vs. Mo2.400μs] -24.86% (±2.66%)
    benchMatch # map, empty array,generic a.R2 I4 - [Mo1.803μs vs. Mo2.303μs] -21.71% (±2.66%)
    benchMatch # map, non-empty array,gener.R1 I1 - [Mo1.900μs vs. Mo2.397μs] -20.72% (±0.00%)
    benchMatch # map, large array,generic a.R3 I4 - [Mo1.897μs vs. Mo2.400μs] -20.97% (±2.63%)
    benchMatch # generic array, empty array.R3 I4 - [Mo2.103μs vs. Mo2.639μs] -20.30% (±2.29%)
    benchMatch # generic array, non-empty a.R3 I4 - [Mo2.103μs vs. Mo2.600μs] -19.10% (±2.29%)
    benchMatch # generic array, large array.R3 I4 - [Mo2.100μs vs. Mo2.600μs] -19.24% (±3.01%)
    benchMatch # int array, empty array,gen.R3 I4 - [Mo2.1…
@Ocramius Ocramius force-pushed the feature/benchmarks-and-performance-improvements branch from 68da707 to af6d378 Compare September 8, 2021 12:20
@Ocramius Ocramius force-pushed the feature/benchmarks-and-performance-improvements branch from 127d78f to 27ce4dc Compare September 8, 2021 12:57
@Ocramius
Copy link
Contributor Author

Ocramius commented Sep 8, 2021

@azjezz I think this is good to go.

Here's the action run on my repo: https://github.com/Ocramius/psl/runs/3544847629

Benchmarks are running forever - hopefully fixed after phpbench/phpbench#918 :-\

EDIT: perhaps I need to remove the retry threshold, so it does not retry benchmarks when there's a lot of standard deviation error...

azjezz
azjezz previously approved these changes Sep 8, 2021
Copy link
Owner

@azjezz azjezz left a comment

Choose a reason for hiding this comment

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

Amazing work 🎉 Thank you!

( small issue )

src/Psl/Type/Internal/DictType.php Outdated Show resolved Hide resolved
@Ocramius Ocramius changed the title WIP: benchmarks and performance improvements Benchmarks and performance improvements Sep 8, 2021
azjezz
azjezz previously approved these changes Sep 8, 2021
@azjezz azjezz changed the base branch from 1.8.x to 1.9.x September 8, 2021 20:36
@azjezz azjezz dismissed their stale review September 8, 2021 20:36

The base branch was changed.

Copy link
Owner

@azjezz azjezz left a comment

Choose a reason for hiding this comment

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

Thank you for you work @Ocramius

@azjezz azjezz modified the milestones: 1.8.0, 1.9.0 Sep 8, 2021
@azjezz azjezz added Status: Completed Nothing further to be done with this issue. Awaiting to be closed by the requestor out of politeness and removed Status: In Progress This issue is being worked on, and has someone assigned. labels Sep 8, 2021
@azjezz azjezz merged commit 9e17a34 into azjezz:1.9.x Sep 8, 2021
@Ocramius Ocramius deleted the feature/benchmarks-and-performance-improvements branch September 8, 2021 22:19
@Ocramius
Copy link
Contributor Author

@azjezz I see this isn't released yet - would a patch with release automation additions help on that?

Trying to kinda fill the time distance between improvements and discovered regressions :D

@azjezz
Copy link
Owner

azjezz commented Sep 18, 2021

would a patch with release automation additions help on that?

Yes!

i just didn't have the time for it :D i tried to integrate laminas auto release before but with no success

return $this->coerceIterable($value);
}

if (array_keys(array_intersect_key($value, $this->requiredElements)) !== array_keys($this->requiredElements)) {

Choose a reason for hiding this comment

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

think this is buggy.
keys need to be sorted before comparison. same on line 65

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Priority: High After critical issues are fixed, these should be dealt with before any further issues. Status: Completed Nothing further to be done with this issue. Awaiting to be closed by the requestor out of politeness Type: Enhancement Most issues will probably ask for additions or changes.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Introduce benchmark + performance regression checks
5 participants