diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
new file mode 100644
index 0000000..0a5b969
--- /dev/null
+++ b/.github/workflows/ci.yml
@@ -0,0 +1,26 @@
+name: test
+on:
+ push:
+ branches:
+ - main
+ pull_request:
+jobs:
+ test:
+ strategy:
+ fail-fast: false
+ matrix:
+ java: [8, 11, 17, 21]
+ scala: [2.11.x, 2.12.x, 2.13.x, 3.x]
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+ with:
+ fetch-depth: 0
+ - uses: coursier/cache-action@v6
+ - uses: actions/setup-java@v4
+ with:
+ distribution: temurin
+ java-version: ${{matrix.java}}
+ - uses: sbt/setup-sbt@v1
+ - name: Test
+ run: sbt ++${{matrix.scala}} test headerCheck versionPolicyCheck publishLocal
diff --git a/.github/workflows/cla.yml b/.github/workflows/cla.yml
new file mode 100644
index 0000000..3549ded
--- /dev/null
+++ b/.github/workflows/cla.yml
@@ -0,0 +1,11 @@
+name: "Check Scala CLA"
+on:
+ pull_request:
+jobs:
+ cla-check:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Verify CLA
+ uses: scala/cla-checker@v1
+ with:
+ author: ${{ github.event.pull_request.user.login }}
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
new file mode 100644
index 0000000..1e5360b
--- /dev/null
+++ b/.github/workflows/release.yml
@@ -0,0 +1,22 @@
+name: Release
+on:
+ push:
+ tags: ["*"]
+jobs:
+ publish:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+ with:
+ fetch-depth: 0
+ - uses: actions/setup-java@v4
+ with:
+ distribution: temurin
+ java-version: 8
+ - uses: sbt/setup-sbt@v1
+ - run: sbt versionCheck ci-release
+ env:
+ PGP_PASSPHRASE: ${{secrets.PGP_PASSPHRASE}}
+ PGP_SECRET: ${{secrets.PGP_SECRET}}
+ SONATYPE_PASSWORD: ${{secrets.SONATYPE_PASSWORD}}
+ SONATYPE_USERNAME: ${{secrets.SONATYPE_USERNAME}}
diff --git a/.gitignore b/.gitignore
index 86fb982..41ed2bf 100644
--- a/.gitignore
+++ b/.gitignore
@@ -5,3 +5,4 @@ target
/.settings
/.target
/bin
+benchmark/JmhBench.scala
\ No newline at end of file
diff --git a/.jvmopts b/.jvmopts
new file mode 100644
index 0000000..56aefe0
--- /dev/null
+++ b/.jvmopts
@@ -0,0 +1 @@
+-Xmx4G
diff --git a/.scala-steward.conf b/.scala-steward.conf
new file mode 100644
index 0000000..4b6a192
--- /dev/null
+++ b/.scala-steward.conf
@@ -0,0 +1,4 @@
+updates.ignore = [
+ # see https://github.com/scala/scala-java8-compat/pull/306
+ { groupId = "org.apache.commons", artifactId = "commons-lang3" }
+]
diff --git a/.travis.yml b/.travis.yml
deleted file mode 100644
index a5a7a74..0000000
--- a/.travis.yml
+++ /dev/null
@@ -1,20 +0,0 @@
-language: scala
-env:
- global:
- - PUBLISH_JDK=oraclejdk8
- # PGP_PASSPHRASE
- - secure: "BzgzRZLYa52rS/hBfzf43b++CfDhdcd3Mmu8tsyBHgThSQOd2YBLbV5kWD8aYVFKVHfW7XX0PTe3F+rR/fFZqGItE6o8Px0Y7Vzb5pqjlaQdxFEJ+WrsnshS0xuAKZ7OwVHRp+d+jznaCwRxEo2vpW3ko1OPAJ8cxfhVL/4C1I0="
- # SONA_USER
- - secure: "lx2qFeFxh9AFmyHR7hH4Qf9flIEx8VgYj6ebzuxp1cc1ZZiXHC1256x0bHFDUH9bhJACOazOrco/+v6MBAriBkWxLBc98FrC6OkVeQMFW2ffWSBuHRclilKsQA/Lsgc81Wg+WV105hOqUNAkTXgroblInNt+KS+DhC/8FVoh9ZY="
- # SONA_PASS
- - secure: "FZC+FZnBNeklA150vW5QDZJ5J7t+DExJrgyXWM46Wh0MobjH8cvydgC3qatItb0rDBV8l7zO1LDwl2KEi92aefw2a8E49z6qVOHgUXiI3SAx7M0UO0FFeKPmTXCLcBlbnGLcUqNjIZfuIEufQvPblKTl8qN4eMmcMn9jsNzJr28="
-script:
- - admin/build.sh
-scala:
- - 2.10.4
- - 2.11.5
-jdk:
- - oraclejdk8
-notifications:
- email:
- - jason.zaugg@typesafe.com
diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md
new file mode 100644
index 0000000..0511f21
--- /dev/null
+++ b/CODE_OF_CONDUCT.md
@@ -0,0 +1,7 @@
+all repositories in these organizations:
+
+* [scala](https://github.com/scala)
+* [scalacenter](https://github.com/scalacenter)
+* [lampepfl](https://github.com/lampepfl)
+
+are covered by the Scala Code of Conduct: https://scala-lang.org/conduct/
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index e80eb0f..93ace65 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -1,3 +1,3 @@
## Contributing
-This project has the same [guidelines for contributors](https://github.com/scala/scala/blob/master/CONTRIBUTING.md) as scala/scala.
+This project has the same [guidelines for contributors](https://github.com/scala/scala/blob/2.13.x/CONTRIBUTING.md) as scala/scala.
diff --git a/LICENSE b/LICENSE
index ce51bda..261eeb9 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,28 +1,201 @@
-Copyright (c) 2002-2013 EPFL
-Copyright (c) 2011-2013 Typesafe, Inc.
-
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without modification,
-are permitted provided that the following conditions are met:
-
- * Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above copyright notice,
- this list of conditions and the following disclaimer in the documentation
- and/or other materials provided with the distribution.
- * Neither the name of the EPFL nor the names of its contributors
- may be used to endorse or promote products derived from this software
- without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
-CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
-PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
-LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
diff --git a/NOTICE b/NOTICE
new file mode 100644
index 0000000..a3069a2
--- /dev/null
+++ b/NOTICE
@@ -0,0 +1,14 @@
+scala-java8-compat
+Copyright (c) 2002-2025 EPFL
+Copyright (c) 2011-2025 Lightbend, Inc. dba Akka
+
+scala-java8-compat includes software developed at
+LAMP/EPFL (https://lamp.epfl.ch/) and
+Akka (https://akka.io/).
+
+Licensed under the Apache License, Version 2.0 (the "License").
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
diff --git a/README.md b/README.md
index 85d1e6f..15a28df 100644
--- a/README.md
+++ b/README.md
@@ -1,8 +1,18 @@
-## scala-java8-compat [](https://travis-ci.org/scala/scala-java8-compat) [](https://maven-badges.herokuapp.com/maven-central/org.scala-lang.modules/scala-java8-compat_2.11)
+# scala-java8-compat [](http://search.maven.org/#search%7Cga%7C1%7Cg%3Aorg.scala-lang.modules%20a%3Ascala-java8-compat_2.11) [](http://search.maven.org/#search%7Cga%7C1%7Cg%3Aorg.scala-lang.modules%20a%3Ascala-java8-compat_2.12) [](http://search.maven.org/#search%7Cga%7C1%7Cg%3Aorg.scala-lang.modules%20a%3Ascala-java8-compat_2.13) [](http://search.maven.org/#search%7Cga%7C1%7Cg%3Aorg.scala-lang.modules%20a%3Ascala-java8-compat_3)
-A Java 8 compatibility kit for Scala.
+A Java 8 compatibility kit for Scala 2.12 and 2.11.
-The API is currently still experimental: we do not yet guarantee source or binary compatibility with future releases.
+Javadoc is [here](https://javadoc.io/doc/org.scala-lang.modules/scala-java8-compat_2.13/latest/index.html).
+
+## Do you need this?
+
+If you are using Scala 2.13 or newer only, then don't use this library! Use the classes under `scala.jdk` instead; they were added to the standard library in 2.13.
+
+We do publish 2.13 and 3.0 artifacts of scala-java8-compat, but they're only intended to be used in projects which crossbuild with 2.12 and/or 2.11.
+
+## Maintenance status
+
+This library is community-maintained. (The Scala team at Akka provides infrastructure and oversight.)
## Functional Interfaces for Scala functions
@@ -25,9 +35,74 @@ class Test {
[More Examples / Documentation](src/test/java/scala/compat/java8/LambdaTest.java)
+## Converters between `scala.FunctionN` and `java.util.function`
+
+A set of converters that enable interconversion between Java's standard
+Functional Interfaces defined in `java.util.function` and Scala's `Function0`,
+`Function1`, and `Function2` traits. These are intended for use when you
+already have an instance of a `java.util.function` and need a Scala function,
+or have a Scala function and need an instance of a `java.util.function`.
+
+The `.asScala` extension method will convert a `java.util.function` to the corresponding
+Scala function. The `.asJava` extension method will convert a Scala function to
+the most specific corresponding Java functional interface. If you wish to obtain
+a less specific functional interface, there are named methods that start with `asJava`
+and continue with the name of the Java functional interface. For instance, the
+most specific interface corresponding to the Scala function `val rev = (s: String) => s.reverse`
+is `UnaryOperator[String]`, and that is what `rev.asJava` will produce. However,
+`asJavaFunction(rev)` will return a `java.util.function.Function[String, String]` instead.
+
+The `asJava` methods can also be called conveniently from Java. There are additional
+`asScalaFrom` methods (e.g. `asScalaFromUnaryOperator`) that will perform the
+functional-interface-to-Scala-function conversion; this is primarily of use when calling
+from Java since the `.asScala` extension method is more convenient in Scala.
+
+#### Usage examples
+
+In Scala:
+
+```scala
+import java.util.function._
+import scala.compat.java8.FunctionConverters._
+
+val foo: Int => Boolean = i => i > 7
+def testBig(ip: IntPredicate) = ip.test(9)
+println(testBig(foo.asJava)) // Prints true
+
+val bar = new UnaryOperator[String]{ def apply(s: String) = s.reverse }
+List("cod", "herring").map(bar.asScala) // List("doc", "gnirrih")
+
+def testA[A](p: Predicate[A])(a: A) = p.test(a)
+println(testA(asJavaPredicate(foo))(4)) // Prints false
+
+// println(testA(foo.asJava)(4)) <-- doesn't work
+// IntPredicate does not extend Predicate!
+```
+
+In Java:
+
+```java
+import java.util.function.*;
+import scala.compat.java8.FunctionConverters;
+
+class Example {
+ String foo(UnaryOperator f) {
+ return f.apply("halibut");
+ }
+ String bar(scala.Function1 f) {
+ return foo(functionConverters.asJavaUnaryOperator(f));
+ }
+ String baz(Function f) {
+ return bar(functionConverters.asScalaFromFunction(f));
+ }
+}
+```
+
## Converters between `scala.concurrent` and `java.util.concurrent`
- - [API](src/main/java/scala/compat/java8/FutureConverters.java)
+Conversion between Java's concurrency primitives (`CompletionStage` and `CompletableFuture`) and the Scala concurrency primitives (`Promise` and `Future`) is enabled with `scala.compat.java8.FutureConverters` singleton object:
+
+ - [API](src/main/scala/scala/compat/java8/FutureConverters.scala)
- [Test Cases](src/test/java/scala/compat/java8/FutureConvertersTest.java)
## Converters between `scala.Option` and `java.util` classes `Optional`, `OptionalDouble`, `OptionalInt`, and `OptionalLong`.
@@ -53,6 +128,169 @@ class Test {
}
```
-## Future work
- - Converters for `java.util.function`, `java.util.stream`
- - [`Spliterator`](https://docs.oracle.com/javase/8/docs/api/java/util/Spliterator.html)s for Scala collections
+
+## Converters from Scala collections to Java 8 Streams
+
+Scala collections gain `seqStream` and `parStream` as extension methods that produce a Java 8 Stream
+running sequentially or in parallel, respectively. These are automatically specialized to a primitive
+type if possible, including automatically applied widening conversions. For instance, `List(1,2).seqStream`
+produces an `IntStream`, and so does `List(1.toShort, 2.toShort).parStream`. Maps additionally have
+`seqKeyStream`, `seqValueStream`, `parKeyStream`, and `parValueStream` methods.
+
+Scala collections also gain `accumulate` and `stepper` methods that produce utility collections that
+can be useful when working with Java 8 Streams. `accumulate` produces an `Accumulator` or its primitive
+counterpart (`DoubleAccumulator`, etc.), which is a low-level collection designed for efficient collection
+and dispatching of results to and from Streams. Unlike most collections, it can contain more than
+`Int.MaxValue` elements.
+
+`stepper` produces a `Stepper` which is a fusion of `Spliterator` and `Iterator`. `Stepper`s underlie the Scala
+collections' instances of Java 8 Streams. Steppers are intended as low-level building blocks for streams.
+Usually you would not create them directly or call their methods but you can implement them alongside custom
+collections to get better performance when streaming from these collections.
+
+Java 8 Streams gain `toScala[Coll]` and `accumulate` methods, to make it easy to produce Scala collections
+or Accumulators, respectively, from Java 8 Streams. For instance, `myStream.to[Vector]` will collect the
+contents of a Stream into a `scala.collection.immutable.Vector`. Note that standard sequential builders
+are used for collections, so this is best done to gather the results of an expensive computation.
+
+Finally, there is a Java class, `ScalaStreamSupport`, that has a series of `stream` methods that can be used to
+obtain Java 8 Streams from Scala collections from within Java.
+
+#### Performance Considerations
+
+For sequential operations, Scala's `iterator` almost always equals or exceeds the performance of a Java 8 stream. Thus,
+one should favor `iterator` (and its richer set of operations) over `seqStream` for general use. However, long
+chains of processing of primitive types can sometimes benefit from the manually specialized methods in `DoubleStream`,
+`IntStream`, and `LongStream`.
+
+Note that although `iterator` typically has superior performance in a sequential context, the advantage is modest
+(usually less than 50% higher throughput for `iterator`).
+
+For parallel operations, `parStream` and even `seqStream.parallel` meets or exceeds the performance of Scala parallel
+collections methods (invoked with `.par`). Especially for small collections, the difference can be substantial. In
+some cases, when a Scala (parallel) collection is the ultimate result, Scala parallel collections can have an advantage
+as the collection can (in some cases) be built in parallel.
+
+Because the wrappers are invoked based on the static type of the collection, there are also cases where parallelization
+is inefficient when interfacing with Java 8 Streams (e.g. when a collection is typed as `Seq[String]` so might have linear
+access like `List`, but actually is a `WrappedArray[String]` (`ArraySeq` on 2.13) that can be efficiently parallelized) but can be efficient
+with Scala parallel collections. The `parStream` method is only available when the static type is known to be compatible
+with rapid parallel operation; `seqStream` can be parallelized by using `.parallel`, but may or may not be efficient.
+
+If the operations available on Java 8 Streams are sufficient, the collection type is known statically with enough precision
+to enable parStream, and an `Accumulator` or non-collection type is an acceptable result, Java 8 Streams will essentially
+always outperform the Scala parallel collections.
+
+#### Scala Usage Example
+
+```scala
+import scala.compat.java8.StreamConverters._
+
+object Test {
+ val m = collection.immutable.HashMap("fish" -> 2, "bird" -> 4)
+ val s = m.parValueStream.sum // 6, potientially computed in parallel
+ val t = m.seqKeyStream.toScala[List] // List("fish", "bird")
+ val a = m.accumulate // Accumulator[(String, Int)]
+
+ val n = a.stepper.fold(0)(_ + _._1.length) +
+ a.parStream.count // 8 + 2 = 10
+
+ val b = java.util.Arrays.stream(Array(2L, 3L, 4L)).
+ accumulate // LongAccumulator
+ val l = b.to[List] // List(2L, 3L, 4L)
+}
+```
+
+#### Using Java 8 Streams with Scala Function Converters
+
+Scala can emit Java SAMs for lambda expressions that are arguments to methods that take a Java SAM rather than
+a Scala Function. However, it can be convenient to restrict the SAM interface to interactions with Java code
+(including Java 8 Streams) rather than having it propagate throughout Scala code.
+
+Using Java 8 Stream converters together with function converters allows one to accomplish this with only a modest
+amount of fuss.
+
+Example:
+
+```scala
+import scala.compat.java8.FunctionConverters._
+import scala.compat.java8.StreamConverters._
+
+def mapToSortedString[A](xs: Vector[A], f: A => String, sep: String) =
+ xs.parStream. // Creates java.util.stream.Stream[String]
+ map[String](f.asJava).sorted. // Maps A to String and sorts (in parallel)
+ toArray.mkString(sep) // Back to an Array to use Scala's mkString
+```
+
+Note that explicit creation of a new lambda will tend to lead to improved type inference and at least equal
+performance:
+
+```scala
+def mapToSortedString[A](xs: Vector[A], f: A => String, sep: String) =
+ xs.parStream.
+ map[String](a => f(a)).sorted. // Explicit lambda creates a SAM wrapper for f
+ toArray.mkString(sep)
+```
+
+#### Java Usage Example
+
+To convert a Scala collection to a Java 8 Stream from within Java, it usually
+suffices to call `ScalaStreamSupport.stream(xs)` on your collection `xs`. If `xs` is
+a map, you may wish to get the keys or values alone by using `fromKeys` or
+`fromValues`. If the collection has an underlying representation that is not
+efficiently parallelized (e.g. `scala.collection.immutable.List`), then
+`fromAccumulated` (and `fromAccumulatedKeys` and `fromAccumulatedValues`) will
+first gather the collection into an `Accumulator` and then return a stream over
+that accumulator. If not running in parallel, `from` is preferable (faster and
+less memory usage).
+
+Note that a Scala `Iterator` cannot fulfill the contract of a Java 8 Stream
+(because it cannot support `trySplit` if it is called). Presently, one must
+call `fromAccumulated` on the `Iterator` to cache it, even if the Stream will
+be evaluated sequentially, or wrap it as a Java Iterator and use static
+methods in `Spliterator` to wrap that as a `Spliterator` and then a `Stream`.
+
+Here is an example of conversion of a Scala collection within Java 8:
+
+```java
+import scala.collection.mutable.ArrayBuffer;
+import scala.compat.java8.ScalaStreamSupport;
+
+public class StreamConvertersExample {
+ public int MakeAndUseArrayBuffer() {
+ ArrayBuffer ab = new ArrayBuffer();
+ ab.$plus$eq("salmon");
+ ab.$plus$eq("herring");
+ return ScalaStreamSupport.stream(ab).mapToInt(x -> x.length()).sum(); // 6+7 = 13
+ }
+}
+```
+
+## Converters between `scala.concurrent.duration.FiniteDuration` and `java.time.Duration`
+
+Interconversion between Java's standard `java.time.Duration` type
+and the `scala.concurrent.duration.FiniteDuration` types. The Java `Duration` does
+not contain a time unit, so when converting from `FiniteDuration` the time unit used
+to create it is lost.
+
+For the opposite conversion a `Duration` can potentially express a larger time span than
+a `FiniteDuration`, for such cases an exception is thrown.
+
+Example of conversions from the Java type ways:
+
+```scala
+import scala.concurrent.duration._
+import scala.compat.java8.DurationConverters._
+
+val javaDuration: java.time.Duration = 5.seconds.toJava
+val finiteDuration: FiniteDuration = javaDuration.toScala
+```
+
+From Java:
+```java
+import scala.compat.java8.DurationConverters;
+import scala.concurrent.duration.FiniteDuration;
+
+DurationConverters.toScala(Duration.of(5, ChronoUnit.SECONDS));
+DurationConverters.toJava(FiniteDuration.create(5, TimeUnit.SECONDS));
+```
diff --git a/admin/README.md b/admin/README.md
deleted file mode 100644
index 3b38f19..0000000
--- a/admin/README.md
+++ /dev/null
@@ -1,60 +0,0 @@
-## Tag Driven Releasing
-
-### Background Reading
-
- - http://docs.travis-ci.com/user/environment-variables/
- - http://docs.travis-ci.com/user/encryption-keys/
- - http://docs.travis-ci.com/user/encrypting-files/
-
-### Initial setup for the repository
-
-To configure tag driven releases from Travis CI.
-
- 1. Generate a key pair for this repository with `./admin/genKeyPair.sh`.
- Edit `.travis.yml` and `admin/build.sh` as prompted.
- 2. Publish the public key to https://pgp.mit.edu
- 3. Store other secrets as encrypted environment variables with `admin/encryptEnvVars.sh`.
- Edit `.travis.yml` as prompted.
- 4. Edit `.travis.yml` to use `./admin/build.sh` as the build script,
- and edit that script to use the tasks required for this project.
- 5. Edit `.travis.yml` to select which JDK will be used for publishing.
-
-It is important to add comments in .travis.yml to identify the name
-of each environment variable encoded in a `:secure` section.
-
-After all of these steps, your .travis.yml should contain config of the
-form:
-
- language: scala
- env:
- global:
- - PUBLISH_JDK=openjdk6
- # PGP_PASSPHRASE
- - secure: "XXXXXX"
- # SONA_USER
- - secure: "XXXXXX"
- # SONA_PASS
- - secure: "XXXXXX"
- script:
- - admin/build.sh
-
-If Sonatype credentials change in the future, step 3 can be repeated
-without generating a new key.
-
-Be sure to use SBT 0.13.7 or higher to avoid [#1430](https://github.com/sbt/sbt/issues/1430)!
-
-### Testing
-
- 1. Follow the release process below to create a dummy release (e.g. 0.1.0-TEST1).
- Confirm that the release was staged to Sonatype but do not release it to Maven
- central. Instead, drop the staging repository.
-
-### Performing a release
-
- 1. Create a GitHub "Release" (with a corresponding tag) via the GitHub
- web interface.
- 2. Travis CI will schedule a build for this release. Review the build logs.
- 3. Log into https://oss.sonatype.org/ and identify the staging repository.
- 4. Sanity check its contents
- 5. Release staging repository to Maven and send out release announcement.
-
diff --git a/admin/build.sh b/admin/build.sh
deleted file mode 100755
index b67abcf..0000000
--- a/admin/build.sh
+++ /dev/null
@@ -1,25 +0,0 @@
-#!/bin/bash
-
-set -e
-
-# prep environment for publish to sonatype staging if the HEAD commit is tagged
-
-# git on travis does not fetch tags, but we have TRAVIS_TAG
-# headTag=$(git describe --exact-match ||:)
-
-if [ "$TRAVIS_JDK_VERSION" == "$PUBLISH_JDK" ] && [[ "$TRAVIS_TAG" =~ ^v[0-9]+\.[0-9]+\.[0-9]+(-[A-Za-z0-9-]+)? ]]; then
- echo "Going to release from tag $TRAVIS_TAG!"
- myVer=$(echo $TRAVIS_TAG | sed -e s/^v// | sed -e 's/_[0-9]*\.[0-9]*//')
- publishVersion='set every version := "'$myVer'"'
- extraTarget="publish-signed"
- cat admin/gpg.sbt >> project/plugins.sbt
- cp admin/publish-settings.sbt .
-
- # Copied from the output of genKeyPair.sh
- K=$encrypted_1ce132863fa7_key
- IV=$encrypted_1ce132863fa7_iv
-
- openssl aes-256-cbc -K $K -iv $IV -in admin/secring.asc.enc -out admin/secring.asc -d
-fi
-
-sbt ++$TRAVIS_SCALA_VERSION "$publishVersion" clean update test publishLocal $extraTarget
diff --git a/admin/encryptEnvVars.sh b/admin/encryptEnvVars.sh
deleted file mode 100755
index b625667..0000000
--- a/admin/encryptEnvVars.sh
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/bin/bash
-#
-# Encrypt sonatype credentials so that they can be
-# decrypted in trusted builds on Travis CI.
-#
-set -e
-
-read -s -p 'SONA_USER: ' SONA_USER
-travis encrypt SONA_USER="$SONA_USER"
-read -s -p 'SONA_PASS: ' SONA_PASS
-travis encrypt SONA_PASS="$SONA_PASS"
diff --git a/admin/genKeyPair.sh b/admin/genKeyPair.sh
deleted file mode 100755
index 11f7a1e..0000000
--- a/admin/genKeyPair.sh
+++ /dev/null
@@ -1,40 +0,0 @@
-#!/bin/bash
-#
-# Generates a key pair for this repository to sign artifacts.
-# Encrypt the private key and its passphrase in trusted builds
-# on Travis CI.
-#
-set -e
-
-# Based on https://gist.github.com/kzap/5819745:
-function promptDelete() {
- if [[ -f "$1" ]]; then
- echo About to delete $1, Enter for okay / CTRL-C to cancel
- read
- rm "$1"
- fi
-}
-for f in admin/secring.asc.enc admin/secring.asc admin/pubring.asc; do promptDelete "$f"; done
-
-echo Generating key pair. Please enter 1. repo name 2. scala-internals@googlegroups.com, 3. a new passphrase
-cp admin/gpg.sbt project
-sbt 'set pgpReadOnly := false' \
- 'set pgpPublicRing := file("admin/pubring.asc")' \
- 'set pgpSecretRing := file("admin/secring.asc")' \
- 'pgp-cmd gen-key'
-rm project/gpg.sbt
-
-echo ============================================================================================
-echo Encrypting admin/secring.asc. Update K and IV variables in admin/build.sh accordingly.
-echo ============================================================================================
-travis encrypt-file admin/secring.asc
-rm admin/secring.asc
-mv secring.asc.enc admin
-
-echo ============================================================================================
-echo Encrypting environment variables. Add each to a line in .travis.yml. Include a comment
-echo with the name of the corresponding variable
-echo ============================================================================================
-read -s -p 'PGP_PASSPHRASE: ' PGP_PASSPHRASE
-travis encrypt PGP_PASSPHRASE="$PGP_PASSPHRASE"
-
diff --git a/admin/gpg.sbt b/admin/gpg.sbt
deleted file mode 100644
index d60e366..0000000
--- a/admin/gpg.sbt
+++ /dev/null
@@ -1,2 +0,0 @@
-
-addSbtPlugin("com.typesafe.sbt" % "sbt-pgp" % "0.8.3") // only added when publishing:
diff --git a/admin/publish-settings.sbt b/admin/publish-settings.sbt
deleted file mode 100644
index f763ea0..0000000
--- a/admin/publish-settings.sbt
+++ /dev/null
@@ -1,9 +0,0 @@
-def env(key: String) = Option(System.getenv(key)).getOrElse("")
-
-pgpPassphrase := Some(env("PGP_PASSPHRASE").toArray)
-
-pgpPublicRing := file("admin/pubring.asc")
-
-pgpSecretRing := file("admin/secring.asc")
-
-credentials += Credentials("Sonatype Nexus Repository Manager", "oss.sonatype.org", env("SONA_USER"), env("SONA_PASS"))
diff --git a/admin/pubring.asc b/admin/pubring.asc
deleted file mode 100644
index 5d5dd87..0000000
--- a/admin/pubring.asc
+++ /dev/null
@@ -1,18 +0,0 @@
------BEGIN PGP PUBLIC KEY BLOCK-----
-Version: BCPG v1.49
-
-mQENBFS1xA0BCAC0t2c5MhkWyUbkWsZM4DmIN+/pDjNCr2DNmbIG3gB8i4MI71q/
-fj+Ob0lemjJNnNc4ii6+s9RrOcwR1EU4IA8mO79NN+i2yVUhe0LmOWgyfXvG8Qpg
-hLmdMrkgOHK0hpWbXJ0i2NGPch4gI6YRJF95yLojz2KENmiYGmSD8p1It06O2824
-Xhqc5Cm72/qXvonHP1+MugjiPxmyZN3ajSol0P7tZlgB7ikqpyL3kZXkc162bJ+H
-U6y6qUCcQqS5VQ7Fv9bIbTNOjN4ELLJn2ffLVe3ujRG6seioL0MfuQ/gV9IpGcGO
-Dew8Xu79QdDyVHQKgDy9N/J276JZ4j9nYCCxABEBAAG0NXNjYWxhLWphdmE4LWNv
-bXBhdCA8c2NhbGEtaW50ZXJuYWxzQGdvb2dsZWdyb3Vwcy5jb20+iQEcBBMBAgAG
-BQJUtcQNAAoJEGQWNEmlKase8pAH/Rb45Px88u7DDT53DU68zh84oDZLv9i46g7g
-16KI97nz17F9OEHdkzNEUA3EgCD1d2k+c/GIdQKg3avVdpNM7krK5SSNgHKcwe/F
-0YGMxvh+LgeK1JDuXFbwLJKR+7VIGVKkjw+Z2TC8hZfnD6Qy6c4xkukoBs6yfWQO
-tf8gSH6oQox4UIOB/+ADyypl9mnRxgdi1uPvd6UJnL/n9UDE8v1k+8WzO34nTVZr
-xWN28pAun5VpLuEq4GAr2JRfRiF+N0hGuS+htiU6hnO81BBK+NusWxI9Aitu8Zyh
-eulWpROXvUOw1eJequutgyGwEEQkRi+Yu+2eSM2/EPCWiLXkODk=
-=Qro7
------END PGP PUBLIC KEY BLOCK-----
diff --git a/admin/secring.asc.enc b/admin/secring.asc.enc
deleted file mode 100644
index bc600f9..0000000
Binary files a/admin/secring.asc.enc and /dev/null differ
diff --git a/benchmark/README.md b/benchmark/README.md
new file mode 100644
index 0000000..2d6e4e9
--- /dev/null
+++ b/benchmark/README.md
@@ -0,0 +1,27 @@
+# Benchmark suite for Java 8 Streams compatibility layer
+
+This project is intended to support semi-manual benchmarking of the Java 8 streams compatibility layer in Scala collections.
+
+Because the benchmarking is **very computationally expensive** it should be done occasionally, not automatically.
+
+## Code generation step
+
+1. Make sure the parent project has been built by running `sbt package` in it.
+
+2. `cd` to the benchmark project and run `sbt generateJmh`
+
+## Benchmarking step
+
+1. Make sure your terminal has plenty of lines of scrollback. (A couple thousand should do.)
+
+2. Run `sbt "jmh:run -i 5 -wi 3 -f 5"`. Wait overnight.
+
+3. Clip off the last set of lines from the terminal window starting before the line that contains `[info] # Run complete. Total time:` and including that line until the end.
+
+4. Save that in the file `results/jmhbench.log`
+
+## Comparison step
+
+1. Run `sbt parseJmh`
+
+2. Look at the ASCII art results showing speed comparisons.
diff --git a/benchmark/build.sbt b/benchmark/build.sbt
new file mode 100644
index 0000000..393b763
--- /dev/null
+++ b/benchmark/build.sbt
@@ -0,0 +1,17 @@
+enablePlugins(JmhPlugin)
+
+val generateJmh = TaskKey[Unit]("generateJmh", "Generates JMH benchmark sources.")
+val parseJmh = TaskKey[Unit]("parseJmh", "Parses JMH benchmark logs in results/jmhbench.log.")
+
+lazy val root = (project in file(".")).settings(
+ name := "java8-compat-bench",
+ scalaVersion := "2.11.12",
+ crossScalaVersions := List("2.11.12" /* TODO, "2.12.0-M4"*/),
+ organization := "org.scala-lang.modules",
+ version := "0.6.0-SNAPSHOT",
+ unmanagedJars in Compile ++= Seq(baseDirectory.value / "../target/scala-2.11/scala-java8-compat_2.11-0.9.0-SNAPSHOT.jar"),
+ // This would be nicer but sbt-jmh doesn't like it:
+ //unmanagedClasspath in Compile += Attributed.blank(baseDirectory.value / "../target/scala-2.11/classes"),
+ generateJmh := (runMain in Compile).toTask(" bench.codegen.GenJmhBench").value,
+ parseJmh := (runMain in Compile).toTask(" bench.examine.ParseJmhLog").value
+)
diff --git a/benchmark/project/plugins.sbt b/benchmark/project/plugins.sbt
new file mode 100644
index 0000000..f5319fb
--- /dev/null
+++ b/benchmark/project/plugins.sbt
@@ -0,0 +1 @@
+addSbtPlugin("pl.project13.scala" % "sbt-jmh" % "0.2.6")
diff --git a/benchmark/results/jmhbench.graphs.ascii b/benchmark/results/jmhbench.graphs.ascii
new file mode 100644
index 0000000..b6f4c9d
--- /dev/null
+++ b/benchmark/results/jmhbench.graphs.ascii
@@ -0,0 +1,2537 @@
+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+filter/map/sum trio
+10 elements
+collection.mutable.ArrayBuffer
+ Int, base collection ##= 0.112 +- 9.4 %
+ Int, iterator on coll #### 0.160 +- 14.7 %
+ Int, serial stream ###- 0.129 +- 9.6 %
+
+filter/map/sum trio
+10 elements
+Array
+ Int, base collection ######################### 1.000 +- 0.2 %
+ Int, iterator on coll ###= 0.150 +- 10.1 %
+ Int, serial stream #####= 0.223 +- 6.0 %
+
+filter/map/sum trio
+10 elements
+collection.mutable.ArraySeq
+ Int, base collection #= 0.068 +- 12.4 %
+ Int, iterator on coll ##### 0.197 +- 11.1 %
+ Int, serial stream ### 0.122 +- 8.4 %
+
+filter/map/sum trio
+10 elements
+collection.mutable.ArrayStack
+ Int, base collection ## 0.081 +- 5.1 %
+ Int, iterator on coll ####- 0.171 +- 1.4 %
+ Int, serial stream ##= 0.113 +- 7.8 %
+
+filter/map/sum trio
+10 elements
+collection.immutable.ListSet
+ Int, base collection # 0.037 +- 15.6 %
+ Int, iterator on coll ####= 0.185 +- 15.0 %
+ Int, serial stream ##- 0.091 +- 6.1 %
+
+filter/map/sum trio
+10 elements
+collection.immutable.HashSet
+ Int, base collection #= 0.069 +- 13.0 %
+ Int, iterator on coll ###- 0.132 +- 14.3 %
+ Int, serial stream ##= 0.111 +- 10.1 %
+
+filter/map/sum trio
+10 elements
+java.util.ArrayList
+ Int, serial stream ###= 0.144 +- 7.1 %
+
+filter/map/sum trio
+10 elements
+java.util.LinkedList
+ Int, serial stream ###= 0.141 +- 3.2 %
+
+filter/map/sum trio
+10 elements
+collection.mutable.LinkedHashSet
+ Int, base collection ## 0.081 +- 17.3 %
+ Int, iterator on coll ####= 0.189 +- 0.6 %
+ Int, serial stream ### 0.114 +- 0.8 %
+
+filter/map/sum trio
+10 elements
+collection.immutable.List
+ Int, base collection ##- 0.099 +- 6.1 %
+ Int, iterator on coll #### 0.165 +- 20.9 %
+ Int, serial stream ##= 0.104 +- 11.6 %
+
+filter/map/sum trio
+10 elements
+collection.mutable.HashSet
+ Int, base collection #- 0.060 +- 1.1 %
+ Int, iterator on coll ##= 0.106 +- 1.2 %
+ Int, serial stream ##= 0.101 +- 6.6 %
+
+filter/map/sum trio
+10 elements
+collection.mutable.Queue
+ Int, base collection # 0.035 +- 13.4 %
+ Int, iterator on coll ##= 0.106 +- 0.8 %
+ Int, serial stream # 0.046 +- 7.3 %
+
+filter/map/sum trio
+10 elements
+collection.mutable.PriorityQueue
+ Int, base collection ##- 0.092 +- 3.6 %
+ Int, iterator on coll ####- 0.174 +- 12.0 %
+ Int, serial stream ### 0.118 +- 7.8 %
+
+filter/map/sum trio
+10 elements
+collection.immutable.Queue
+ Int, base collection #= 0.069 +- 1.7 %
+ Int, iterator on coll ### 0.124 +- 21.0 %
+ Int, serial stream ##= 0.102 +- 3.2 %
+
+filter/map/sum trio
+10 elements
+collection.immutable.Stream
+ Int, base collection ## 0.075 +- 5.5 %
+ Int, iterator on coll #- 0.056 +- 4.7 %
+ Int, serial stream ##= 0.102 +- 15.3 %
+
+filter/map/sum trio
+10 elements
+collection.immutable.TreeSet
+ Int, base collection #= 0.069 +- 3.9 %
+ Int, iterator on coll ### 0.125 +- 3.5 %
+ Int, serial stream ##= 0.108 +- 1.4 %
+
+filter/map/sum trio
+10 elements
+collection.immutable.Vector
+ Int, base collection ##- 0.093 +- 2.9 %
+ Int, iterator on coll #### 0.164 +- 1.2 %
+ Int, serial stream ###- 0.127 +- 2.7 %
+
+filter/map/sum trio
+10 elements
+collection.mutable.WrappedArray
+ Int, base collection ##- 0.095 +- 2.1 %
+ Int, iterator on coll ###- 0.128 +- 0.6 %
+ Int, serial stream ###- 0.129 +- 4.9 %
+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+filter/map/sum trio
+10000 elements
+collection.mutable.ArrayBuffer
+ Int, base collection #####= 0.225 +- 0.7 %
+ Int, iterator on coll ######- 0.258 +- 0.4 %
+ Int, serial stream ##= 0.101 +- 7.9 %
+
+filter/map/sum trio
+10000 elements
+Array
+ Int, base collection ######################### 1.000 +- 0.1 %
+ Int, iterator on coll #### 0.165 +- 2.9 %
+ Int, serial stream ####################= 0.833 +- 1.8 %
+
+filter/map/sum trio
+10000 elements
+collection.mutable.ArraySeq
+ Int, base collection ####= 0.181 +- 3.2 %
+ Int, iterator on coll ######- 0.258 +- 0.7 %
+ Int, serial stream ##- 0.098 +- 8.6 %
+
+filter/map/sum trio
+10000 elements
+collection.mutable.ArrayStack
+ Int, base collection ####= 0.187 +- 1.3 %
+ Int, iterator on coll ######= 0.273 +- 0.5 %
+ Int, serial stream ##= 0.109 +- 5.0 %
+
+filter/map/sum trio
+10000 elements
+collection.immutable.ListSet
+ Int, base collection 0.005 +- 5.2 %
+ Int, iterator on coll #####- 0.214 +- 1.3 %
+ Int, serial stream ##- 0.099 +- 3.6 %
+
+filter/map/sum trio
+10000 elements
+collection.immutable.HashSet
+ Int, base collection # 0.037 +- 9.0 %
+ Int, iterator on coll ##= 0.107 +- 0.6 %
+ Int, serial stream ##- 0.092 +- 0.9 %
+
+filter/map/sum trio
+10000 elements
+java.util.ArrayList
+ Int, serial stream ######- 0.256 +- 5.5 %
+
+filter/map/sum trio
+10000 elements
+java.util.LinkedList
+ Int, serial stream ####### 0.280 +- 3.4 %
+
+filter/map/sum trio
+10000 elements
+collection.mutable.LinkedHashSet
+ Int, base collection ## 0.082 +- 4.3 %
+ Int, iterator on coll ######= 0.261 +- 2.9 %
+ Int, serial stream ##= 0.112 +- 6.3 %
+
+filter/map/sum trio
+10000 elements
+collection.immutable.List
+ Int, base collection ###- 0.135 +- 1.8 %
+ Int, iterator on coll #####- 0.215 +- 1.6 %
+ Int, serial stream #= 0.060 +- 1.6 %
+
+filter/map/sum trio
+10000 elements
+collection.mutable.HashSet
+ Int, base collection # 0.046 +- 2.7 %
+ Int, iterator on coll ##= 0.111 +- 1.6 %
+ Int, serial stream ##= 0.109 +- 2.1 %
+
+filter/map/sum trio
+10000 elements
+collection.mutable.Queue
+ Int, base collection #- 0.059 +- 1.1 %
+ Int, iterator on coll ##### 0.204 +- 1.2 %
+ Int, serial stream #- 0.051 +- 2.4 %
+
+filter/map/sum trio
+10000 elements
+collection.mutable.PriorityQueue
+ Int, base collection ##= 0.103 +- 9.3 %
+ Int, iterator on coll ######- 0.248 +- 0.6 %
+ Int, serial stream ##- 0.088 +- 4.4 %
+
+filter/map/sum trio
+10000 elements
+collection.immutable.Queue
+ Int, base collection ## 0.079 +- 0.7 %
+ Int, iterator on coll #####- 0.211 +- 2.5 %
+ Int, serial stream ##= 0.113 +- 1.6 %
+
+filter/map/sum trio
+10000 elements
+collection.immutable.Stream
+ Int, base collection ##- 0.087 +- 2.4 %
+ Int, iterator on coll #- 0.050 +- 6.6 %
+ Int, serial stream ##- 0.089 +- 31.9 %
+
+filter/map/sum trio
+10000 elements
+collection.immutable.TreeSet
+ Int, base collection = 0.023 +- 2.5 %
+ Int, iterator on coll ###= 0.146 +- 1.6 %
+ Int, serial stream ## 0.083 +- 2.6 %
+
+filter/map/sum trio
+10000 elements
+collection.immutable.Vector
+ Int, base collection #### 0.159 +- 5.3 %
+ Int, iterator on coll ##### 0.206 +- 0.9 %
+ Int, serial stream ##= 0.104 +- 18.7 %
+
+filter/map/sum trio
+10000 elements
+collection.mutable.WrappedArray
+ Int, base collection ### 0.125 +- 1.9 %
+ Int, iterator on coll #### 0.157 +- 3.4 %
+ Int, serial stream ##- 0.091 +- 8.9 %
+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+filter/map/sum trio
+10 elements
+collection.mutable.ArrayBuffer
+ String, base collection #### 0.153 +- 0.6 %
+ String, iterator on coll #########= 0.381 +- 1.0 %
+ String, serial stream ###- 0.138 +- 10.2 %
+
+filter/map/sum trio
+10 elements
+Array
+ String, base collection ######################### 1.000 +- 0.1 %
+ String, iterator on coll #########= 0.389 +- 1.0 %
+ String, serial stream ###= 0.142 +- 8.6 %
+
+filter/map/sum trio
+10 elements
+collection.mutable.ArraySeq
+ String, base collection ##- 0.094 +- 4.2 %
+ String, iterator on coll #########= 0.382 +- 0.4 %
+ String, serial stream ###- 0.136 +- 10.0 %
+
+filter/map/sum trio
+10 elements
+collection.mutable.ArrayStack
+ String, base collection ### 0.124 +- 1.3 %
+ String, iterator on coll ###########= 0.473 +- 1.2 %
+ String, serial stream ### 0.125 +- 10.5 %
+
+filter/map/sum trio
+10 elements
+collection.immutable.ListSet
+ String, base collection #- 0.054 +- 4.9 %
+ String, iterator on coll ######= 0.265 +- 1.2 %
+ String, serial stream ##= 0.102 +- 3.1 %
+
+filter/map/sum trio
+10 elements
+collection.immutable.HashSet
+ String, base collection ##- 0.093 +- 3.1 %
+ String, iterator on coll ##### 0.205 +- 2.7 %
+ String, serial stream ##- 0.097 +- 2.9 %
+
+filter/map/sum trio
+10 elements
+java.util.ArrayList
+ String, serial stream #### 0.159 +- 6.3 %
+
+filter/map/sum trio
+10 elements
+java.util.LinkedList
+ String, serial stream ###= 0.150 +- 4.1 %
+
+filter/map/sum trio
+10 elements
+collection.mutable.LinkedHashSet
+ String, base collection ###- 0.134 +- 1.4 %
+ String, iterator on coll ##########- 0.419 +- 0.7 %
+ String, serial stream ### 0.125 +- 10.9 %
+
+filter/map/sum trio
+10 elements
+collection.immutable.List
+ String, base collection ###- 0.138 +- 3.0 %
+ String, iterator on coll ########## 0.401 +- 1.1 %
+ String, serial stream ##= 0.105 +- 17.2 %
+
+filter/map/sum trio
+10 elements
+collection.mutable.HashSet
+ String, base collection ##= 0.102 +- 2.1 %
+ String, iterator on coll ######- 0.252 +- 0.6 %
+ String, serial stream ##- 0.091 +- 20.6 %
+
+filter/map/sum trio
+10 elements
+collection.mutable.Queue
+ String, base collection # 0.035 +- 1.9 %
+ String, iterator on coll ####- 0.178 +- 1.6 %
+ String, serial stream #- 0.058 +- 5.1 %
+
+filter/map/sum trio
+10 elements
+collection.mutable.PriorityQueue
+ String, base collection ### 0.117 +- 1.0 %
+ String, iterator on coll ########## 0.398 +- 2.4 %
+ String, serial stream ### 0.120 +- 10.1 %
+
+filter/map/sum trio
+10 elements
+collection.immutable.Queue
+ String, base collection ##= 0.102 +- 4.6 %
+ String, iterator on coll ######### 0.357 +- 1.5 %
+ String, serial stream ##- 0.097 +- 11.5 %
+
+filter/map/sum trio
+10 elements
+collection.immutable.Stream
+ String, base collection ##= 0.101 +- 7.1 %
+ String, iterator on coll #= 0.073 +- 5.8 %
+ String, serial stream ##= 0.110 +- 12.1 %
+
+filter/map/sum trio
+10 elements
+collection.immutable.TreeSet
+ String, base collection ##- 0.097 +- 1.6 %
+ String, iterator on coll ##### 0.194 +- 5.2 %
+ String, serial stream ##= 0.102 +- 7.8 %
+
+filter/map/sum trio
+10 elements
+collection.immutable.Vector
+ String, base collection ### 0.126 +- 0.8 %
+ String, iterator on coll #######- 0.299 +- 7.3 %
+ String, serial stream ### 0.123 +- 12.2 %
+
+filter/map/sum trio
+10 elements
+collection.mutable.WrappedArray
+ String, base collection ### 0.123 +- 1.1 %
+ String, iterator on coll ##########- 0.409 +- 0.4 %
+ String, serial stream ###- 0.135 +- 9.9 %
+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+filter/map/sum trio
+10000 elements
+collection.mutable.ArrayBuffer
+ String, base collection ########- 0.328 +- 1.2 %
+ String, iterator on coll ############# 0.518 +- 0.6 %
+ String, serial stream ##########= 0.427 +- 1.0 %
+
+filter/map/sum trio
+10000 elements
+Array
+ String, base collection ######################### 1.000 +- 0.8 %
+ String, iterator on coll #############= 0.548 +- 0.9 %
+ String, serial stream ########### 0.442 +- 13.1 %
+
+filter/map/sum trio
+10000 elements
+collection.mutable.ArraySeq
+ String, base collection #######- 0.292 +- 5.3 %
+ String, iterator on coll ############# 0.523 +- 0.6 %
+ String, serial stream ########= 0.342 +- 17.6 %
+
+filter/map/sum trio
+10000 elements
+collection.mutable.ArrayStack
+ String, base collection ######## 0.325 +- 1.8 %
+ String, iterator on coll ############### 0.600 +- 0.8 %
+ String, serial stream ########- 0.338 +- 15.3 %
+
+filter/map/sum trio
+10000 elements
+collection.immutable.ListSet
+ String, base collection 0.003 +- 8.8 %
+ String, iterator on coll ############# 0.516 +- 1.7 %
+ String, serial stream #######= 0.306 +- 12.0 %
+
+filter/map/sum trio
+10000 elements
+collection.immutable.HashSet
+ String, base collection #- 0.054 +- 1.3 %
+ String, iterator on coll ### 0.118 +- 0.8 %
+ String, serial stream ##= 0.103 +- 0.5 %
+
+filter/map/sum trio
+10000 elements
+java.util.ArrayList
+ String, serial stream ############ 0.478 +- 8.2 %
+
+filter/map/sum trio
+10000 elements
+java.util.LinkedList
+ String, serial stream ############- 0.496 +- 8.7 %
+
+filter/map/sum trio
+10000 elements
+collection.mutable.LinkedHashSet
+ String, base collection ##- 0.091 +- 0.5 %
+ String, iterator on coll #############= 0.545 +- 1.1 %
+ String, serial stream #########= 0.392 +- 10.3 %
+
+filter/map/sum trio
+10000 elements
+collection.immutable.List
+ String, base collection ####- 0.175 +- 3.4 %
+ String, iterator on coll ############= 0.511 +- 2.1 %
+ String, serial stream #######= 0.301 +- 0.7 %
+
+filter/map/sum trio
+10000 elements
+collection.mutable.HashSet
+ String, base collection #- 0.047 +- 0.6 %
+ String, iterator on coll ##= 0.108 +- 0.5 %
+ String, serial stream ### 0.117 +- 0.3 %
+
+filter/map/sum trio
+10000 elements
+collection.mutable.Queue
+ String, base collection # 0.046 +- 0.7 %
+ String, iterator on coll ###########= 0.461 +- 1.3 %
+ String, serial stream ##- 0.097 +- 1.7 %
+
+filter/map/sum trio
+10000 elements
+collection.mutable.PriorityQueue
+ String, base collection ### 0.115 +- 10.9 %
+ String, iterator on coll #########- 0.376 +- 2.2 %
+ String, serial stream ###### 0.245 +- 1.0 %
+
+filter/map/sum trio
+10000 elements
+collection.immutable.Queue
+ String, base collection ###- 0.135 +- 2.0 %
+ String, iterator on coll ############# 0.516 +- 0.9 %
+ String, serial stream #####= 0.220 +- 2.2 %
+
+filter/map/sum trio
+10000 elements
+collection.immutable.Stream
+ String, base collection ### 0.120 +- 2.5 %
+ String, iterator on coll ## 0.086 +- 6.3 %
+ String, serial stream ###### 0.235 +- 5.3 %
+
+filter/map/sum trio
+10000 elements
+collection.immutable.TreeSet
+ String, base collection = 0.024 +- 0.9 %
+ String, iterator on coll ###= 0.146 +- 3.4 %
+ String, serial stream ###= 0.148 +- 0.6 %
+
+filter/map/sum trio
+10000 elements
+collection.immutable.Vector
+ String, base collection #####- 0.207 +- 2.9 %
+ String, iterator on coll #########= 0.382 +- 1.8 %
+ String, serial stream ######### 0.353 +- 24.5 %
+
+filter/map/sum trio
+10000 elements
+collection.mutable.WrappedArray
+ String, base collection ########- 0.334 +- 2.4 %
+ String, iterator on coll #############= 0.542 +- 0.9 %
+ String, serial stream #########- 0.376 +- 18.7 %
+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+slow trig on hashCode
+10 elements
+collection.mutable.ArrayBuffer
+ String, base collection ########################= 0.982 +- 0.1 %
+ String, iterator on coll ########################= 0.993 +- 0.2 %
+ String, serial stream ########################= 0.989 +- 0.3 %
+ String Stepper (can par) ######################### 0.996 +- 0.2 %
+
+slow trig on hashCode
+10 elements
+Array
+ String, base collection ######################### 1.000 +- 0.1 %
+ String, iterator on coll ########################= 0.991 +- 0.2 %
+ String, serial stream ########################= 0.990 +- 0.3 %
+ String Stepper (can par) ######################### 0.996 +- 0.2 %
+
+slow trig on hashCode
+10 elements
+collection.mutable.ArraySeq
+ String, base collection #################= 0.704 +- 0.2 %
+ String, iterator on coll ########################= 0.993 +- 0.2 %
+ String, serial stream ########################= 0.989 +- 0.3 %
+ String Stepper (can par) ######################### 0.995 +- 0.2 %
+
+slow trig on hashCode
+10 elements
+collection.mutable.ArrayStack
+ String, base collection #################= 0.701 +- 0.2 %
+ String, iterator on coll ########################= 0.988 +- 0.3 %
+ String, serial stream ########################= 0.988 +- 0.2 %
+ String Stepper (seq only) ######################### 0.994 +- 0.2 %
+
+slow trig on hashCode
+10 elements
+collection.immutable.ListSet
+ String, base collection #######################- 0.935 +- 0.2 %
+ String, iterator on coll ######################### 0.994 +- 0.2 %
+ String, serial stream ########################= 0.985 +- 0.9 %
+ String Stepper (seq only) ########################= 0.992 +- 0.2 %
+
+slow trig on hashCode
+10 elements
+collection.immutable.HashSet
+ String, base collection #################- 0.689 +- 0.2 %
+ String, iterator on coll ########################= 0.989 +- 0.2 %
+ String, serial stream ########################= 0.991 +- 0.2 %
+ String Stepper (can par) ########################= 0.992 +- 0.2 %
+
+slow trig on hashCode
+10 elements
+java.util.ArrayList
+ String, serial stream ######################### 0.995 +- 0.3 %
+
+slow trig on hashCode
+10 elements
+java.util.LinkedList
+ String, serial stream ######################### 0.997 +- 0.2 %
+
+slow trig on hashCode
+10 elements
+collection.mutable.LinkedHashSet
+ String, base collection ######################## 0.960 +- 0.4 %
+ String, iterator on coll ########################= 0.987 +- 0.3 %
+ String, serial stream ########################= 0.992 +- 0.2 %
+ String Stepper (seq only) ########################= 0.993 +- 0.4 %
+
+slow trig on hashCode
+10 elements
+collection.immutable.List
+ String, base collection ########################= 0.985 +- 0.2 %
+ String, iterator on coll ######################### 0.993 +- 0.2 %
+ String, serial stream ########################= 0.993 +- 0.2 %
+ String Stepper (seq only) ######################### 0.994 +- 0.3 %
+
+slow trig on hashCode
+10 elements
+collection.mutable.HashSet
+ String, base collection ######################## 0.960 +- 0.3 %
+ String, iterator on coll ########################= 0.984 +- 0.2 %
+ String, serial stream ########################= 0.989 +- 0.2 %
+ String Stepper (can par) ########################= 0.992 +- 0.2 %
+
+slow trig on hashCode
+10 elements
+collection.mutable.Queue
+ String, base collection #######################- 0.927 +- 0.4 %
+ String, iterator on coll ######################### 0.994 +- 0.3 %
+ String, serial stream ########################- 0.972 +- 0.3 %
+ String Stepper (seq only) ########################- 0.973 +- 0.2 %
+
+slow trig on hashCode
+10 elements
+collection.mutable.PriorityQueue
+ String, base collection ########################= 0.983 +- 0.2 %
+ String, iterator on coll ######################### 0.993 +- 0.3 %
+ String, serial stream ########################= 0.989 +- 0.4 %
+ String Stepper (seq only) ######################### 0.995 +- 0.2 %
+
+slow trig on hashCode
+10 elements
+collection.immutable.Queue
+ String, base collection ######################## 0.966 +- 0.2 %
+ String, iterator on coll ######################### 0.994 +- 0.2 %
+ String, serial stream ########################= 0.986 +- 0.5 %
+ String Stepper (seq only) ######################### 0.993 +- 0.2 %
+
+slow trig on hashCode
+10 elements
+collection.immutable.Stream
+ String, base collection ######################## 0.956 +- 0.2 %
+ String, iterator on coll ########################- 0.975 +- 0.2 %
+ String, serial stream ########################= 0.987 +- 0.5 %
+ String Stepper (seq only) ######################### 0.994 +- 0.6 %
+
+slow trig on hashCode
+10 elements
+collection.immutable.TreeSet
+ String, base collection ################# 0.682 +- 0.2 %
+ String, iterator on coll ########################= 0.992 +- 0.2 %
+ String, serial stream ########################= 0.991 +- 0.2 %
+ String Stepper (seq only) ########################= 0.993 +- 0.3 %
+
+slow trig on hashCode
+10 elements
+collection.immutable.Vector
+ String, base collection ########################= 0.982 +- 0.2 %
+ String, iterator on coll ######################### 0.994 +- 0.2 %
+ String, serial stream ########################= 0.988 +- 0.3 %
+ String Stepper (can par) ########################= 0.991 +- 0.5 %
+
+slow trig on hashCode
+10 elements
+collection.mutable.WrappedArray
+ String, base collection ########################= 0.983 +- 0.2 %
+ String, iterator on coll ########################= 0.993 +- 0.2 %
+ String, serial stream ########################= 0.988 +- 0.4 %
+ String Stepper (can par) ######################### 0.995 +- 0.2 %
+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+slow trig on hashCode
+10000 elements
+collection.mutable.ArrayBuffer
+ String, base collection ########################= 0.989 +- 0.2 %
+ String, iterator on coll ########################= 0.993 +- 0.2 %
+ String, serial stream ######################### 0.995 +- 0.2 %
+ String Stepper (can par) ######################### 0.995 +- 0.2 %
+
+slow trig on hashCode
+10000 elements
+Array
+ String, base collection ######################### 1.000 +- 0.1 %
+ String, iterator on coll ########################= 0.992 +- 0.2 %
+ String, serial stream ######################### 0.996 +- 0.1 %
+ String Stepper (can par) ######################### 0.996 +- 0.3 %
+
+slow trig on hashCode
+10000 elements
+collection.mutable.ArraySeq
+ String, base collection ##################### 0.839 +- 11.2 %
+ String, iterator on coll ########################= 0.992 +- 0.2 %
+ String, serial stream ######################### 0.994 +- 0.2 %
+ String Stepper (can par) ######################### 0.996 +- 0.2 %
+
+slow trig on hashCode
+10000 elements
+collection.mutable.ArrayStack
+ String, base collection #################= 0.713 +- 0.2 %
+ String, iterator on coll ########################= 0.993 +- 0.2 %
+ String, serial stream ######################### 0.994 +- 0.2 %
+ String Stepper (seq only) ######################### 0.995 +- 0.2 %
+
+slow trig on hashCode
+10000 elements
+collection.immutable.ListSet
+ String, base collection ######################= 0.913 +- 0.3 %
+ String, iterator on coll ########################= 0.992 +- 0.2 %
+ String, serial stream ########################= 0.991 +- 0.2 %
+ String Stepper (seq only) ########################= 0.986 +- 1.0 %
+
+slow trig on hashCode
+10000 elements
+collection.immutable.HashSet
+ String, base collection ###############= 0.627 +- 0.4 %
+ String, iterator on coll ########################= 0.982 +- 0.2 %
+ String, serial stream ########################- 0.970 +- 0.1 %
+ String Stepper (can par) ########################= 0.981 +- 0.5 %
+
+slow trig on hashCode
+10000 elements
+java.util.ArrayList
+ String, serial stream ######################### 0.996 +- 0.1 %
+
+slow trig on hashCode
+10000 elements
+java.util.LinkedList
+ String, serial stream ######################### 0.996 +- 0.1 %
+
+slow trig on hashCode
+10000 elements
+collection.mutable.LinkedHashSet
+ String, base collection #######################= 0.941 +- 0.2 %
+ String, iterator on coll ########################= 0.993 +- 0.2 %
+ String, serial stream ######################### 0.995 +- 0.1 %
+ String Stepper (seq only) ######################### 0.994 +- 0.4 %
+
+slow trig on hashCode
+10000 elements
+collection.immutable.List
+ String, base collection ########################= 0.987 +- 0.2 %
+ String, iterator on coll ######################### 0.994 +- 0.2 %
+ String, serial stream ######################### 0.996 +- 0.1 %
+ String Stepper (seq only) ######################### 0.996 +- 0.2 %
+
+slow trig on hashCode
+10000 elements
+collection.mutable.HashSet
+ String, base collection ####################### 0.916 +- 0.4 %
+ String, iterator on coll ########################- 0.977 +- 0.4 %
+ String, serial stream ########################- 0.979 +- 0.1 %
+ String Stepper (can par) ########################= 0.983 +- 0.4 %
+
+slow trig on hashCode
+10000 elements
+collection.mutable.Queue
+ String, base collection ######################## 0.957 +- 0.3 %
+ String, iterator on coll ########################= 0.992 +- 0.3 %
+ String, serial stream ########################- 0.977 +- 0.2 %
+ String Stepper (seq only) ########################- 0.971 +- 0.2 %
+
+slow trig on hashCode
+10000 elements
+collection.mutable.PriorityQueue
+ String, base collection #################= 0.711 +- 0.3 %
+ String, iterator on coll ########################= 0.988 +- 0.4 %
+ String, serial stream ########################= 0.989 +- 0.1 %
+ String Stepper (seq only) ########################= 0.990 +- 0.4 %
+
+slow trig on hashCode
+10000 elements
+collection.immutable.Queue
+ String, base collection ########################- 0.972 +- 0.3 %
+ String, iterator on coll ########################= 0.993 +- 0.3 %
+ String, serial stream ########################= 0.987 +- 0.7 %
+ String Stepper (seq only) ########################= 0.990 +- 0.2 %
+
+slow trig on hashCode
+10000 elements
+collection.immutable.Stream
+ String, base collection ######################## 0.954 +- 0.2 %
+ String, iterator on coll ########################- 0.975 +- 0.3 %
+ String, serial stream ########################= 0.992 +- 0.1 %
+ String Stepper (seq only) ########################= 0.993 +- 0.3 %
+
+slow trig on hashCode
+10000 elements
+collection.immutable.TreeSet
+ String, base collection ################ 0.635 +- 0.4 %
+ String, iterator on coll ########################= 0.983 +- 0.3 %
+ String, serial stream ########################= 0.981 +- 0.2 %
+ String Stepper (seq only) ########################= 0.983 +- 0.4 %
+
+slow trig on hashCode
+10000 elements
+collection.immutable.Vector
+ String, base collection ########################= 0.984 +- 0.2 %
+ String, iterator on coll ########################= 0.991 +- 0.2 %
+ String, serial stream ######################### 0.995 +- 0.1 %
+ String Stepper (can par) ######################### 0.995 +- 0.2 %
+
+slow trig on hashCode
+10000 elements
+collection.mutable.WrappedArray
+ String, base collection ########################= 0.986 +- 0.2 %
+ String, iterator on coll ########################= 0.992 +- 0.2 %
+ String, serial stream ######################### 0.995 +- 0.1 %
+ String Stepper (can par) ######################### 0.996 +- 0.2 %
+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+map/filter/take trio
+10 elements
+collection.mutable.ArrayBuffer
+ Int, base collection # 0.043 +- 0.7 %
+ Int, iterator on coll ###### 0.237 +- 14.9 %
+ Int, serial stream #= 0.067 +- 3.1 %
+
+map/filter/take trio
+10 elements
+Array
+ Int, base collection ######################### 1.000 +- 0.9 %
+ Int, iterator on coll ######- 0.257 +- 25.2 %
+ Int, serial stream ## 0.076 +- 2.2 %
+
+map/filter/take trio
+10 elements
+collection.mutable.ArraySeq
+ Int, base collection = 0.031 +- 1.2 %
+ Int, iterator on coll #####- 0.213 +- 20.9 %
+ Int, serial stream #= 0.065 +- 7.1 %
+
+map/filter/take trio
+10 elements
+collection.mutable.ArrayStack
+ Int, base collection = 0.023 +- 1.6 %
+ Int, iterator on coll ######- 0.259 +- 15.7 %
+ Int, serial stream #= 0.066 +- 1.0 %
+
+map/filter/take trio
+10 elements
+java.util.ArrayList
+ Int, serial stream #- 0.051 +- 1.8 %
+
+map/filter/take trio
+10 elements
+java.util.LinkedList
+ Int, serial stream #- 0.052 +- 4.6 %
+
+map/filter/take trio
+10 elements
+collection.immutable.List
+ Int, base collection #= 0.063 +- 2.1 %
+ Int, iterator on coll ######= 0.267 +- 2.3 %
+ Int, serial stream #- 0.059 +- 1.9 %
+
+map/filter/take trio
+10 elements
+collection.mutable.Queue
+ Int, base collection - 0.013 +- 4.4 %
+ Int, iterator on coll ###- 0.130 +- 3.8 %
+ Int, serial stream = 0.027 +- 2.4 %
+
+map/filter/take trio
+10 elements
+collection.immutable.Queue
+ Int, base collection = 0.022 +- 0.8 %
+ Int, iterator on coll #####= 0.222 +- 13.2 %
+ Int, serial stream #- 0.050 +- 2.0 %
+
+map/filter/take trio
+10 elements
+collection.immutable.Stream
+ Int, base collection - 0.013 +- 3.4 %
+ Int, iterator on coll # 0.039 +- 5.1 %
+ Int, serial stream #- 0.058 +- 2.7 %
+
+map/filter/take trio
+10 elements
+collection.immutable.Vector
+ Int, base collection #- 0.058 +- 1.1 %
+ Int, iterator on coll ######- 0.254 +- 2.1 %
+ Int, serial stream #= 0.066 +- 2.4 %
+
+map/filter/take trio
+10 elements
+collection.mutable.WrappedArray
+ Int, base collection # 0.045 +- 0.6 %
+ Int, iterator on coll #####- 0.209 +- 14.9 %
+ Int, serial stream #= 0.063 +- 1.3 %
+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+map/filter/take trio
+10000 elements
+collection.mutable.ArrayBuffer
+ Int, base collection 0.000 +- 3.5 %
+ Int, iterator on coll #= 0.067 +- 13.3 %
+ Int, serial stream #- 0.056 +- 1.9 %
+
+map/filter/take trio
+10000 elements
+Array
+ Int, base collection ######################### 1.000 +- 0.7 %
+ Int, iterator on coll ## 0.084 +- 10.5 %
+ Int, serial stream #= 0.063 +- 1.0 %
+
+map/filter/take trio
+10000 elements
+collection.mutable.ArraySeq
+ Int, base collection 0.000 +- 2.3 %
+ Int, iterator on coll #= 0.062 +- 0.4 %
+ Int, serial stream #- 0.056 +- 1.1 %
+
+map/filter/take trio
+10000 elements
+collection.mutable.ArrayStack
+ Int, base collection 0.000 +- 8.5 %
+ Int, iterator on coll ## 0.080 +- 17.5 %
+ Int, serial stream #- 0.053 +- 2.6 %
+
+map/filter/take trio
+10000 elements
+java.util.ArrayList
+ Int, serial stream # 0.042 +- 4.4 %
+
+map/filter/take trio
+10000 elements
+java.util.LinkedList
+ Int, serial stream # 0.041 +- 5.9 %
+
+map/filter/take trio
+10000 elements
+collection.immutable.List
+ Int, base collection 0.000 +- 1.0 %
+ Int, iterator on coll #= 0.072 +- 0.8 %
+ Int, serial stream #- 0.055 +- 10.6 %
+
+map/filter/take trio
+10000 elements
+collection.mutable.Queue
+ Int, base collection 0.000 +- 3.2 %
+ Int, iterator on coll #- 0.053 +- 28.4 %
+ Int, serial stream - 0.018 +- 1.7 %
+
+map/filter/take trio
+10000 elements
+collection.immutable.Queue
+ Int, base collection 0.000 +- 1.4 %
+ Int, iterator on coll ## 0.076 +- 10.0 %
+ Int, serial stream # 0.037 +- 1.2 %
+
+map/filter/take trio
+10000 elements
+collection.immutable.Stream
+ Int, base collection - 0.009 +- 6.4 %
+ Int, iterator on coll = 0.026 +- 4.1 %
+ Int, serial stream #- 0.056 +- 0.8 %
+
+map/filter/take trio
+10000 elements
+collection.immutable.Vector
+ Int, base collection 0.000 +- 2.0 %
+ Int, iterator on coll ## 0.082 +- 15.8 %
+ Int, serial stream #- 0.055 +- 3.9 %
+
+map/filter/take trio
+10000 elements
+collection.mutable.WrappedArray
+ Int, base collection 0.000 +- 8.8 %
+ Int, iterator on coll #- 0.053 +- 1.3 %
+ Int, serial stream #- 0.049 +- 0.7 %
+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+map/filter/take trio
+10 elements
+collection.mutable.ArrayBuffer
+ String, base collection ############ 0.485 +- 0.8 %
+ String, iterator on coll #############- 0.531 +- 1.1 %
+ String, serial stream ############= 0.502 +- 3.1 %
+
+map/filter/take trio
+10 elements
+Array
+ String, base collection ######################### 1.000 +- 0.6 %
+ String, iterator on coll #############- 0.527 +- 1.7 %
+ String, serial stream ############# 0.516 +- 1.0 %
+
+map/filter/take trio
+10 elements
+collection.mutable.ArraySeq
+ String, base collection ##########- 0.414 +- 0.9 %
+ String, iterator on coll ############= 0.509 +- 3.8 %
+ String, serial stream #############= 0.545 +- 12.0 %
+
+map/filter/take trio
+10 elements
+collection.mutable.ArrayStack
+ String, base collection ########- 0.335 +- 1.8 %
+ String, iterator on coll #############= 0.551 +- 10.2 %
+ String, serial stream #############- 0.531 +- 10.7 %
+
+map/filter/take trio
+10 elements
+java.util.ArrayList
+ String, serial stream ############ 0.477 +- 2.2 %
+
+map/filter/take trio
+10 elements
+java.util.LinkedList
+ String, serial stream ############- 0.487 +- 5.2 %
+
+map/filter/take trio
+10 elements
+collection.immutable.List
+ String, base collection #############= 0.547 +- 5.1 %
+ String, iterator on coll ##############= 0.589 +- 1.4 %
+ String, serial stream #############- 0.528 +- 13.5 %
+
+map/filter/take trio
+10 elements
+collection.mutable.Queue
+ String, base collection ###### 0.235 +- 3.4 %
+ String, iterator on coll #############- 0.531 +- 1.2 %
+ String, serial stream #########= 0.389 +- 9.1 %
+
+map/filter/take trio
+10 elements
+collection.immutable.Queue
+ String, base collection ########- 0.336 +- 1.1 %
+ String, iterator on coll ##############= 0.589 +- 1.3 %
+ String, serial stream ###########- 0.458 +- 2.1 %
+
+map/filter/take trio
+10 elements
+collection.immutable.Stream
+ String, base collection ######- 0.250 +- 2.5 %
+ String, iterator on coll ##########- 0.415 +- 2.0 %
+ String, serial stream #############= 0.546 +- 12.1 %
+
+map/filter/take trio
+10 elements
+collection.immutable.Vector
+ String, base collection ############= 0.512 +- 6.6 %
+ String, iterator on coll ############# 0.525 +- 1.2 %
+ String, serial stream ############- 0.496 +- 1.0 %
+
+map/filter/take trio
+10 elements
+collection.mutable.WrappedArray
+ String, base collection ###########= 0.472 +- 4.5 %
+ String, iterator on coll #############- 0.527 +- 2.6 %
+ String, serial stream ############- 0.500 +- 1.0 %
+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+map/filter/take trio
+10000 elements
+collection.mutable.ArrayBuffer
+ String, base collection 0.000 +- 9.2 %
+ String, iterator on coll ############## 0.555 +- 1.4 %
+ String, serial stream #############- 0.530 +- 1.4 %
+
+map/filter/take trio
+10000 elements
+Array
+ String, base collection ######################### 1.000 +- 8.4 %
+ String, iterator on coll #############= 0.542 +- 1.1 %
+ String, serial stream #############= 0.549 +- 3.1 %
+
+map/filter/take trio
+10000 elements
+collection.mutable.ArraySeq
+ String, base collection 0.000 +- 6.2 %
+ String, iterator on coll #############= 0.550 +- 2.2 %
+ String, serial stream ##############- 0.571 +- 12.9 %
+
+map/filter/take trio
+10000 elements
+collection.mutable.ArrayStack
+ String, base collection 0.000 +- 6.9 %
+ String, iterator on coll ###############= 0.624 +- 7.3 %
+ String, serial stream ############# 0.516 +- 1.8 %
+
+map/filter/take trio
+10000 elements
+java.util.ArrayList
+ String, serial stream ############# 0.522 +- 4.9 %
+
+map/filter/take trio
+10000 elements
+java.util.LinkedList
+ String, serial stream ############= 0.511 +- 1.6 %
+
+map/filter/take trio
+10000 elements
+collection.immutable.List
+ String, base collection 0.001 +- 9.9 %
+ String, iterator on coll ############### 0.600 +- 2.1 %
+ String, serial stream ############## 0.554 +- 5.2 %
+
+map/filter/take trio
+10000 elements
+collection.mutable.Queue
+ String, base collection 0.000 +- 7.9 %
+ String, iterator on coll ############## 0.562 +- 1.2 %
+ String, serial stream ########## 0.396 +- 9.2 %
+
+map/filter/take trio
+10000 elements
+collection.immutable.Queue
+ String, base collection 0.000 +- 3.8 %
+ String, iterator on coll ##############= 0.590 +- 2.3 %
+ String, serial stream #############= 0.546 +- 13.1 %
+
+map/filter/take trio
+10000 elements
+collection.immutable.Stream
+ String, base collection ######= 0.273 +- 2.0 %
+ String, iterator on coll ###########- 0.458 +- 3.7 %
+ String, serial stream ############### 0.606 +- 11.6 %
+
+map/filter/take trio
+10000 elements
+collection.immutable.Vector
+ String, base collection 0.001 +- 8.4 %
+ String, iterator on coll ############# 0.521 +- 1.4 %
+ String, serial stream #############= 0.540 +- 4.6 %
+
+map/filter/take trio
+10000 elements
+collection.mutable.WrappedArray
+ String, base collection 0.001 +- 1.7 %
+ String, iterator on coll #############= 0.544 +- 2.2 %
+ String, serial stream #############= 0.543 +- 3.3 %
+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+fast sum of lengths
+10 elements
+collection.mutable.ArrayBuffer
+ String, base collection ########- 0.332 +- 0.8 %
+ String, iterator on coll ######## 0.316 +- 2.1 %
+ String, serial stream ######## 0.318 +- 1.3 %
+ String Stepper (can par) ##############= 0.582 +- 0.4 %
+
+fast sum of lengths
+10 elements
+Array
+ String, base collection ######################### 1.000 +- 0.4 %
+ String, iterator on coll #######- 0.287 +- 15.1 %
+ String, serial stream ######## 0.325 +- 1.5 %
+ String Stepper (can par) ################# 0.686 +- 0.4 %
+
+fast sum of lengths
+10 elements
+collection.mutable.ArraySeq
+ String, base collection ##################- 0.731 +- 1.2 %
+ String, iterator on coll ######## 0.319 +- 0.5 %
+ String, serial stream ######## 0.319 +- 0.6 %
+ String Stepper (can par) ##############= 0.582 +- 0.3 %
+
+fast sum of lengths
+10 elements
+collection.mutable.ArrayStack
+ String, base collection ##################- 0.729 +- 1.5 %
+ String, iterator on coll ########= 0.344 +- 1.0 %
+ String, serial stream ####### 0.282 +- 3.0 %
+ String Stepper (seq only) ############# 0.519 +- 9.1 %
+
+fast sum of lengths
+10 elements
+collection.immutable.ListSet
+ String, base collection #####- 0.219 +- 0.4 %
+ String, iterator on coll ####### 0.285 +- 0.9 %
+ String, serial stream ####- 0.179 +- 5.8 %
+ String Stepper (seq only) ########## 0.394 +- 1.2 %
+
+fast sum of lengths
+10 elements
+collection.immutable.HashSet
+ String, base collection ######= 0.266 +- 11.3 %
+ String, iterator on coll ####### 0.277 +- 11.4 %
+ String, serial stream #### 0.161 +- 1.3 %
+ String Stepper (can par) #####= 0.221 +- 3.2 %
+
+fast sum of lengths
+10 elements
+java.util.ArrayList
+ String, serial stream ########- 0.337 +- 0.4 %
+
+fast sum of lengths
+10 elements
+java.util.LinkedList
+ String, serial stream ######## 0.314 +- 1.6 %
+
+fast sum of lengths
+10 elements
+collection.mutable.LinkedHashSet
+ String, base collection ################= 0.668 +- 1.1 %
+ String, iterator on coll #########- 0.370 +- 0.9 %
+ String, serial stream #######- 0.292 +- 0.8 %
+ String Stepper (seq only) ############- 0.495 +- 0.9 %
+
+fast sum of lengths
+10 elements
+collection.immutable.List
+ String, base collection ###############- 0.613 +- 1.3 %
+ String, iterator on coll ########= 0.343 +- 0.4 %
+ String, serial stream #####- 0.214 +- 2.0 %
+ String Stepper (seq only) ########- 0.339 +- 2.4 %
+
+fast sum of lengths
+10 elements
+collection.mutable.HashSet
+ String, base collection ###########- 0.458 +- 4.6 %
+ String, iterator on coll ######- 0.248 +- 0.7 %
+ String, serial stream ##### 0.199 +- 0.9 %
+ String Stepper (can par) ##########= 0.432 +- 1.4 %
+
+fast sum of lengths
+10 elements
+collection.mutable.Queue
+ String, base collection ## 0.086 +- 0.8 %
+ String, iterator on coll ###### 0.245 +- 0.4 %
+ String, serial stream #= 0.069 +- 1.0 %
+ String Stepper (seq only) ## 0.084 +- 1.8 %
+
+fast sum of lengths
+10 elements
+collection.mutable.PriorityQueue
+ String, base collection ######## 0.314 +- 0.3 %
+ String, iterator on coll ######## 0.322 +- 0.5 %
+ String, serial stream ####### 0.285 +- 1.3 %
+ String Stepper (seq only) ############= 0.505 +- 0.8 %
+
+fast sum of lengths
+10 elements
+collection.immutable.Queue
+ String, base collection #####= 0.232 +- 0.4 %
+ String, iterator on coll ########- 0.330 +- 0.7 %
+ String, serial stream #### 0.166 +- 0.9 %
+ String Stepper (seq only) #####= 0.231 +- 1.1 %
+
+fast sum of lengths
+10 elements
+collection.immutable.Stream
+ String, base collection ###############= 0.629 +- 0.7 %
+ String, iterator on coll ## 0.087 +- 4.7 %
+ String, serial stream #####- 0.219 +- 1.6 %
+ String Stepper (seq only) ########- 0.331 +- 1.0 %
+
+fast sum of lengths
+10 elements
+collection.immutable.TreeSet
+ String, base collection ########- 0.338 +- 0.4 %
+ String, iterator on coll #####= 0.224 +- 0.7 %
+ String, serial stream ####- 0.173 +- 1.6 %
+ String Stepper (seq only) ######- 0.255 +- 3.4 %
+
+fast sum of lengths
+10 elements
+collection.immutable.Vector
+ String, base collection ####### 0.276 +- 0.5 %
+ String, iterator on coll #######= 0.307 +- 0.5 %
+ String, serial stream ###### 0.236 +- 1.2 %
+ String Stepper (can par) ##########- 0.418 +- 0.6 %
+
+fast sum of lengths
+10 elements
+collection.mutable.WrappedArray
+ String, base collection ########= 0.344 +- 0.3 %
+ String, iterator on coll ########- 0.329 +- 0.3 %
+ String, serial stream ######## 0.317 +- 0.5 %
+ String Stepper (can par) ##############= 0.583 +- 1.4 %
+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+fast sum of lengths
+10000 elements
+collection.mutable.ArrayBuffer
+ String, base collection ########= 0.340 +- 0.9 %
+ String, iterator on coll ########- 0.334 +- 0.3 %
+ String, serial stream #################- 0.690 +- 33.6 %
+ String Stepper (can par) ############# 0.526 +- 2.1 %
+
+fast sum of lengths
+10000 elements
+Array
+ String, base collection ######################### 1.000 +- 0.6 %
+ String, iterator on coll ########- 0.328 +- 0.9 %
+ String, serial stream ################## 0.726 +- 27.9 %
+ String Stepper (can par) ################ 0.640 +- 4.6 %
+
+fast sum of lengths
+10000 elements
+collection.mutable.ArraySeq
+ String, base collection ####################= 0.830 +- 0.7 %
+ String, iterator on coll ########- 0.332 +- 0.4 %
+ String, serial stream ###################- 0.774 +- 24.4 %
+ String Stepper (can par) ############# 0.523 +- 1.9 %
+
+fast sum of lengths
+10000 elements
+collection.mutable.ArrayStack
+ String, base collection ################- 0.654 +- 6.7 %
+ String, iterator on coll ######### 0.362 +- 0.3 %
+ String, serial stream ################= 0.666 +- 25.4 %
+ String Stepper (seq only) ############# 0.515 +- 9.1 %
+
+fast sum of lengths
+10000 elements
+collection.immutable.ListSet
+ String, base collection #########- 0.379 +- 30.0 %
+ String, iterator on coll ######## 0.325 +- 16.5 %
+ String, serial stream ########### 0.436 +- 39.9 %
+ String Stepper (seq only) #########- 0.372 +- 6.0 %
+
+fast sum of lengths
+10000 elements
+collection.immutable.HashSet
+ String, base collection ### 0.125 +- 3.1 %
+ String, iterator on coll ### 0.123 +- 1.0 %
+ String, serial stream ### 0.118 +- 0.5 %
+ String Stepper (can par) ###- 0.135 +- 0.6 %
+
+fast sum of lengths
+10000 elements
+java.util.ArrayList
+ String, serial stream ####################= 0.821 +- 10.1 %
+
+fast sum of lengths
+10000 elements
+java.util.LinkedList
+ String, serial stream ################### 0.755 +- 3.9 %
+
+fast sum of lengths
+10000 elements
+collection.mutable.LinkedHashSet
+ String, base collection #################- 0.691 +- 2.3 %
+ String, iterator on coll ##########- 0.412 +- 11.4 %
+ String, serial stream #############= 0.551 +- 30.5 %
+ String Stepper (seq only) ########## 0.402 +- 3.8 %
+
+fast sum of lengths
+10000 elements
+collection.immutable.List
+ String, base collection #################= 0.713 +- 1.4 %
+ String, iterator on coll #########- 0.372 +- 11.2 %
+ String, serial stream ###########- 0.459 +- 0.6 %
+ String Stepper (seq only) #######= 0.304 +- 1.5 %
+
+fast sum of lengths
+10000 elements
+collection.mutable.HashSet
+ String, base collection ###- 0.127 +- 0.2 %
+ String, iterator on coll ##= 0.113 +- 0.3 %
+ String, serial stream ## 0.086 +- 0.4 %
+ String Stepper (can par) ###- 0.133 +- 0.9 %
+
+fast sum of lengths
+10000 elements
+collection.mutable.Queue
+ String, base collection #= 0.072 +- 1.4 %
+ String, iterator on coll #########- 0.367 +- 26.7 %
+ String, serial stream ### 0.115 +- 1.7 %
+ String Stepper (seq only) ## 0.080 +- 1.2 %
+
+fast sum of lengths
+10000 elements
+collection.mutable.PriorityQueue
+ String, base collection ########- 0.338 +- 30.0 %
+ String, iterator on coll ######## 0.319 +- 30.9 %
+ String, serial stream #### 0.166 +- 16.9 %
+ String Stepper (seq only) ###### 0.243 +- 5.6 %
+
+fast sum of lengths
+10000 elements
+collection.immutable.Queue
+ String, base collection #########= 0.381 +- 32.4 %
+ String, iterator on coll ########## 0.399 +- 11.0 %
+ String, serial stream ######- 0.254 +- 2.7 %
+ String Stepper (seq only) #####= 0.220 +- 0.8 %
+
+fast sum of lengths
+10000 elements
+collection.immutable.Stream
+ String, base collection #######- 0.287 +- 4.8 %
+ String, iterator on coll ##- 0.095 +- 7.2 %
+ String, serial stream #####= 0.220 +- 8.0 %
+ String Stepper (seq only) ######- 0.258 +- 1.7 %
+
+fast sum of lengths
+10000 elements
+collection.immutable.TreeSet
+ String, base collection ####= 0.180 +- 0.7 %
+ String, iterator on coll ##### 0.194 +- 8.2 %
+ String, serial stream ##= 0.110 +- 0.9 %
+ String Stepper (seq only) ####= 0.190 +- 2.3 %
+
+fast sum of lengths
+10000 elements
+collection.immutable.Vector
+ String, base collection ##########- 0.412 +- 15.0 %
+ String, iterator on coll ######### 0.355 +- 22.0 %
+ String, serial stream ###########= 0.460 +- 16.9 %
+ String Stepper (can par) ###########- 0.452 +- 3.0 %
+
+fast sum of lengths
+10000 elements
+collection.mutable.WrappedArray
+ String, base collection ########= 0.353 +- 0.3 %
+ String, iterator on coll ########- 0.340 +- 0.8 %
+ String, serial stream ################# 0.683 +- 32.7 %
+ String Stepper (can par) #############- 0.533 +- 2.6 %
+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+parallel filter/map/sum trio
+10 elements
+collection.mutable.ArrayBuffer
+ Int, par collection ########################- 0.968 +- 3.4 %
+ Int, parallel stream ##############################~~# 4.299 +- 2.7 %
+
+parallel filter/map/sum trio
+10 elements
+Array
+ Int, par collection ######################### 1.000 +- 2.1 %
+ Int, parallel stream ##############################~~# 4.361 +- 1.2 %
+
+parallel filter/map/sum trio
+10 elements
+collection.mutable.ArraySeq
+ Int, par collection #########################- 1.014 +- 1.2 %
+ Int, parallel stream ##############################~~# 4.362 +- 2.0 %
+
+parallel filter/map/sum trio
+10 elements
+collection.immutable.HashSet
+ Int, par collection ####################= 0.830 +- 2.2 %
+ Int, parallel stream ##############################~~# 3.569 +- 1.5 %
+
+parallel filter/map/sum trio
+10 elements
+java.util.ArrayList
+ Int, parallel stream ##############################~~# 4.389 +- 1.1 %
+
+parallel filter/map/sum trio
+10 elements
+java.util.LinkedList
+ Int, parallel stream ##############################~~# 4.299 +- 2.4 %
+
+parallel filter/map/sum trio
+10 elements
+collection.mutable.HashSet
+ Int, par collection ########################### 1.079 +- 1.1 %
+ Int, parallel stream ##############################~~# 5.277 +- 2.3 %
+
+parallel filter/map/sum trio
+10 elements
+collection.immutable.Vector
+ Int, par collection #####################- 0.847 +- 1.7 %
+ Int, parallel stream ##############################~~# 4.289 +- 1.2 %
+
+parallel filter/map/sum trio
+10 elements
+collection.mutable.WrappedArray
+ Int, par collection ######################### 1.003 +- 1.4 %
+ Int, parallel stream ##############################~~# 4.399 +- 0.6 %
+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+parallel filter/map/sum trio
+10000 elements
+collection.mutable.ArrayBuffer
+ Int, par collection ##############################~~# 1.469 +- 1.3 %
+ Int, parallel stream ##############################~~# 6.310 +- 10.2 %
+
+parallel filter/map/sum trio
+10000 elements
+Array
+ Int, par collection ######################### 1.000 +- 1.0 %
+ Int, parallel stream ##############################~~# 11.043 +- 1.0 %
+
+parallel filter/map/sum trio
+10000 elements
+collection.mutable.ArraySeq
+ Int, par collection ##############################~~# 1.469 +- 1.5 %
+ Int, parallel stream ##############################~~# 6.301 +- 4.2 %
+
+parallel filter/map/sum trio
+10000 elements
+collection.immutable.HashSet
+ Int, par collection ################= 0.664 +- 0.8 %
+ Int, parallel stream ##############################~~# 3.468 +- 1.0 %
+
+parallel filter/map/sum trio
+10000 elements
+java.util.ArrayList
+ Int, parallel stream ##############################~~# 9.264 +- 3.0 %
+
+parallel filter/map/sum trio
+10000 elements
+java.util.LinkedList
+ Int, parallel stream ##############################~~# 4.247 +- 10.6 %
+
+parallel filter/map/sum trio
+10000 elements
+collection.mutable.HashSet
+ Int, par collection ################## 0.727 +- 1.2 %
+ Int, parallel stream ##############################~~# 3.579 +- 7.4 %
+
+parallel filter/map/sum trio
+10000 elements
+collection.immutable.Vector
+ Int, par collection ##############################- 1.216 +- 2.2 %
+ Int, parallel stream ##############################~~# 5.987 +- 3.6 %
+
+parallel filter/map/sum trio
+10000 elements
+collection.mutable.WrappedArray
+ Int, par collection ########################### 1.074 +- 1.1 %
+ Int, parallel stream ##############################~~# 5.150 +- 0.7 %
+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+parallel filter/map/sum trio
+10 elements
+collection.mutable.ArrayBuffer
+ String, par collection #########################- 1.014 +- 0.8 %
+ String, parallel stream ##############################~~# 4.219 +- 3.2 %
+
+parallel filter/map/sum trio
+10 elements
+Array
+ String, par collection ######################### 1.000 +- 2.8 %
+ String, parallel stream ##############################~~# 4.299 +- 1.1 %
+
+parallel filter/map/sum trio
+10 elements
+collection.mutable.ArraySeq
+ String, par collection ######################### 1.002 +- 1.6 %
+ String, parallel stream ##############################~~# 4.326 +- 1.5 %
+
+parallel filter/map/sum trio
+10 elements
+collection.immutable.HashSet
+ String, par collection #####################= 0.861 +- 1.1 %
+ String, parallel stream ##############################~~# 3.656 +- 1.1 %
+
+parallel filter/map/sum trio
+10 elements
+java.util.ArrayList
+ String, parallel stream ##############################~~# 4.173 +- 3.2 %
+
+parallel filter/map/sum trio
+10 elements
+java.util.LinkedList
+ String, parallel stream ##############################~~# 4.073 +- 3.0 %
+
+parallel filter/map/sum trio
+10 elements
+collection.mutable.HashSet
+ String, par collection ######################## 0.964 +- 1.3 %
+ String, parallel stream ##############################~~# 4.613 +- 1.2 %
+
+parallel filter/map/sum trio
+10 elements
+collection.immutable.Vector
+ String, par collection #####################- 0.857 +- 1.2 %
+ String, parallel stream ##############################~~# 4.221 +- 1.6 %
+
+parallel filter/map/sum trio
+10 elements
+collection.mutable.WrappedArray
+ String, par collection ########################= 0.982 +- 2.7 %
+ String, parallel stream ##############################~~# 4.370 +- 1.6 %
+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+parallel filter/map/sum trio
+10000 elements
+collection.mutable.ArrayBuffer
+ String, par collection ######################### 0.994 +- 1.4 %
+ String, parallel stream ##############################~~# 5.317 +- 7.5 %
+
+parallel filter/map/sum trio
+10000 elements
+Array
+ String, par collection ######################### 1.000 +- 1.3 %
+ String, parallel stream ##############################~~# 6.147 +- 1.0 %
+
+parallel filter/map/sum trio
+10000 elements
+collection.mutable.ArraySeq
+ String, par collection ######################### 1.004 +- 1.5 %
+ String, parallel stream ##############################~~# 5.464 +- 5.9 %
+
+parallel filter/map/sum trio
+10000 elements
+collection.immutable.HashSet
+ String, par collection ########### 0.434 +- 2.2 %
+ String, parallel stream ##############################~~# 2.221 +- 6.4 %
+
+parallel filter/map/sum trio
+10000 elements
+java.util.ArrayList
+ String, parallel stream ##############################~~# 6.477 +- 0.4 %
+
+parallel filter/map/sum trio
+10000 elements
+java.util.LinkedList
+ String, parallel stream ##############################~~# 2.252 +- 10.3 %
+
+parallel filter/map/sum trio
+10000 elements
+collection.mutable.HashSet
+ String, par collection ###########= 0.470 +- 0.9 %
+ String, parallel stream ##############################~~# 2.477 +- 8.0 %
+
+parallel filter/map/sum trio
+10000 elements
+collection.immutable.Vector
+ String, par collection ###################= 0.786 +- 0.7 %
+ String, parallel stream ##############################~~# 5.795 +- 1.1 %
+
+parallel filter/map/sum trio
+10000 elements
+collection.mutable.WrappedArray
+ String, par collection ########################= 0.985 +- 1.7 %
+ String, parallel stream ##############################~~# 5.575 +- 5.4 %
+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+slow parallel trig on hashCode
+10 elements
+collection.mutable.ArrayBuffer
+ String, par collection ######################### 0.999 +- 1.3 %
+ String, parallel stream ##############################~~# 3.106 +- 0.7 %
+
+slow parallel trig on hashCode
+10 elements
+Array
+ String, par collection ######################### 1.000 +- 1.1 %
+ String, parallel stream ##############################~~# 3.144 +- 0.8 %
+
+slow parallel trig on hashCode
+10 elements
+collection.mutable.ArraySeq
+ String, par collection #########################- 1.016 +- 1.1 %
+ String, parallel stream ##############################~~# 3.117 +- 1.0 %
+
+slow parallel trig on hashCode
+10 elements
+collection.immutable.HashSet
+ String, par collection ################ 0.638 +- 1.3 %
+ String, parallel stream ##############################~~# 2.879 +- 0.6 %
+
+slow parallel trig on hashCode
+10 elements
+java.util.ArrayList
+ String, parallel stream ##############################~~# 3.144 +- 0.7 %
+
+slow parallel trig on hashCode
+10 elements
+java.util.LinkedList
+ String, parallel stream ##############################~~# 3.126 +- 1.0 %
+
+slow parallel trig on hashCode
+10 elements
+collection.mutable.HashSet
+ String, par collection #######################- 0.937 +- 1.0 %
+ String, parallel stream ##############################~~# 2.938 +- 0.5 %
+
+slow parallel trig on hashCode
+10 elements
+collection.immutable.Vector
+ String, par collection ##################= 0.741 +- 1.5 %
+ String, parallel stream ##############################~~# 3.139 +- 1.0 %
+
+slow parallel trig on hashCode
+10 elements
+collection.mutable.WrappedArray
+ String, par collection ######################### 1.000 +- 1.0 %
+ String, parallel stream ##############################~~# 3.104 +- 1.1 %
+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+slow parallel trig on hashCode
+10000 elements
+collection.mutable.ArrayBuffer
+ String, par collection ########################- 0.978 +- 2.1 %
+ String, parallel stream ##############################- 1.209 +- 0.9 %
+
+slow parallel trig on hashCode
+10000 elements
+Array
+ String, par collection ######################### 1.000 +- 0.9 %
+ String, parallel stream ##############################- 1.211 +- 0.9 %
+
+slow parallel trig on hashCode
+10000 elements
+collection.mutable.ArraySeq
+ String, par collection ########################- 0.975 +- 2.2 %
+ String, parallel stream ##############################- 1.215 +- 0.7 %
+
+slow parallel trig on hashCode
+10000 elements
+collection.immutable.HashSet
+ String, par collection ####################- 0.809 +- 1.9 %
+ String, parallel stream ############################- 1.129 +- 0.5 %
+
+slow parallel trig on hashCode
+10000 elements
+java.util.ArrayList
+ String, parallel stream ############################## 1.200 +- 2.0 %
+
+slow parallel trig on hashCode
+10000 elements
+java.util.LinkedList
+ String, parallel stream ############################ 1.121 +- 0.6 %
+
+slow parallel trig on hashCode
+10000 elements
+collection.mutable.HashSet
+ String, par collection ##################- 0.734 +- 1.8 %
+ String, parallel stream #############################- 1.176 +- 0.4 %
+
+slow parallel trig on hashCode
+10000 elements
+collection.immutable.Vector
+ String, par collection #################- 0.698 +- 1.3 %
+ String, parallel stream ##############################- 1.216 +- 0.6 %
+
+slow parallel trig on hashCode
+10000 elements
+collection.mutable.WrappedArray
+ String, par collection ########################- 0.969 +- 2.4 %
+ String, parallel stream ##############################- 1.213 +- 0.7 %
+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+fast parallel sum of lengths
+10 elements
+collection.mutable.ArrayBuffer
+ String, par collection ########################## 1.036 +- 6.6 %
+ String, parallel stream ##############################~~# 1.759 +- 1.2 %
+
+fast parallel sum of lengths
+10 elements
+Array
+ String, par collection ######################### 1.000 +- 6.4 %
+ String, parallel stream ##############################~~# 1.740 +- 1.8 %
+
+fast parallel sum of lengths
+10 elements
+collection.mutable.ArraySeq
+ String, par collection ###########################- 1.099 +- 12.3 %
+ String, parallel stream ##############################~~# 1.748 +- 2.1 %
+
+fast parallel sum of lengths
+10 elements
+collection.immutable.HashSet
+ String, par collection #########################- 1.019 +- 2.9 %
+ String, parallel stream ##############################~~# 1.470 +- 1.1 %
+
+fast parallel sum of lengths
+10 elements
+java.util.ArrayList
+ String, parallel stream ##############################~~# 1.729 +- 1.0 %
+
+fast parallel sum of lengths
+10 elements
+java.util.LinkedList
+ String, parallel stream ##############################~~# 1.690 +- 1.4 %
+
+fast parallel sum of lengths
+10 elements
+collection.mutable.HashSet
+ String, par collection ###########################- 1.092 +- 3.1 %
+ String, parallel stream ##############################~~# 1.902 +- 3.4 %
+
+fast parallel sum of lengths
+10 elements
+collection.immutable.Vector
+ String, par collection ######################= 0.908 +- 3.1 %
+ String, parallel stream ##############################~~# 1.761 +- 1.4 %
+
+fast parallel sum of lengths
+10 elements
+collection.mutable.WrappedArray
+ String, par collection #########################= 1.032 +- 10.0 %
+ String, parallel stream ##############################~~# 1.751 +- 1.7 %
+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+fast parallel sum of lengths
+10000 elements
+collection.mutable.ArrayBuffer
+ String, par collection ######################### 1.002 +- 1.0 %
+ String, parallel stream ############################ 1.122 +- 0.9 %
+
+fast parallel sum of lengths
+10000 elements
+Array
+ String, par collection ######################### 1.000 +- 0.9 %
+ String, parallel stream ################################ 1.284 +- 1.7 %
+
+fast parallel sum of lengths
+10000 elements
+collection.mutable.ArraySeq
+ String, par collection ########################= 0.992 +- 1.6 %
+ String, parallel stream ################################- 1.287 +- 6.4 %
+
+fast parallel sum of lengths
+10000 elements
+collection.immutable.HashSet
+ String, par collection ##########- 0.408 +- 0.9 %
+ String, parallel stream ################- 0.648 +- 0.6 %
+
+fast parallel sum of lengths
+10000 elements
+java.util.ArrayList
+ String, parallel stream ##############################~~# 1.432 +- 13.1 %
+
+fast parallel sum of lengths
+10000 elements
+java.util.LinkedList
+ String, parallel stream #############= 0.550 +- 12.9 %
+
+fast parallel sum of lengths
+10000 elements
+collection.mutable.HashSet
+ String, par collection ##########- 0.411 +- 0.8 %
+ String, parallel stream ##############= 0.583 +- 0.6 %
+
+fast parallel sum of lengths
+10000 elements
+collection.immutable.Vector
+ String, par collection ################### 0.759 +- 1.2 %
+ String, parallel stream ##############################= 1.221 +- 0.8 %
+
+fast parallel sum of lengths
+10000 elements
+collection.mutable.WrappedArray
+ String, par collection ######################### 0.999 +- 1.0 %
+ String, parallel stream ################################- 1.294 +- 7.0 %
+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+fast parallel summation
+10 elements
+collection.mutable.ArrayBuffer
+ Int, par collection ######################- 0.890 +- 6.7 %
+ Int, parallel stream ##############################~~# 1.483 +- 1.2 %
+
+fast parallel summation
+10 elements
+Array
+ Int, par collection ######################### 1.000 +- 6.0 %
+ Int, parallel stream ##############################~~# 1.467 +- 1.2 %
+
+fast parallel summation
+10 elements
+collection.mutable.ArraySeq
+ Int, par collection ######################= 0.904 +- 6.7 %
+ Int, parallel stream ##############################~~# 1.471 +- 1.4 %
+
+fast parallel summation
+10 elements
+collection.immutable.HashSet
+ Int, par collection ##################- 0.737 +- 5.1 %
+ Int, parallel stream ###############################- 1.257 +- 1.4 %
+
+fast parallel summation
+10 elements
+java.util.ArrayList
+ Int, parallel stream ##############################~~# 1.497 +- 1.0 %
+
+fast parallel summation
+10 elements
+java.util.LinkedList
+ Int, parallel stream ##############################~~# 1.463 +- 1.4 %
+
+fast parallel summation
+10 elements
+collection.mutable.HashSet
+ Int, par collection ##########################- 1.060 +- 1.0 %
+ Int, parallel stream ##############################~~# 1.800 +- 1.4 %
+
+fast parallel summation
+10 elements
+collection.immutable.Vector
+ Int, par collection ####################= 0.829 +- 0.7 %
+ Int, parallel stream ##############################~~# 1.459 +- 2.1 %
+
+fast parallel summation
+10 elements
+collection.mutable.WrappedArray
+ Int, par collection #########################- 1.008 +- 7.5 %
+ Int, parallel stream ##############################~~# 1.489 +- 0.8 %
+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+fast parallel summation
+10000 elements
+collection.mutable.ArrayBuffer
+ Int, par collection ##############################~~# 2.489 +- 0.8 %
+ Int, parallel stream ##############################~~# 3.404 +- 1.4 %
+
+fast parallel summation
+10000 elements
+Array
+ Int, par collection ######################### 1.000 +- 9.6 %
+ Int, parallel stream ##############################~~# 6.862 +- 4.9 %
+
+fast parallel summation
+10000 elements
+collection.mutable.ArraySeq
+ Int, par collection ##############################~~# 2.482 +- 0.8 %
+ Int, parallel stream ##############################~~# 3.686 +- 0.8 %
+
+fast parallel summation
+10000 elements
+collection.immutable.HashSet
+ Int, par collection ################################- 1.300 +- 1.0 %
+ Int, parallel stream ##############################~~# 1.898 +- 0.5 %
+
+fast parallel summation
+10000 elements
+java.util.ArrayList
+ Int, parallel stream ##############################~~# 5.781 +- 16.3 %
+
+fast parallel summation
+10000 elements
+java.util.LinkedList
+ Int, parallel stream ##############################~~# 2.435 +- 8.6 %
+
+fast parallel summation
+10000 elements
+collection.mutable.HashSet
+ Int, par collection ###############################- 1.259 +- 0.9 %
+ Int, parallel stream ##############################~~# 1.749 +- 0.4 %
+
+fast parallel summation
+10000 elements
+collection.immutable.Vector
+ Int, par collection ##############################~~# 1.993 +- 1.1 %
+ Int, parallel stream ##############################~~# 3.596 +- 0.9 %
+
+fast parallel summation
+10000 elements
+collection.mutable.WrappedArray
+ Int, par collection ###############################= 1.272 +- 4.8 %
+ Int, parallel stream ##############################~~# 2.706 +- 0.6 %
+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+slow parallel trigonometry
+10 elements
+collection.mutable.ArrayBuffer
+ Int, par collection ######################### 0.999 +- 1.6 %
+ Int, parallel stream ##############################~~# 3.251 +- 0.9 %
+
+slow parallel trigonometry
+10 elements
+Array
+ Int, par collection ######################### 1.000 +- 1.0 %
+ Int, parallel stream ##############################~~# 3.257 +- 0.6 %
+
+slow parallel trigonometry
+10 elements
+collection.mutable.ArraySeq
+ Int, par collection #########################- 1.009 +- 1.4 %
+ Int, parallel stream ##############################~~# 3.252 +- 0.9 %
+
+slow parallel trigonometry
+10 elements
+collection.immutable.HashSet
+ Int, par collection ###############- 0.610 +- 1.2 %
+ Int, parallel stream ##############################~~# 2.825 +- 0.9 %
+
+slow parallel trigonometry
+10 elements
+java.util.ArrayList
+ Int, parallel stream ##############################~~# 3.210 +- 1.3 %
+
+slow parallel trigonometry
+10 elements
+java.util.LinkedList
+ Int, parallel stream ##############################~~# 3.196 +- 0.4 %
+
+slow parallel trigonometry
+10 elements
+collection.mutable.HashSet
+ Int, par collection ########################- 0.969 +- 2.4 %
+ Int, parallel stream ##############################~~# 3.086 +- 0.4 %
+
+slow parallel trigonometry
+10 elements
+collection.immutable.Vector
+ Int, par collection ################## 0.721 +- 2.2 %
+ Int, parallel stream ##############################~~# 3.180 +- 0.9 %
+
+slow parallel trigonometry
+10 elements
+collection.mutable.WrappedArray
+ Int, par collection ######################### 1.000 +- 1.1 %
+ Int, parallel stream ##############################~~# 3.259 +- 1.1 %
+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+slow parallel trigonometry
+10000 elements
+collection.mutable.ArrayBuffer
+ Int, par collection ###########################- 1.096 +- 0.7 %
+ Int, parallel stream ##############################~~# 1.369 +- 0.5 %
+
+slow parallel trigonometry
+10000 elements
+Array
+ Int, par collection ######################### 1.000 +- 2.1 %
+ Int, parallel stream ##############################~~# 1.385 +- 0.7 %
+
+slow parallel trigonometry
+10000 elements
+collection.mutable.ArraySeq
+ Int, par collection ########################### 1.078 +- 2.1 %
+ Int, parallel stream ##############################~~# 1.347 +- 2.6 %
+
+slow parallel trigonometry
+10000 elements
+collection.immutable.HashSet
+ Int, par collection #####################- 0.854 +- 2.2 %
+ Int, parallel stream ################################- 1.290 +- 0.7 %
+
+slow parallel trigonometry
+10000 elements
+java.util.ArrayList
+ Int, parallel stream ##############################~~# 1.381 +- 0.9 %
+
+slow parallel trigonometry
+10000 elements
+java.util.LinkedList
+ Int, parallel stream ###############################= 1.273 +- 0.6 %
+
+slow parallel trigonometry
+10000 elements
+collection.mutable.HashSet
+ Int, par collection ##################- 0.731 +- 3.7 %
+ Int, parallel stream ##############################~~# 1.338 +- 0.5 %
+
+slow parallel trigonometry
+10000 elements
+collection.immutable.Vector
+ Int, par collection #################- 0.699 +- 1.7 %
+ Int, parallel stream ##############################~~# 1.358 +- 1.2 %
+
+slow parallel trigonometry
+10000 elements
+collection.mutable.WrappedArray
+ Int, par collection #########################- 1.018 +- 2.1 %
+ Int, parallel stream ##############################~~# 1.356 +- 0.7 %
+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+fast summation
+10 elements
+collection.mutable.ArrayBuffer
+ Int, base collection #### 0.162 +- 4.7 %
+ Int, iterator on coll ### 0.121 +- 1.4 %
+ Int, serial stream ## 0.086 +- 2.3 %
+ Int Stepper (can par) ###### 0.236 +- 1.3 %
+
+fast summation
+10 elements
+Array
+ Int, base collection ######################### 1.000 +- 0.2 %
+ Int, iterator on coll ##- 0.097 +- 2.3 %
+ Int, serial stream #####- 0.217 +- 1.0 %
+ Int Stepper (can par) #####################- 0.855 +- 0.3 %
+
+fast summation
+10 elements
+collection.mutable.ArraySeq
+ Int, base collection ####- 0.167 +- 0.3 %
+ Int, iterator on coll ###- 0.140 +- 2.3 %
+ Int, serial stream ## 0.084 +- 4.9 %
+ Int Stepper (can par) #############= 0.552 +- 0.4 %
+
+fast summation
+10 elements
+collection.mutable.ArrayStack
+ Int, base collection ####- 0.169 +- 4.1 %
+ Int, iterator on coll #### 0.157 +- 2.3 %
+ Int, serial stream ## 0.074 +- 4.7 %
+ Int Stepper (seq only) ######- 0.258 +- 1.3 %
+
+fast summation
+10 elements
+collection.immutable.ListSet
+ Int, base collection ##= 0.107 +- 0.9 %
+ Int, iterator on coll #### 0.163 +- 1.3 %
+ Int, serial stream ###= 0.140 +- 2.2 %
+ Int Stepper (seq only) ##= 0.111 +- 18.1 %
+
+fast summation
+10 elements
+collection.immutable.HashSet
+ Int, base collection ###= 0.148 +- 3.7 %
+ Int, iterator on coll ## 0.086 +- 0.8 %
+ Int, serial stream ### 0.120 +- 1.1 %
+ Int Stepper (can par) ### 0.119 +- 4.0 %
+
+fast summation
+10 elements
+java.util.ArrayList
+ Int, serial stream #####= 0.232 +- 0.6 %
+
+fast summation
+10 elements
+java.util.LinkedList
+ Int, serial stream #####- 0.214 +- 0.5 %
+
+fast summation
+10 elements
+collection.mutable.LinkedHashSet
+ Int, base collection #### 0.159 +- 5.0 %
+ Int, iterator on coll #### 0.157 +- 2.3 %
+ Int, serial stream ## 0.080 +- 2.9 %
+ Int Stepper (seq only) ####- 0.168 +- 0.5 %
+
+fast summation
+10 elements
+collection.immutable.List
+ Int, base collection ######= 0.263 +- 0.2 %
+ Int, iterator on coll #### 0.155 +- 1.4 %
+ Int, serial stream ### 0.121 +- 2.4 %
+ Int Stepper (seq only) ### 0.117 +- 2.1 %
+
+fast summation
+10 elements
+collection.mutable.HashSet
+ Int, base collection ##= 0.109 +- 2.1 %
+ Int, iterator on coll #= 0.070 +- 0.3 %
+ Int, serial stream ##- 0.093 +- 0.8 %
+ Int Stepper (can par) #######= 0.308 +- 0.5 %
+
+fast summation
+10 elements
+collection.mutable.Queue
+ Int, base collection # 0.041 +- 0.8 %
+ Int, iterator on coll ##- 0.088 +- 0.3 %
+ Int, serial stream # 0.034 +- 7.5 %
+ Int Stepper (seq only) #- 0.055 +- 0.8 %
+
+fast summation
+10 elements
+collection.mutable.PriorityQueue
+ Int, base collection ##= 0.104 +- 2.7 %
+ Int, iterator on coll ###- 0.133 +- 2.1 %
+ Int, serial stream #= 0.073 +- 2.1 %
+ Int Stepper (seq only) ###- 0.136 +- 0.4 %
+
+fast summation
+10 elements
+collection.immutable.Queue
+ Int, base collection ##= 0.108 +- 0.7 %
+ Int, iterator on coll ###= 0.146 +- 0.8 %
+ Int, serial stream ## 0.081 +- 18.1 %
+ Int Stepper (seq only) #- 0.058 +- 1.4 %
+
+fast summation
+10 elements
+collection.immutable.Stream
+ Int, base collection ######= 0.261 +- 0.2 %
+ Int, iterator on coll # 0.035 +- 5.4 %
+ Int, serial stream ### 0.116 +- 1.7 %
+ Int Stepper (seq only) ##= 0.113 +- 0.3 %
+
+fast summation
+10 elements
+collection.immutable.TreeSet
+ Int, base collection #### 0.166 +- 0.6 %
+ Int, iterator on coll ## 0.081 +- 0.6 %
+ Int, serial stream ##= 0.102 +- 1.5 %
+ Int Stepper (seq only) ##- 0.097 +- 0.3 %
+
+fast summation
+10 elements
+collection.immutable.Vector
+ Int, base collection ##= 0.104 +- 0.5 %
+ Int, iterator on coll ###- 0.130 +- 2.2 %
+ Int, serial stream ## 0.078 +- 2.1 %
+ Int Stepper (can par) ######### 0.359 +- 0.8 %
+
+fast summation
+10 elements
+collection.mutable.WrappedArray
+ Int, base collection ###= 0.141 +- 0.3 %
+ Int, iterator on coll ##- 0.096 +- 5.1 %
+ Int, serial stream ## 0.079 +- 0.4 %
+ Int Stepper (can par) ####= 0.186 +- 1.5 %
+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+fast summation
+10000 elements
+collection.mutable.ArrayBuffer
+ Int, base collection # 0.043 +- 2.8 %
+ Int, iterator on coll # 0.038 +- 8.6 %
+ Int, serial stream = 0.027 +- 14.9 %
+ Int Stepper (can par) ## 0.083 +- 0.5 %
+
+fast summation
+10000 elements
+Array
+ Int, base collection ######################### 1.000 +- 0.1 %
+ Int, iterator on coll = 0.027 +- 5.5 %
+ Int, serial stream ###- 0.128 +- 0.3 %
+ Int Stepper (can par) ######################### 1.000 +- 0.1 %
+
+fast summation
+10000 elements
+collection.mutable.ArraySeq
+ Int, base collection # 0.044 +- 4.0 %
+ Int, iterator on coll # 0.042 +- 2.9 %
+ Int, serial stream = 0.026 +- 15.1 %
+ Int Stepper (can par) #######= 0.309 +- 1.5 %
+
+fast summation
+10000 elements
+collection.mutable.ArrayStack
+ Int, base collection # 0.043 +- 15.3 %
+ Int, iterator on coll # 0.044 +- 1.8 %
+ Int, serial stream = 0.026 +- 11.4 %
+ Int Stepper (seq only) ##- 0.089 +- 0.6 %
+
+fast summation
+10000 elements
+collection.immutable.ListSet
+ Int, base collection #- 0.058 +- 1.8 %
+ Int, iterator on coll #- 0.059 +- 2.7 %
+ Int, serial stream = 0.022 +- 2.4 %
+ Int Stepper (seq only) #- 0.048 +- 35.9 %
+
+fast summation
+10000 elements
+collection.immutable.HashSet
+ Int, base collection = 0.028 +- 1.6 %
+ Int, iterator on coll = 0.023 +- 1.2 %
+ Int, serial stream - 0.014 +- 0.9 %
+ Int Stepper (can par) - 0.016 +- 1.2 %
+
+fast summation
+10000 elements
+java.util.ArrayList
+ Int, serial stream ######- 0.252 +- 11.9 %
+
+fast summation
+10000 elements
+java.util.LinkedList
+ Int, serial stream ##= 0.103 +- 7.4 %
+
+fast summation
+10000 elements
+collection.mutable.LinkedHashSet
+ Int, base collection # 0.044 +- 12.3 %
+ Int, iterator on coll #- 0.047 +- 2.8 %
+ Int, serial stream = 0.026 +- 14.3 %
+ Int Stepper (seq only) #- 0.049 +- 9.0 %
+
+fast summation
+10000 elements
+collection.immutable.List
+ Int, base collection #- 0.053 +- 9.6 %
+ Int, iterator on coll #- 0.055 +- 3.4 %
+ Int, serial stream # 0.040 +- 1.0 %
+ Int Stepper (seq only) #- 0.048 +- 34.9 %
+
+fast summation
+10000 elements
+collection.mutable.HashSet
+ Int, base collection = 0.021 +- 8.1 %
+ Int, iterator on coll = 0.023 +- 5.8 %
+ Int, serial stream - 0.011 +- 0.8 %
+ Int Stepper (can par) #= 0.067 +- 14.8 %
+
+fast summation
+10000 elements
+collection.mutable.Queue
+ Int, base collection - 0.009 +- 1.0 %
+ Int, iterator on coll = 0.028 +- 4.4 %
+ Int, serial stream - 0.012 +- 1.3 %
+ Int Stepper (seq only) - 0.016 +- 1.0 %
+
+fast summation
+10000 elements
+collection.mutable.PriorityQueue
+ Int, base collection # 0.034 +- 29.3 %
+ Int, iterator on coll # 0.043 +- 1.3 %
+ Int, serial stream = 0.024 +- 8.8 %
+ Int Stepper (seq only) # 0.036 +- 0.3 %
+
+fast summation
+10000 elements
+collection.immutable.Queue
+ Int, base collection #- 0.056 +- 3.3 %
+ Int, iterator on coll #- 0.055 +- 2.0 %
+ Int, serial stream = 0.026 +- 1.2 %
+ Int Stepper (seq only) - 0.017 +- 1.1 %
+
+fast summation
+10000 elements
+collection.immutable.Stream
+ Int, base collection # 0.042 +- 11.4 %
+ Int, iterator on coll - 0.010 +- 8.4 %
+ Int, serial stream = 0.022 +- 2.1 %
+ Int Stepper (seq only) = 0.031 +- 3.1 %
+
+fast summation
+10000 elements
+collection.immutable.TreeSet
+ Int, base collection #- 0.048 +- 1.4 %
+ Int, iterator on coll = 0.032 +- 3.8 %
+ Int, serial stream - 0.019 +- 2.7 %
+ Int Stepper (seq only) = 0.030 +- 2.5 %
+
+fast summation
+10000 elements
+collection.immutable.Vector
+ Int, base collection # 0.039 +- 12.1 %
+ Int, iterator on coll # 0.041 +- 3.3 %
+ Int, serial stream = 0.027 +- 14.5 %
+ Int Stepper (can par) ###- 0.131 +- 0.8 %
+
+fast summation
+10000 elements
+collection.mutable.WrappedArray
+ Int, base collection # 0.035 +- 2.0 %
+ Int, iterator on coll = 0.028 +- 2.5 %
+ Int, serial stream = 0.025 +- 17.6 %
+ Int Stepper (can par) #- 0.050 +- 7.6 %
+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+slow trigonometry
+10 elements
+collection.mutable.ArrayBuffer
+ Int, base collection ########################- 0.980 +- 0.2 %
+ Int, iterator on coll ########################= 0.980 +- 0.2 %
+ Int, serial stream ########################= 0.982 +- 0.2 %
+ Int Stepper (can par) ######################### 0.997 +- 0.1 %
+
+slow trigonometry
+10 elements
+Array
+ Int, base collection ######################### 1.000 +- 0.1 %
+ Int, iterator on coll ########################= 0.981 +- 0.2 %
+ Int, serial stream ########################= 0.989 +- 0.1 %
+ Int Stepper (can par) ######################### 1.000 +- 0.1 %
+
+slow trigonometry
+10 elements
+collection.mutable.ArraySeq
+ Int, base collection ################ 0.645 +- 0.1 %
+ Int, iterator on coll ########################= 0.980 +- 0.2 %
+ Int, serial stream ########################= 0.984 +- 0.1 %
+ Int Stepper (can par) ######################### 0.998 +- 0.2 %
+
+slow trigonometry
+10 elements
+collection.mutable.ArrayStack
+ Int, base collection ################ 0.642 +- 0.2 %
+ Int, iterator on coll ########################= 0.981 +- 0.5 %
+ Int, serial stream ########################= 0.983 +- 0.2 %
+ Int Stepper (seq only) ######################### 0.994 +- 0.2 %
+
+slow trigonometry
+10 elements
+collection.immutable.ListSet
+ Int, base collection ######################= 0.910 +- 0.3 %
+ Int, iterator on coll ########################- 0.978 +- 0.3 %
+ Int, serial stream ########################= 0.980 +- 0.2 %
+ Int Stepper (seq only) ########################= 0.991 +- 0.2 %
+
+slow trigonometry
+10 elements
+collection.immutable.HashSet
+ Int, base collection ###############= 0.628 +- 0.2 %
+ Int, iterator on coll ########################- 0.978 +- 0.4 %
+ Int, serial stream ########################- 0.977 +- 0.2 %
+ Int Stepper (can par) ########################= 0.989 +- 0.2 %
+
+slow trigonometry
+10 elements
+java.util.ArrayList
+ Int, serial stream ########################= 0.985 +- 0.2 %
+
+slow trigonometry
+10 elements
+java.util.LinkedList
+ Int, serial stream ########################= 0.988 +- 0.1 %
+
+slow trigonometry
+10 elements
+collection.mutable.LinkedHashSet
+ Int, base collection #######################= 0.950 +- 0.3 %
+ Int, iterator on coll ########################= 0.981 +- 0.2 %
+ Int, serial stream ########################= 0.984 +- 0.2 %
+ Int Stepper (seq only) ######################### 0.995 +- 0.3 %
+
+slow trigonometry
+10 elements
+collection.immutable.List
+ Int, base collection ########################- 0.974 +- 0.3 %
+ Int, iterator on coll ########################- 0.977 +- 0.2 %
+ Int, serial stream ########################- 0.978 +- 0.3 %
+ Int Stepper (seq only) ########################= 0.990 +- 0.1 %
+
+slow trigonometry
+10 elements
+collection.mutable.HashSet
+ Int, base collection #######################= 0.944 +- 0.2 %
+ Int, iterator on coll ########################= 0.981 +- 0.2 %
+ Int, serial stream ########################- 0.979 +- 0.6 %
+ Int Stepper (can par) ########################= 0.993 +- 0.1 %
+
+slow trigonometry
+10 elements
+collection.mutable.Queue
+ Int, base collection ######################= 0.909 +- 0.3 %
+ Int, iterator on coll ########################- 0.977 +- 0.1 %
+ Int, serial stream ######################## 0.962 +- 0.2 %
+ Int Stepper (seq only) ########################- 0.976 +- 0.2 %
+
+slow trigonometry
+10 elements
+collection.mutable.PriorityQueue
+ Int, base collection ########################- 0.970 +- 0.3 %
+ Int, iterator on coll ########################- 0.976 +- 0.2 %
+ Int, serial stream ########################- 0.978 +- 0.3 %
+ Int Stepper (seq only) ########################= 0.990 +- 0.1 %
+
+slow trigonometry
+10 elements
+collection.immutable.Queue
+ Int, base collection ######################## 0.956 +- 0.2 %
+ Int, iterator on coll ########################- 0.976 +- 0.3 %
+ Int, serial stream ########################- 0.978 +- 0.6 %
+ Int Stepper (seq only) ########################- 0.977 +- 0.2 %
+
+slow trigonometry
+10 elements
+collection.immutable.Stream
+ Int, base collection #######################= 0.941 +- 0.3 %
+ Int, iterator on coll ######################## 0.960 +- 0.3 %
+ Int, serial stream ########################- 0.978 +- 0.2 %
+ Int Stepper (seq only) ########################= 0.991 +- 0.1 %
+
+slow trigonometry
+10 elements
+collection.immutable.TreeSet
+ Int, base collection ###############= 0.624 +- 0.2 %
+ Int, iterator on coll ########################- 0.972 +- 0.2 %
+ Int, serial stream ########################- 0.978 +- 0.2 %
+ Int Stepper (seq only) ########################= 0.987 +- 0.1 %
+
+slow trigonometry
+10 elements
+collection.immutable.Vector
+ Int, base collection ########################- 0.975 +- 0.2 %
+ Int, iterator on coll ########################= 0.981 +- 0.1 %
+ Int, serial stream ########################= 0.984 +- 0.1 %
+ Int Stepper (can par) ######################### 0.997 +- 0.2 %
+
+slow trigonometry
+10 elements
+collection.mutable.WrappedArray
+ Int, base collection ########################- 0.974 +- 0.2 %
+ Int, iterator on coll ########################- 0.980 +- 0.2 %
+ Int, serial stream ########################= 0.985 +- 0.2 %
+ Int Stepper (can par) ######################### 0.996 +- 0.1 %
+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+slow trigonometry
+10000 elements
+collection.mutable.ArrayBuffer
+ Int, base collection ########################= 0.985 +- 0.2 %
+ Int, iterator on coll ########################= 0.986 +- 0.8 %
+ Int, serial stream ########################= 0.988 +- 0.2 %
+ Int Stepper (can par) ######################### 0.996 +- 0.1 %
+
+slow trigonometry
+10000 elements
+Array
+ Int, base collection ######################### 1.000 +- 0.2 %
+ Int, iterator on coll ########################= 0.987 +- 0.2 %
+ Int, serial stream ########################= 0.990 +- 0.1 %
+ Int Stepper (can par) ######################### 1.000 +- 0.1 %
+
+slow trigonometry
+10000 elements
+collection.mutable.ArraySeq
+ Int, base collection ################## 0.725 +- 13.6 %
+ Int, iterator on coll ########################= 0.988 +- 0.2 %
+ Int, serial stream ########################= 0.987 +- 0.3 %
+ Int Stepper (can par) ######################### 0.995 +- 0.2 %
+
+slow trigonometry
+10000 elements
+collection.mutable.ArrayStack
+ Int, base collection ################- 0.651 +- 0.2 %
+ Int, iterator on coll ########################= 0.986 +- 0.5 %
+ Int, serial stream ########################= 0.988 +- 0.2 %
+ Int Stepper (seq only) ######################### 0.995 +- 0.1 %
+
+slow trigonometry
+10000 elements
+collection.immutable.ListSet
+ Int, base collection ######################- 0.888 +- 0.4 %
+ Int, iterator on coll ########################= 0.988 +- 0.2 %
+ Int, serial stream ########################= 0.986 +- 0.2 %
+ Int Stepper (seq only) ########################= 0.992 +- 0.2 %
+
+slow trigonometry
+10000 elements
+collection.immutable.HashSet
+ Int, base collection ##############- 0.569 +- 0.4 %
+ Int, iterator on coll ########################- 0.977 +- 0.4 %
+ Int, serial stream ########################- 0.969 +- 0.7 %
+ Int Stepper (can par) ########################- 0.969 +- 0.1 %
+
+slow trigonometry
+10000 elements
+java.util.ArrayList
+ Int, serial stream ########################= 0.989 +- 0.1 %
+
+slow trigonometry
+10000 elements
+java.util.LinkedList
+ Int, serial stream ########################= 0.989 +- 0.2 %
+
+slow trigonometry
+10000 elements
+collection.mutable.LinkedHashSet
+ Int, base collection ####################### 0.922 +- 0.3 %
+ Int, iterator on coll ########################= 0.991 +- 0.2 %
+ Int, serial stream ########################= 0.986 +- 0.2 %
+ Int Stepper (seq only) ######################### 0.996 +- 0.1 %
+
+slow trigonometry
+10000 elements
+collection.immutable.List
+ Int, base collection ########################= 0.982 +- 0.2 %
+ Int, iterator on coll ########################= 0.990 +- 0.2 %
+ Int, serial stream ########################= 0.987 +- 0.2 %
+ Int Stepper (seq only) ######################### 0.995 +- 0.1 %
+
+slow trigonometry
+10000 elements
+collection.mutable.HashSet
+ Int, base collection ######################= 0.904 +- 0.3 %
+ Int, iterator on coll ########################- 0.979 +- 0.3 %
+ Int, serial stream ########################- 0.977 +- 0.3 %
+ Int Stepper (can par) ########################= 0.982 +- 0.2 %
+
+slow trigonometry
+10000 elements
+collection.mutable.Queue
+ Int, base collection #######################= 0.945 +- 0.2 %
+ Int, iterator on coll ########################= 0.990 +- 0.2 %
+ Int, serial stream ######################## 0.960 +- 0.7 %
+ Int Stepper (seq only) ######################## 0.959 +- 0.2 %
+
+slow trigonometry
+10000 elements
+collection.mutable.PriorityQueue
+ Int, base collection ################- 0.650 +- 0.2 %
+ Int, iterator on coll ########################= 0.984 +- 0.4 %
+ Int, serial stream ########################= 0.982 +- 0.3 %
+ Int Stepper (seq only) ########################= 0.983 +- 0.2 %
+
+slow trigonometry
+10000 elements
+collection.immutable.Queue
+ Int, base collection ######################## 0.966 +- 0.2 %
+ Int, iterator on coll ########################= 0.990 +- 0.3 %
+ Int, serial stream ########################- 0.975 +- 1.1 %
+ Int Stepper (seq only) ########################= 0.982 +- 0.3 %
+
+slow trigonometry
+10000 elements
+collection.immutable.Stream
+ Int, base collection #######################= 0.941 +- 0.3 %
+ Int, iterator on coll ######################## 0.962 +- 0.4 %
+ Int, serial stream ########################= 0.982 +- 0.3 %
+ Int Stepper (seq only) ########################= 0.988 +- 0.3 %
+
+slow trigonometry
+10000 elements
+collection.immutable.TreeSet
+ Int, base collection ##############- 0.571 +- 0.4 %
+ Int, iterator on coll ########################- 0.978 +- 0.3 %
+ Int, serial stream ########################- 0.973 +- 0.3 %
+ Int Stepper (seq only) ########################- 0.972 +- 0.6 %
+
+slow trigonometry
+10000 elements
+collection.immutable.Vector
+ Int, base collection ########################= 0.982 +- 0.2 %
+ Int, iterator on coll ########################= 0.990 +- 0.2 %
+ Int, serial stream ########################= 0.988 +- 0.1 %
+ Int Stepper (can par) ######################### 0.996 +- 0.1 %
+
+slow trigonometry
+10000 elements
+collection.mutable.WrappedArray
+ Int, base collection ########################= 0.982 +- 0.2 %
+ Int, iterator on coll ########################= 0.989 +- 0.1 %
+ Int, serial stream ########################= 0.988 +- 0.1 %
+ Int Stepper (can par) ########################= 0.992 +- 0.2 %
+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
diff --git a/benchmark/results/jmhbench.log b/benchmark/results/jmhbench.log
new file mode 100644
index 0000000..63568d1
--- /dev/null
+++ b/benchmark/results/jmhbench.log
@@ -0,0 +1,1054 @@
+[info]
+[info] # Run complete. Total time: 11:52:29
+[info]
+[info] Benchmark Mode Cnt Score Error Units
+[info] JmhBench.bench_cI_fmc_arb_0 thrpt 25 8035423.336 ± 755409.322 ops/s
+[info] JmhBench.bench_cI_fmc_arb_1 thrpt 25 20747.799 ± 136.417 ops/s
+[info] JmhBench.bench_cI_fmc_arr_0 thrpt 25 71925991.876 ± 147120.839 ops/s
+[info] JmhBench.bench_cI_fmc_arr_1 thrpt 25 92378.767 ± 100.507 ops/s
+[info] JmhBench.bench_cI_fmc_ars_0 thrpt 25 4887009.610 ± 607583.010 ops/s
+[info] JmhBench.bench_cI_fmc_ars_1 thrpt 25 16764.023 ± 542.731 ops/s
+[info] JmhBench.bench_cI_fmc_ast_0 thrpt 25 5855354.579 ± 297609.045 ops/s
+[info] JmhBench.bench_cI_fmc_ast_1 thrpt 25 17296.740 ± 230.641 ops/s
+[info] JmhBench.bench_cI_fmc_ils_0 thrpt 25 2652720.262 ± 414787.126 ops/s
+[info] JmhBench.bench_cI_fmc_ils_1 thrpt 25 487.348 ± 25.292 ops/s
+[info] JmhBench.bench_cI_fmc_ish_0 thrpt 25 4987836.424 ± 646222.972 ops/s
+[info] JmhBench.bench_cI_fmc_ish_1 thrpt 25 3382.659 ± 305.098 ops/s
+[info] JmhBench.bench_cI_fmc_lhs_0 thrpt 25 5835320.671 ± 1009998.646 ops/s
+[info] JmhBench.bench_cI_fmc_lhs_1 thrpt 25 7535.361 ± 327.683 ops/s
+[info] JmhBench.bench_cI_fmc_lst_0 thrpt 25 7099167.181 ± 429761.270 ops/s
+[info] JmhBench.bench_cI_fmc_lst_1 thrpt 25 12440.006 ± 224.875 ops/s
+[info] JmhBench.bench_cI_fmc_mhs_0 thrpt 25 4291393.195 ± 47473.930 ops/s
+[info] JmhBench.bench_cI_fmc_mhs_1 thrpt 25 4203.392 ± 112.937 ops/s
+[info] JmhBench.bench_cI_fmc_muq_0 thrpt 25 2496111.379 ± 333932.718 ops/s
+[info] JmhBench.bench_cI_fmc_muq_1 thrpt 25 5458.980 ± 58.848 ops/s
+[info] JmhBench.bench_cI_fmc_prq_0 thrpt 25 6648768.148 ± 240161.420 ops/s
+[info] JmhBench.bench_cI_fmc_prq_1 thrpt 25 9518.984 ± 882.821 ops/s
+[info] JmhBench.bench_cI_fmc_que_0 thrpt 25 4993970.353 ± 84787.715 ops/s
+[info] JmhBench.bench_cI_fmc_que_1 thrpt 25 7301.230 ± 48.307 ops/s
+[info] JmhBench.bench_cI_fmc_stm_0 thrpt 25 5372437.328 ± 295448.912 ops/s
+[info] JmhBench.bench_cI_fmc_stm_1 thrpt 25 8047.781 ± 190.906 ops/s
+[info] JmhBench.bench_cI_fmc_trs_0 thrpt 25 4988067.719 ± 194129.387 ops/s
+[info] JmhBench.bench_cI_fmc_trs_1 thrpt 25 2085.913 ± 52.524 ops/s
+[info] JmhBench.bench_cI_fmc_vec_0 thrpt 25 6669754.581 ± 192303.049 ops/s
+[info] JmhBench.bench_cI_fmc_vec_1 thrpt 25 14678.526 ± 774.640 ops/s
+[info] JmhBench.bench_cI_fmc_wra_0 thrpt 25 6826577.628 ± 145826.670 ops/s
+[info] JmhBench.bench_cI_fmc_wra_1 thrpt 25 11525.280 ± 217.619 ops/s
+[info] JmhBench.bench_cI_mdtc_arb_0 thrpt 25 4443593.338 ± 31059.496 ops/s
+[info] JmhBench.bench_cI_mdtc_arb_1 thrpt 25 11797.585 ± 410.228 ops/s
+[info] JmhBench.bench_cI_mdtc_arr_0 thrpt 25 103444873.867 ± 944076.540 ops/s
+[info] JmhBench.bench_cI_mdtc_arr_1 thrpt 25 75842976.523 ± 549782.886 ops/s
+[info] JmhBench.bench_cI_mdtc_ars_0 thrpt 25 3207470.098 ± 38695.027 ops/s
+[info] JmhBench.bench_cI_mdtc_ars_1 thrpt 25 8556.621 ± 195.807 ops/s
+[info] JmhBench.bench_cI_mdtc_ast_0 thrpt 25 2355394.121 ± 38473.884 ops/s
+[info] JmhBench.bench_cI_mdtc_ast_1 thrpt 25 8607.394 ± 728.653 ops/s
+[info] JmhBench.bench_cI_mdtc_lst_0 thrpt 25 6468557.411 ± 137487.766 ops/s
+[info] JmhBench.bench_cI_mdtc_lst_1 thrpt 25 13991.072 ± 136.574 ops/s
+[info] JmhBench.bench_cI_mdtc_muq_0 thrpt 25 1345227.001 ± 58882.319 ops/s
+[info] JmhBench.bench_cI_mdtc_muq_1 thrpt 25 2502.709 ± 79.914 ops/s
+[info] JmhBench.bench_cI_mdtc_que_0 thrpt 25 2301715.037 ± 18642.229 ops/s
+[info] JmhBench.bench_cI_mdtc_que_1 thrpt 25 4201.094 ± 57.552 ops/s
+[info] JmhBench.bench_cI_mdtc_stm_0 thrpt 25 1351471.957 ± 46355.839 ops/s
+[info] JmhBench.bench_cI_mdtc_stm_1 thrpt 25 664904.819 ± 42603.168 ops/s
+[info] JmhBench.bench_cI_mdtc_vec_0 thrpt 25 5978680.943 ± 65546.254 ops/s
+[info] JmhBench.bench_cI_mdtc_vec_1 thrpt 25 15557.817 ± 309.459 ops/s
+[info] JmhBench.bench_cI_mdtc_wra_0 thrpt 25 4673494.151 ± 27640.256 ops/s
+[info] JmhBench.bench_cI_mdtc_wra_1 thrpt 25 9370.962 ± 826.045 ops/s
+[info] JmhBench.bench_cI_sum_arb_0 thrpt 25 18335880.324 ± 860611.155 ops/s
+[info] JmhBench.bench_cI_sum_arb_1 thrpt 25 18799.347 ± 521.962 ops/s
+[info] JmhBench.bench_cI_sum_arr_0 thrpt 25 113429397.689 ± 246632.083 ops/s
+[info] JmhBench.bench_cI_sum_arr_1 thrpt 25 433573.009 ± 405.219 ops/s
+[info] JmhBench.bench_cI_sum_ars_0 thrpt 25 18914632.257 ± 65515.415 ops/s
+[info] JmhBench.bench_cI_sum_ars_1 thrpt 25 18879.126 ± 757.161 ops/s
+[info] JmhBench.bench_cI_sum_ast_0 thrpt 25 19140457.190 ± 777303.561 ops/s
+[info] JmhBench.bench_cI_sum_ast_1 thrpt 25 18800.310 ± 2869.443 ops/s
+[info] JmhBench.bench_cI_sum_ils_0 thrpt 25 12156588.727 ± 114845.877 ops/s
+[info] JmhBench.bench_cI_sum_ils_1 thrpt 25 25213.376 ± 444.053 ops/s
+[info] JmhBench.bench_cI_sum_ish_0 thrpt 25 16761123.678 ± 614314.543 ops/s
+[info] JmhBench.bench_cI_sum_ish_1 thrpt 25 12198.185 ± 194.961 ops/s
+[info] JmhBench.bench_cI_sum_lhs_0 thrpt 25 18039130.300 ± 906017.637 ops/s
+[info] JmhBench.bench_cI_sum_lhs_1 thrpt 25 18922.333 ± 2320.040 ops/s
+[info] JmhBench.bench_cI_sum_lst_0 thrpt 25 29817559.612 ± 58412.021 ops/s
+[info] JmhBench.bench_cI_sum_lst_1 thrpt 25 22834.330 ± 2183.263 ops/s
+[info] JmhBench.bench_cI_sum_mhs_0 thrpt 25 12329436.432 ± 253623.619 ops/s
+[info] JmhBench.bench_cI_sum_mhs_1 thrpt 25 8952.772 ± 723.365 ops/s
+[info] JmhBench.bench_cI_sum_muq_0 thrpt 25 4613996.286 ± 35553.633 ops/s
+[info] JmhBench.bench_cI_sum_muq_1 thrpt 25 3965.004 ± 40.291 ops/s
+[info] JmhBench.bench_cI_sum_prq_0 thrpt 25 11768606.036 ± 322246.512 ops/s
+[info] JmhBench.bench_cI_sum_prq_1 thrpt 25 14595.293 ± 4283.029 ops/s
+[info] JmhBench.bench_cI_sum_que_0 thrpt 25 12216359.219 ± 84893.062 ops/s
+[info] JmhBench.bench_cI_sum_que_1 thrpt 25 24107.095 ± 790.558 ops/s
+[info] JmhBench.bench_cI_sum_stm_0 thrpt 25 29645049.582 ± 59278.612 ops/s
+[info] JmhBench.bench_cI_sum_stm_1 thrpt 25 18080.340 ± 2059.034 ops/s
+[info] JmhBench.bench_cI_sum_trs_0 thrpt 25 18874037.032 ± 120977.755 ops/s
+[info] JmhBench.bench_cI_sum_trs_1 thrpt 25 20810.794 ± 288.713 ops/s
+[info] JmhBench.bench_cI_sum_vec_0 thrpt 25 11742774.808 ± 63268.375 ops/s
+[info] JmhBench.bench_cI_sum_vec_1 thrpt 25 16853.876 ± 2040.181 ops/s
+[info] JmhBench.bench_cI_sum_wra_0 thrpt 25 16037638.914 ± 48094.558 ops/s
+[info] JmhBench.bench_cI_sum_wra_1 thrpt 25 15035.828 ± 298.395 ops/s
+[info] JmhBench.bench_cI_trig_arb_0 thrpt 25 127384.023 ± 230.345 ops/s
+[info] JmhBench.bench_cI_trig_arb_1 thrpt 25 127.523 ± 0.207 ops/s
+[info] JmhBench.bench_cI_trig_arr_0 thrpt 25 129984.043 ± 152.548 ops/s
+[info] JmhBench.bench_cI_trig_arr_1 thrpt 25 129.418 ± 0.233 ops/s
+[info] JmhBench.bench_cI_trig_ars_0 thrpt 25 83843.573 ± 112.771 ops/s
+[info] JmhBench.bench_cI_trig_ars_1 thrpt 25 93.856 ± 12.751 ops/s
+[info] JmhBench.bench_cI_trig_ast_0 thrpt 25 83514.043 ± 144.645 ops/s
+[info] JmhBench.bench_cI_trig_ast_1 thrpt 25 84.199 ± 0.141 ops/s
+[info] JmhBench.bench_cI_trig_ils_0 thrpt 25 118241.682 ± 333.038 ops/s
+[info] JmhBench.bench_cI_trig_ils_1 thrpt 25 114.961 ± 0.485 ops/s
+[info] JmhBench.bench_cI_trig_ish_0 thrpt 25 81627.106 ± 148.992 ops/s
+[info] JmhBench.bench_cI_trig_ish_1 thrpt 25 73.677 ± 0.328 ops/s
+[info] JmhBench.bench_cI_trig_lhs_0 thrpt 25 123484.374 ± 418.215 ops/s
+[info] JmhBench.bench_cI_trig_lhs_1 thrpt 25 119.347 ± 0.338 ops/s
+[info] JmhBench.bench_cI_trig_lst_0 thrpt 25 126621.643 ± 359.486 ops/s
+[info] JmhBench.bench_cI_trig_lst_1 thrpt 25 127.104 ± 0.287 ops/s
+[info] JmhBench.bench_cI_trig_mhs_0 thrpt 25 122733.756 ± 238.867 ops/s
+[info] JmhBench.bench_cI_trig_mhs_1 thrpt 25 117.038 ± 0.317 ops/s
+[info] JmhBench.bench_cI_trig_muq_0 thrpt 25 118220.195 ± 404.616 ops/s
+[info] JmhBench.bench_cI_trig_muq_1 thrpt 25 122.307 ± 0.246 ops/s
+[info] JmhBench.bench_cI_trig_prq_0 thrpt 25 126111.667 ± 361.165 ops/s
+[info] JmhBench.bench_cI_trig_prq_1 thrpt 25 84.151 ± 0.161 ops/s
+[info] JmhBench.bench_cI_trig_que_0 thrpt 25 124229.823 ± 295.406 ops/s
+[info] JmhBench.bench_cI_trig_que_1 thrpt 25 124.972 ± 0.303 ops/s
+[info] JmhBench.bench_cI_trig_stm_0 thrpt 25 122279.057 ± 426.484 ops/s
+[info] JmhBench.bench_cI_trig_stm_1 thrpt 25 121.842 ± 0.404 ops/s
+[info] JmhBench.bench_cI_trig_trs_0 thrpt 25 81105.244 ± 128.368 ops/s
+[info] JmhBench.bench_cI_trig_trs_1 thrpt 25 73.845 ± 0.314 ops/s
+[info] JmhBench.bench_cI_trig_vec_0 thrpt 25 126718.115 ± 223.274 ops/s
+[info] JmhBench.bench_cI_trig_vec_1 thrpt 25 127.101 ± 0.219 ops/s
+[info] JmhBench.bench_cI_trig_wra_0 thrpt 25 126664.936 ± 216.923 ops/s
+[info] JmhBench.bench_cI_trig_wra_1 thrpt 25 127.123 ± 0.273 ops/s
+[info] JmhBench.bench_cS_fmc_arb_0 thrpt 25 8309821.046 ± 49072.647 ops/s
+[info] JmhBench.bench_cS_fmc_arb_1 thrpt 25 17422.556 ± 212.521 ops/s
+[info] JmhBench.bench_cS_fmc_arr_0 thrpt 25 54179418.146 ± 74335.302 ops/s
+[info] JmhBench.bench_cS_fmc_arr_1 thrpt 25 53181.927 ± 446.294 ops/s
+[info] JmhBench.bench_cS_fmc_ars_0 thrpt 25 5103543.646 ± 215901.936 ops/s
+[info] JmhBench.bench_cS_fmc_ars_1 thrpt 25 15554.519 ± 823.745 ops/s
+[info] JmhBench.bench_cS_fmc_ast_0 thrpt 25 6700667.336 ± 85523.401 ops/s
+[info] JmhBench.bench_cS_fmc_ast_1 thrpt 25 17258.969 ± 314.253 ops/s
+[info] JmhBench.bench_cS_fmc_ils_0 thrpt 25 2941128.962 ± 142969.982 ops/s
+[info] JmhBench.bench_cS_fmc_ils_1 thrpt 25 135.655 ± 11.876 ops/s
+[info] JmhBench.bench_cS_fmc_ish_0 thrpt 25 5044613.272 ± 157906.830 ops/s
+[info] JmhBench.bench_cS_fmc_ish_1 thrpt 25 2872.376 ± 36.541 ops/s
+[info] JmhBench.bench_cS_fmc_lhs_0 thrpt 25 7265749.135 ± 101616.705 ops/s
+[info] JmhBench.bench_cS_fmc_lhs_1 thrpt 25 4845.430 ± 26.025 ops/s
+[info] JmhBench.bench_cS_fmc_lst_0 thrpt 25 7501407.130 ± 224844.340 ops/s
+[info] JmhBench.bench_cS_fmc_lst_1 thrpt 25 9301.948 ± 312.874 ops/s
+[info] JmhBench.bench_cS_fmc_mhs_0 thrpt 25 5517297.556 ± 113251.344 ops/s
+[info] JmhBench.bench_cS_fmc_mhs_1 thrpt 25 2515.193 ± 13.965 ops/s
+[info] JmhBench.bench_cS_fmc_muq_0 thrpt 25 1899649.245 ± 35990.877 ops/s
+[info] JmhBench.bench_cS_fmc_muq_1 thrpt 25 2421.534 ± 17.772 ops/s
+[info] JmhBench.bench_cS_fmc_prq_0 thrpt 25 6326339.430 ± 63789.733 ops/s
+[info] JmhBench.bench_cS_fmc_prq_1 thrpt 25 6136.747 ± 671.604 ops/s
+[info] JmhBench.bench_cS_fmc_que_0 thrpt 25 5503013.635 ± 251275.430 ops/s
+[info] JmhBench.bench_cS_fmc_que_1 thrpt 25 7203.193 ± 147.509 ops/s
+[info] JmhBench.bench_cS_fmc_stm_0 thrpt 25 5472585.642 ± 388387.172 ops/s
+[info] JmhBench.bench_cS_fmc_stm_1 thrpt 25 6386.356 ± 157.946 ops/s
+[info] JmhBench.bench_cS_fmc_trs_0 thrpt 25 5265384.984 ± 84795.494 ops/s
+[info] JmhBench.bench_cS_fmc_trs_1 thrpt 25 1272.612 ± 11.984 ops/s
+[info] JmhBench.bench_cS_fmc_vec_0 thrpt 25 6851462.782 ± 52096.647 ops/s
+[info] JmhBench.bench_cS_fmc_vec_1 thrpt 25 10994.253 ± 317.945 ops/s
+[info] JmhBench.bench_cS_fmc_wra_0 thrpt 25 6661645.674 ± 74676.590 ops/s
+[info] JmhBench.bench_cS_fmc_wra_1 thrpt 25 17783.760 ± 433.679 ops/s
+[info] JmhBench.bench_cS_htrg_arb_0 thrpt 25 98786.541 ± 135.038 ops/s
+[info] JmhBench.bench_cS_htrg_arb_1 thrpt 25 98.001 ± 0.163 ops/s
+[info] JmhBench.bench_cS_htrg_arr_0 thrpt 25 100566.283 ± 111.351 ops/s
+[info] JmhBench.bench_cS_htrg_arr_1 thrpt 25 99.116 ± 0.146 ops/s
+[info] JmhBench.bench_cS_htrg_ars_0 thrpt 25 70824.755 ± 159.884 ops/s
+[info] JmhBench.bench_cS_htrg_ars_1 thrpt 25 83.161 ± 9.309 ops/s
+[info] JmhBench.bench_cS_htrg_ast_0 thrpt 25 70497.771 ± 137.953 ops/s
+[info] JmhBench.bench_cS_htrg_ast_1 thrpt 25 70.669 ± 0.111 ops/s
+[info] JmhBench.bench_cS_htrg_ils_0 thrpt 25 93979.601 ± 143.990 ops/s
+[info] JmhBench.bench_cS_htrg_ils_1 thrpt 25 90.501 ± 0.227 ops/s
+[info] JmhBench.bench_cS_htrg_ish_0 thrpt 25 69330.554 ± 108.192 ops/s
+[info] JmhBench.bench_cS_htrg_ish_1 thrpt 25 62.102 ± 0.265 ops/s
+[info] JmhBench.bench_cS_htrg_lhs_0 thrpt 25 96535.109 ± 339.936 ops/s
+[info] JmhBench.bench_cS_htrg_lhs_1 thrpt 25 93.221 ± 0.205 ops/s
+[info] JmhBench.bench_cS_htrg_lst_0 thrpt 25 99009.318 ± 190.428 ops/s
+[info] JmhBench.bench_cS_htrg_lst_1 thrpt 25 97.804 ± 0.203 ops/s
+[info] JmhBench.bench_cS_htrg_mhs_0 thrpt 25 96569.398 ± 329.995 ops/s
+[info] JmhBench.bench_cS_htrg_mhs_1 thrpt 25 90.747 ± 0.333 ops/s
+[info] JmhBench.bench_cS_htrg_muq_0 thrpt 25 93247.558 ± 334.412 ops/s
+[info] JmhBench.bench_cS_htrg_muq_1 thrpt 25 94.833 ± 0.283 ops/s
+[info] JmhBench.bench_cS_htrg_prq_0 thrpt 25 98817.647 ± 226.278 ops/s
+[info] JmhBench.bench_cS_htrg_prq_1 thrpt 25 70.441 ± 0.178 ops/s
+[info] JmhBench.bench_cS_htrg_que_0 thrpt 25 97188.745 ± 169.364 ops/s
+[info] JmhBench.bench_cS_htrg_que_1 thrpt 25 96.327 ± 0.291 ops/s
+[info] JmhBench.bench_cS_htrg_stm_0 thrpt 25 96162.631 ± 162.971 ops/s
+[info] JmhBench.bench_cS_htrg_stm_1 thrpt 25 94.593 ± 0.183 ops/s
+[info] JmhBench.bench_cS_htrg_trs_0 thrpt 25 68623.297 ± 153.165 ops/s
+[info] JmhBench.bench_cS_htrg_trs_1 thrpt 25 62.935 ± 0.265 ops/s
+[info] JmhBench.bench_cS_htrg_vec_0 thrpt 25 98793.504 ± 237.187 ops/s
+[info] JmhBench.bench_cS_htrg_vec_1 thrpt 25 97.576 ± 0.231 ops/s
+[info] JmhBench.bench_cS_htrg_wra_0 thrpt 25 98854.153 ± 239.193 ops/s
+[info] JmhBench.bench_cS_htrg_wra_1 thrpt 25 97.760 ± 0.233 ops/s
+[info] JmhBench.bench_cS_mdtc_arb_0 thrpt 25 1918033.395 ± 16232.747 ops/s
+[info] JmhBench.bench_cS_mdtc_arb_1 thrpt 25 1617.014 ± 148.727 ops/s
+[info] JmhBench.bench_cS_mdtc_arr_0 thrpt 25 3952629.619 ± 25689.408 ops/s
+[info] JmhBench.bench_cS_mdtc_arr_1 thrpt 25 3402684.776 ± 284371.307 ops/s
+[info] JmhBench.bench_cS_mdtc_ars_0 thrpt 25 1638242.587 ± 14473.305 ops/s
+[info] JmhBench.bench_cS_mdtc_ars_1 thrpt 25 1674.373 ± 103.550 ops/s
+[info] JmhBench.bench_cS_mdtc_ast_0 thrpt 25 1325591.166 ± 23723.433 ops/s
+[info] JmhBench.bench_cS_mdtc_ast_1 thrpt 25 1675.501 ± 116.342 ops/s
+[info] JmhBench.bench_cS_mdtc_lst_0 thrpt 25 2161734.107 ± 109210.632 ops/s
+[info] JmhBench.bench_cS_mdtc_lst_1 thrpt 25 1763.655 ± 175.337 ops/s
+[info] JmhBench.bench_cS_mdtc_muq_0 thrpt 25 929318.339 ± 31646.687 ops/s
+[info] JmhBench.bench_cS_mdtc_muq_1 thrpt 25 1139.156 ± 90.269 ops/s
+[info] JmhBench.bench_cS_mdtc_que_0 thrpt 25 1327489.572 ± 14055.324 ops/s
+[info] JmhBench.bench_cS_mdtc_que_1 thrpt 25 1394.055 ± 52.289 ops/s
+[info] JmhBench.bench_cS_mdtc_stm_0 thrpt 25 989690.937 ± 25041.440 ops/s
+[info] JmhBench.bench_cS_mdtc_stm_1 thrpt 25 928921.110 ± 18259.866 ops/s
+[info] JmhBench.bench_cS_mdtc_vec_0 thrpt 25 2021845.500 ± 133044.349 ops/s
+[info] JmhBench.bench_cS_mdtc_vec_1 thrpt 25 1752.712 ± 147.928 ops/s
+[info] JmhBench.bench_cS_mdtc_wra_0 thrpt 25 1864950.656 ± 83548.897 ops/s
+[info] JmhBench.bench_cS_mdtc_wra_1 thrpt 25 1933.967 ± 33.820 ops/s
+[info] JmhBench.bench_cS_nbr_arb_0 thrpt 25 15835328.428 ± 122519.272 ops/s
+[info] JmhBench.bench_cS_nbr_arb_1 thrpt 25 16840.766 ± 148.609 ops/s
+[info] JmhBench.bench_cS_nbr_arr_0 thrpt 25 47695446.412 ± 182044.808 ops/s
+[info] JmhBench.bench_cS_nbr_arr_1 thrpt 25 49504.973 ± 304.514 ops/s
+[info] JmhBench.bench_cS_nbr_ars_0 thrpt 25 34856004.018 ± 401233.203 ops/s
+[info] JmhBench.bench_cS_nbr_ars_1 thrpt 25 41092.593 ± 281.731 ops/s
+[info] JmhBench.bench_cS_nbr_ast_0 thrpt 25 34757354.930 ± 535394.356 ops/s
+[info] JmhBench.bench_cS_nbr_ast_1 thrpt 25 32360.450 ± 2172.594 ops/s
+[info] JmhBench.bench_cS_nbr_ils_0 thrpt 25 10446844.257 ± 42499.180 ops/s
+[info] JmhBench.bench_cS_nbr_ils_1 thrpt 25 18753.206 ± 5631.309 ops/s
+[info] JmhBench.bench_cS_nbr_ish_0 thrpt 25 12678676.031 ± 1433593.642 ops/s
+[info] JmhBench.bench_cS_nbr_ish_1 thrpt 25 6185.141 ± 193.784 ops/s
+[info] JmhBench.bench_cS_nbr_lhs_0 thrpt 25 31868157.935 ± 355816.238 ops/s
+[info] JmhBench.bench_cS_nbr_lhs_1 thrpt 25 34227.377 ± 800.219 ops/s
+[info] JmhBench.bench_cS_nbr_lst_0 thrpt 25 29253945.968 ± 374855.998 ops/s
+[info] JmhBench.bench_cS_nbr_lst_1 thrpt 25 35282.813 ± 492.016 ops/s
+[info] JmhBench.bench_cS_nbr_mhs_0 thrpt 25 21835577.282 ± 1003688.165 ops/s
+[info] JmhBench.bench_cS_nbr_mhs_1 thrpt 25 6272.351 ± 12.551 ops/s
+[info] JmhBench.bench_cS_nbr_muq_0 thrpt 25 4114620.171 ± 31542.905 ops/s
+[info] JmhBench.bench_cS_nbr_muq_1 thrpt 25 3541.869 ± 48.004 ops/s
+[info] JmhBench.bench_cS_nbr_prq_0 thrpt 25 14977117.576 ± 48707.583 ops/s
+[info] JmhBench.bench_cS_nbr_prq_1 thrpt 25 16714.493 ± 5012.246 ops/s
+[info] JmhBench.bench_cS_nbr_que_0 thrpt 25 11073586.828 ± 41004.373 ops/s
+[info] JmhBench.bench_cS_nbr_que_1 thrpt 25 18873.971 ± 6113.197 ops/s
+[info] JmhBench.bench_cS_nbr_stm_0 thrpt 25 30003437.166 ± 204518.569 ops/s
+[info] JmhBench.bench_cS_nbr_stm_1 thrpt 25 14211.397 ± 688.546 ops/s
+[info] JmhBench.bench_cS_nbr_trs_0 thrpt 25 16120209.876 ± 69947.418 ops/s
+[info] JmhBench.bench_cS_nbr_trs_1 thrpt 25 8927.765 ± 60.115 ops/s
+[info] JmhBench.bench_cS_nbr_vec_0 thrpt 25 13156985.945 ± 62188.986 ops/s
+[info] JmhBench.bench_cS_nbr_vec_1 thrpt 25 20392.272 ± 3067.769 ops/s
+[info] JmhBench.bench_cS_nbr_wra_0 thrpt 25 16390141.475 ± 56090.429 ops/s
+[info] JmhBench.bench_cS_nbr_wra_1 thrpt 25 17489.550 ± 47.421 ops/s
+[info] JmhBench.bench_cpI_pfmc_arb_0 thrpt 25 27474.789 ± 928.921 ops/s
+[info] JmhBench.bench_cpI_pfmc_arb_1 thrpt 25 7441.663 ± 93.625 ops/s
+[info] JmhBench.bench_cpI_pfmc_arr_0 thrpt 25 28387.894 ± 596.492 ops/s
+[info] JmhBench.bench_cpI_pfmc_arr_1 thrpt 25 5064.334 ± 50.797 ops/s
+[info] JmhBench.bench_cpI_pfmc_ars_0 thrpt 25 28798.766 ± 335.791 ops/s
+[info] JmhBench.bench_cpI_pfmc_ars_1 thrpt 25 7437.116 ± 108.032 ops/s
+[info] JmhBench.bench_cpI_pfmc_ish_0 thrpt 25 23565.704 ± 517.381 ops/s
+[info] JmhBench.bench_cpI_pfmc_ish_1 thrpt 25 3360.815 ± 27.573 ops/s
+[info] JmhBench.bench_cpI_pfmc_mhs_0 thrpt 25 30631.073 ± 337.113 ops/s
+[info] JmhBench.bench_cpI_pfmc_mhs_1 thrpt 25 3679.460 ± 44.876 ops/s
+[info] JmhBench.bench_cpI_pfmc_vec_0 thrpt 25 24037.121 ± 400.303 ops/s
+[info] JmhBench.bench_cpI_pfmc_vec_1 thrpt 25 6158.006 ± 137.476 ops/s
+[info] JmhBench.bench_cpI_pfmc_wra_0 thrpt 25 28461.197 ± 406.506 ops/s
+[info] JmhBench.bench_cpI_pfmc_wra_1 thrpt 25 5437.056 ± 62.127 ops/s
+[info] JmhBench.bench_cpI_psum_arb_0 thrpt 25 72361.424 ± 4874.360 ops/s
+[info] JmhBench.bench_cpI_psum_arb_1 thrpt 25 24580.891 ± 188.592 ops/s
+[info] JmhBench.bench_cpI_psum_arr_0 thrpt 25 81295.376 ± 4901.317 ops/s
+[info] JmhBench.bench_cpI_psum_arr_1 thrpt 25 9877.067 ± 949.170 ops/s
+[info] JmhBench.bench_cpI_psum_ars_0 thrpt 25 73484.665 ± 4937.921 ops/s
+[info] JmhBench.bench_cpI_psum_ars_1 thrpt 25 24514.076 ± 192.678 ops/s
+[info] JmhBench.bench_cpI_psum_ish_0 thrpt 25 59907.362 ± 3036.537 ops/s
+[info] JmhBench.bench_cpI_psum_ish_1 thrpt 25 12840.071 ± 125.814 ops/s
+[info] JmhBench.bench_cpI_psum_mhs_0 thrpt 25 86150.260 ± 888.758 ops/s
+[info] JmhBench.bench_cpI_psum_mhs_1 thrpt 25 12432.879 ± 107.465 ops/s
+[info] JmhBench.bench_cpI_psum_vec_0 thrpt 25 67410.471 ± 503.168 ops/s
+[info] JmhBench.bench_cpI_psum_vec_1 thrpt 25 19689.700 ± 224.288 ops/s
+[info] JmhBench.bench_cpI_psum_wra_0 thrpt 25 81936.702 ± 6116.035 ops/s
+[info] JmhBench.bench_cpI_psum_wra_1 thrpt 25 12562.928 ± 602.681 ops/s
+[info] JmhBench.bench_cpI_ptrig_arb_0 thrpt 25 27500.407 ± 451.591 ops/s
+[info] JmhBench.bench_cpI_ptrig_arb_1 thrpt 25 636.484 ± 4.737 ops/s
+[info] JmhBench.bench_cpI_ptrig_arr_0 thrpt 25 27522.840 ± 278.360 ops/s
+[info] JmhBench.bench_cpI_ptrig_arr_1 thrpt 25 580.587 ± 12.258 ops/s
+[info] JmhBench.bench_cpI_ptrig_ars_0 thrpt 25 27760.222 ± 383.837 ops/s
+[info] JmhBench.bench_cpI_ptrig_ars_1 thrpt 25 626.056 ± 13.349 ops/s
+[info] JmhBench.bench_cpI_ptrig_ish_0 thrpt 25 16795.172 ± 199.894 ops/s
+[info] JmhBench.bench_cpI_ptrig_ish_1 thrpt 25 495.891 ± 11.044 ops/s
+[info] JmhBench.bench_cpI_ptrig_mhs_0 thrpt 25 26673.936 ± 630.916 ops/s
+[info] JmhBench.bench_cpI_ptrig_mhs_1 thrpt 25 424.598 ± 15.818 ops/s
+[info] JmhBench.bench_cpI_ptrig_vec_0 thrpt 25 19853.009 ± 430.607 ops/s
+[info] JmhBench.bench_cpI_ptrig_vec_1 thrpt 25 406.065 ± 6.945 ops/s
+[info] JmhBench.bench_cpI_ptrig_wra_0 thrpt 25 27526.423 ± 304.224 ops/s
+[info] JmhBench.bench_cpI_ptrig_wra_1 thrpt 25 590.973 ± 12.122 ops/s
+[info] JmhBench.bench_cpS_pfmc_arb_0 thrpt 25 28842.541 ± 242.274 ops/s
+[info] JmhBench.bench_cpS_pfmc_arb_1 thrpt 25 7437.332 ± 102.398 ops/s
+[info] JmhBench.bench_cpS_pfmc_arr_0 thrpt 25 28444.328 ± 788.916 ops/s
+[info] JmhBench.bench_cpS_pfmc_arr_1 thrpt 25 7480.643 ± 100.594 ops/s
+[info] JmhBench.bench_cpS_pfmc_ars_0 thrpt 25 28489.525 ± 464.335 ops/s
+[info] JmhBench.bench_cpS_pfmc_ars_1 thrpt 25 7509.309 ± 111.292 ops/s
+[info] JmhBench.bench_cpS_pfmc_ish_0 thrpt 25 24479.975 ± 278.588 ops/s
+[info] JmhBench.bench_cpS_pfmc_ish_1 thrpt 25 3249.879 ± 72.414 ops/s
+[info] JmhBench.bench_cpS_pfmc_mhs_0 thrpt 25 27431.881 ± 346.329 ops/s
+[info] JmhBench.bench_cpS_pfmc_mhs_1 thrpt 25 3515.211 ± 32.526 ops/s
+[info] JmhBench.bench_cpS_pfmc_vec_0 thrpt 25 24390.048 ± 299.352 ops/s
+[info] JmhBench.bench_cpS_pfmc_vec_1 thrpt 25 5880.720 ± 40.165 ops/s
+[info] JmhBench.bench_cpS_pfmc_wra_0 thrpt 25 27932.560 ± 745.187 ops/s
+[info] JmhBench.bench_cpS_pfmc_wra_1 thrpt 25 7371.214 ± 122.236 ops/s
+[info] JmhBench.bench_cpS_phtrg_arb_0 thrpt 25 26302.214 ± 350.122 ops/s
+[info] JmhBench.bench_cpS_phtrg_arb_1 thrpt 25 461.723 ± 9.907 ops/s
+[info] JmhBench.bench_cpS_phtrg_arr_0 thrpt 25 26334.485 ± 294.864 ops/s
+[info] JmhBench.bench_cpS_phtrg_arr_1 thrpt 25 471.983 ± 4.097 ops/s
+[info] JmhBench.bench_cpS_phtrg_ars_0 thrpt 25 26745.117 ± 302.547 ops/s
+[info] JmhBench.bench_cpS_phtrg_ars_1 thrpt 25 460.382 ± 10.151 ops/s
+[info] JmhBench.bench_cpS_phtrg_ish_0 thrpt 25 16794.377 ± 217.144 ops/s
+[info] JmhBench.bench_cpS_phtrg_ish_1 thrpt 25 381.766 ± 7.441 ops/s
+[info] JmhBench.bench_cpS_phtrg_mhs_0 thrpt 25 24664.868 ± 234.874 ops/s
+[info] JmhBench.bench_cpS_phtrg_mhs_1 thrpt 25 346.646 ± 6.224 ops/s
+[info] JmhBench.bench_cpS_phtrg_vec_0 thrpt 25 19515.505 ± 291.700 ops/s
+[info] JmhBench.bench_cpS_phtrg_vec_1 thrpt 25 329.508 ± 4.446 ops/s
+[info] JmhBench.bench_cpS_phtrg_wra_0 thrpt 25 26324.009 ± 260.212 ops/s
+[info] JmhBench.bench_cpS_phtrg_wra_1 thrpt 25 457.488 ± 11.205 ops/s
+[info] JmhBench.bench_cpS_pnbr_arb_0 thrpt 25 73769.996 ± 4888.976 ops/s
+[info] JmhBench.bench_cpS_pnbr_arb_1 thrpt 25 26655.950 ± 267.853 ops/s
+[info] JmhBench.bench_cpS_pnbr_arr_0 thrpt 25 71213.033 ± 4539.260 ops/s
+[info] JmhBench.bench_cpS_pnbr_arr_1 thrpt 25 26608.171 ± 238.450 ops/s
+[info] JmhBench.bench_cpS_pnbr_ars_0 thrpt 25 78247.370 ± 9646.793 ops/s
+[info] JmhBench.bench_cpS_pnbr_ars_1 thrpt 25 26383.234 ± 418.183 ops/s
+[info] JmhBench.bench_cpS_pnbr_ish_0 thrpt 25 72540.054 ± 2073.362 ops/s
+[info] JmhBench.bench_cpS_pnbr_ish_1 thrpt 25 10859.745 ± 100.505 ops/s
+[info] JmhBench.bench_cpS_pnbr_mhs_0 thrpt 25 77753.110 ± 2422.987 ops/s
+[info] JmhBench.bench_cpS_pnbr_mhs_1 thrpt 25 10940.002 ± 87.312 ops/s
+[info] JmhBench.bench_cpS_pnbr_vec_0 thrpt 25 64658.143 ± 2006.249 ops/s
+[info] JmhBench.bench_cpS_pnbr_vec_1 thrpt 25 20204.269 ± 242.223 ops/s
+[info] JmhBench.bench_cpS_pnbr_wra_0 thrpt 25 73522.170 ± 7333.002 ops/s
+[info] JmhBench.bench_cpS_pnbr_wra_1 thrpt 25 26573.617 ± 275.909 ops/s
+[info] JmhBench.bench_iI_fmc_arb_0 thrpt 25 11534951.751 ± 1691165.189 ops/s
+[info] JmhBench.bench_iI_fmc_arb_1 thrpt 25 23810.169 ± 96.643 ops/s
+[info] JmhBench.bench_iI_fmc_arr_0 thrpt 25 10757732.243 ± 1081713.666 ops/s
+[info] JmhBench.bench_iI_fmc_arr_1 thrpt 25 15286.908 ± 436.672 ops/s
+[info] JmhBench.bench_iI_fmc_ars_0 thrpt 25 14166687.269 ± 1566994.869 ops/s
+[info] JmhBench.bench_iI_fmc_ars_1 thrpt 25 23799.914 ± 175.777 ops/s
+[info] JmhBench.bench_iI_fmc_ast_0 thrpt 25 12292010.377 ± 176433.123 ops/s
+[info] JmhBench.bench_iI_fmc_ast_1 thrpt 25 25241.034 ± 120.206 ops/s
+[info] JmhBench.bench_iI_fmc_ils_0 thrpt 25 13282888.820 ± 1987503.472 ops/s
+[info] JmhBench.bench_iI_fmc_ils_1 thrpt 25 19804.166 ± 254.272 ops/s
+[info] JmhBench.bench_iI_fmc_ish_0 thrpt 25 9527444.984 ± 1365718.073 ops/s
+[info] JmhBench.bench_iI_fmc_ish_1 thrpt 25 9854.394 ± 63.613 ops/s
+[info] JmhBench.bench_iI_fmc_lhs_0 thrpt 25 13602398.626 ± 83211.972 ops/s
+[info] JmhBench.bench_iI_fmc_lhs_1 thrpt 25 24091.137 ± 702.120 ops/s
+[info] JmhBench.bench_iI_fmc_lst_0 thrpt 25 11879620.676 ± 2484773.765 ops/s
+[info] JmhBench.bench_iI_fmc_lst_1 thrpt 25 19869.918 ± 309.872 ops/s
+[info] JmhBench.bench_iI_fmc_mhs_0 thrpt 25 7592696.142 ± 89270.023 ops/s
+[info] JmhBench.bench_iI_fmc_mhs_1 thrpt 25 10258.397 ± 167.902 ops/s
+[info] JmhBench.bench_iI_fmc_muq_0 thrpt 25 7592332.150 ± 62151.207 ops/s
+[info] JmhBench.bench_iI_fmc_muq_1 thrpt 25 18870.776 ± 230.705 ops/s
+[info] JmhBench.bench_iI_fmc_prq_0 thrpt 25 12541183.516 ± 1500910.168 ops/s
+[info] JmhBench.bench_iI_fmc_prq_1 thrpt 25 22868.330 ± 128.832 ops/s
+[info] JmhBench.bench_iI_fmc_que_0 thrpt 25 8906589.116 ± 1870066.573 ops/s
+[info] JmhBench.bench_iI_fmc_que_1 thrpt 25 19476.309 ± 495.972 ops/s
+[info] JmhBench.bench_iI_fmc_stm_0 thrpt 25 4046667.237 ± 192062.337 ops/s
+[info] JmhBench.bench_iI_fmc_stm_1 thrpt 25 4574.786 ± 302.886 ops/s
+[info] JmhBench.bench_iI_fmc_trs_0 thrpt 25 8992324.317 ± 318613.523 ops/s
+[info] JmhBench.bench_iI_fmc_trs_1 thrpt 25 13485.785 ± 211.286 ops/s
+[info] JmhBench.bench_iI_fmc_vec_0 thrpt 25 11822416.084 ± 142156.960 ops/s
+[info] JmhBench.bench_iI_fmc_vec_1 thrpt 25 19049.985 ± 180.215 ops/s
+[info] JmhBench.bench_iI_fmc_wra_0 thrpt 25 9234532.837 ± 56329.639 ops/s
+[info] JmhBench.bench_iI_fmc_wra_1 thrpt 25 14532.597 ± 495.601 ops/s
+[info] JmhBench.bench_iI_mdtc_arb_0 thrpt 25 24564626.307 ± 3669838.680 ops/s
+[info] JmhBench.bench_iI_mdtc_arb_1 thrpt 25 5108174.772 ± 678000.865 ops/s
+[info] JmhBench.bench_iI_mdtc_arr_0 thrpt 25 26535121.610 ± 6675643.142 ops/s
+[info] JmhBench.bench_iI_mdtc_arr_1 thrpt 25 6362301.204 ± 667303.594 ops/s
+[info] JmhBench.bench_iI_mdtc_ars_0 thrpt 25 22085306.151 ± 4620817.939 ops/s
+[info] JmhBench.bench_iI_mdtc_ars_1 thrpt 25 4685615.766 ± 17669.801 ops/s
+[info] JmhBench.bench_iI_mdtc_ast_0 thrpt 25 26824525.002 ± 4209095.277 ops/s
+[info] JmhBench.bench_iI_mdtc_ast_1 thrpt 25 6032697.890 ± 1056453.803 ops/s
+[info] JmhBench.bench_iI_mdtc_lst_0 thrpt 25 27610068.280 ± 622136.640 ops/s
+[info] JmhBench.bench_iI_mdtc_lst_1 thrpt 25 5461025.518 ± 41410.786 ops/s
+[info] JmhBench.bench_iI_mdtc_muq_0 thrpt 25 13497138.952 ± 511813.331 ops/s
+[info] JmhBench.bench_iI_mdtc_muq_1 thrpt 25 4042199.341 ± 1148290.848 ops/s
+[info] JmhBench.bench_iI_mdtc_que_0 thrpt 25 22956764.241 ± 3036473.817 ops/s
+[info] JmhBench.bench_iI_mdtc_que_1 thrpt 25 5744120.080 ± 575906.527 ops/s
+[info] JmhBench.bench_iI_mdtc_stm_0 thrpt 25 3983205.096 ± 203586.052 ops/s
+[info] JmhBench.bench_iI_mdtc_stm_1 thrpt 25 1952832.766 ± 80784.271 ops/s
+[info] JmhBench.bench_iI_mdtc_vec_0 thrpt 25 26238397.353 ± 559877.283 ops/s
+[info] JmhBench.bench_iI_mdtc_vec_1 thrpt 25 6202379.758 ± 981088.096 ops/s
+[info] JmhBench.bench_iI_mdtc_wra_0 thrpt 25 21628417.878 ± 3218213.725 ops/s
+[info] JmhBench.bench_iI_mdtc_wra_1 thrpt 25 3989870.457 ± 53216.895 ops/s
+[info] JmhBench.bench_iI_sum_arb_0 thrpt 25 13677150.793 ± 196430.726 ops/s
+[info] JmhBench.bench_iI_sum_arb_1 thrpt 25 16594.802 ± 1428.913 ops/s
+[info] JmhBench.bench_iI_sum_arr_0 thrpt 25 11018038.688 ± 253894.491 ops/s
+[info] JmhBench.bench_iI_sum_arr_1 thrpt 25 11801.147 ± 650.632 ops/s
+[info] JmhBench.bench_iI_sum_ars_0 thrpt 25 15848085.664 ± 367685.730 ops/s
+[info] JmhBench.bench_iI_sum_ars_1 thrpt 25 18191.993 ± 519.274 ops/s
+[info] JmhBench.bench_iI_sum_ast_0 thrpt 25 17845530.592 ± 404346.784 ops/s
+[info] JmhBench.bench_iI_sum_ast_1 thrpt 25 19225.305 ± 353.326 ops/s
+[info] JmhBench.bench_iI_sum_ils_0 thrpt 25 18507893.432 ± 244915.056 ops/s
+[info] JmhBench.bench_iI_sum_ils_1 thrpt 25 25558.552 ± 679.197 ops/s
+[info] JmhBench.bench_iI_sum_ish_0 thrpt 25 9720641.170 ± 76384.111 ops/s
+[info] JmhBench.bench_iI_sum_ish_1 thrpt 25 9909.417 ± 115.705 ops/s
+[info] JmhBench.bench_iI_sum_lhs_0 thrpt 25 17819380.379 ± 415435.915 ops/s
+[info] JmhBench.bench_iI_sum_lhs_1 thrpt 25 20293.239 ± 574.528 ops/s
+[info] JmhBench.bench_iI_sum_lst_0 thrpt 25 17618830.518 ± 247702.793 ops/s
+[info] JmhBench.bench_iI_sum_lst_1 thrpt 25 23871.318 ± 821.518 ops/s
+[info] JmhBench.bench_iI_sum_mhs_0 thrpt 25 7920199.338 ± 25073.016 ops/s
+[info] JmhBench.bench_iI_sum_mhs_1 thrpt 25 9793.600 ± 565.252 ops/s
+[info] JmhBench.bench_iI_sum_muq_0 thrpt 25 9990945.720 ± 31626.968 ops/s
+[info] JmhBench.bench_iI_sum_muq_1 thrpt 25 12188.211 ± 537.108 ops/s
+[info] JmhBench.bench_iI_sum_prq_0 thrpt 25 15093045.013 ± 316551.848 ops/s
+[info] JmhBench.bench_iI_sum_prq_1 thrpt 25 18429.280 ± 240.042 ops/s
+[info] JmhBench.bench_iI_sum_que_0 thrpt 25 16518172.761 ± 133367.414 ops/s
+[info] JmhBench.bench_iI_sum_que_1 thrpt 25 23915.095 ± 480.386 ops/s
+[info] JmhBench.bench_iI_sum_stm_0 thrpt 25 3960336.238 ± 213043.035 ops/s
+[info] JmhBench.bench_iI_sum_stm_1 thrpt 25 4173.550 ± 349.392 ops/s
+[info] JmhBench.bench_iI_sum_trs_0 thrpt 25 9199624.201 ± 56259.658 ops/s
+[info] JmhBench.bench_iI_sum_trs_1 thrpt 25 13869.328 ± 530.911 ops/s
+[info] JmhBench.bench_iI_sum_vec_0 thrpt 25 14795372.228 ± 324576.889 ops/s
+[info] JmhBench.bench_iI_sum_vec_1 thrpt 25 17685.259 ± 588.780 ops/s
+[info] JmhBench.bench_iI_sum_wra_0 thrpt 25 10885962.925 ± 557809.799 ops/s
+[info] JmhBench.bench_iI_sum_wra_1 thrpt 25 12222.309 ± 300.230 ops/s
+[info] JmhBench.bench_iI_trig_arb_0 thrpt 25 127425.280 ± 191.414 ops/s
+[info] JmhBench.bench_iI_trig_arb_1 thrpt 25 127.634 ± 0.991 ops/s
+[info] JmhBench.bench_iI_trig_arr_0 thrpt 25 127512.032 ± 274.842 ops/s
+[info] JmhBench.bench_iI_trig_arr_1 thrpt 25 127.698 ± 0.193 ops/s
+[info] JmhBench.bench_iI_trig_ars_0 thrpt 25 127436.172 ± 238.600 ops/s
+[info] JmhBench.bench_iI_trig_ars_1 thrpt 25 127.869 ± 0.295 ops/s
+[info] JmhBench.bench_iI_trig_ast_0 thrpt 25 127494.683 ± 602.866 ops/s
+[info] JmhBench.bench_iI_trig_ast_1 thrpt 25 127.612 ± 0.632 ops/s
+[info] JmhBench.bench_iI_trig_ils_0 thrpt 25 127113.022 ± 332.672 ops/s
+[info] JmhBench.bench_iI_trig_ils_1 thrpt 25 127.901 ± 0.286 ops/s
+[info] JmhBench.bench_iI_trig_ish_0 thrpt 25 127092.736 ± 457.161 ops/s
+[info] JmhBench.bench_iI_trig_ish_1 thrpt 25 126.436 ± 0.534 ops/s
+[info] JmhBench.bench_iI_trig_lhs_0 thrpt 25 127514.664 ± 231.652 ops/s
+[info] JmhBench.bench_iI_trig_lhs_1 thrpt 25 128.273 ± 0.254 ops/s
+[info] JmhBench.bench_iI_trig_lst_0 thrpt 25 127022.490 ± 248.515 ops/s
+[info] JmhBench.bench_iI_trig_lst_1 thrpt 25 128.115 ± 0.293 ops/s
+[info] JmhBench.bench_iI_trig_mhs_0 thrpt 25 127550.698 ± 198.539 ops/s
+[info] JmhBench.bench_iI_trig_mhs_1 thrpt 25 126.677 ± 0.344 ops/s
+[info] JmhBench.bench_iI_trig_muq_0 thrpt 25 126992.882 ± 183.521 ops/s
+[info] JmhBench.bench_iI_trig_muq_1 thrpt 25 128.114 ± 0.314 ops/s
+[info] JmhBench.bench_iI_trig_prq_0 thrpt 25 126839.329 ± 193.157 ops/s
+[info] JmhBench.bench_iI_trig_prq_1 thrpt 25 127.293 ± 0.463 ops/s
+[info] JmhBench.bench_iI_trig_que_0 thrpt 25 126802.756 ± 375.210 ops/s
+[info] JmhBench.bench_iI_trig_que_1 thrpt 25 128.106 ± 0.397 ops/s
+[info] JmhBench.bench_iI_trig_stm_0 thrpt 25 124764.329 ± 430.653 ops/s
+[info] JmhBench.bench_iI_trig_stm_1 thrpt 25 124.498 ± 0.485 ops/s
+[info] JmhBench.bench_iI_trig_trs_0 thrpt 25 126340.545 ± 237.574 ops/s
+[info] JmhBench.bench_iI_trig_trs_1 thrpt 25 126.564 ± 0.356 ops/s
+[info] JmhBench.bench_iI_trig_vec_0 thrpt 25 127474.814 ± 164.684 ops/s
+[info] JmhBench.bench_iI_trig_vec_1 thrpt 25 128.064 ± 0.313 ops/s
+[info] JmhBench.bench_iI_trig_wra_0 thrpt 25 127331.453 ± 261.737 ops/s
+[info] JmhBench.bench_iI_trig_wra_1 thrpt 25 128.023 ± 0.172 ops/s
+[info] JmhBench.bench_iS_fmc_arb_0 thrpt 25 20660242.351 ± 209369.661 ops/s
+[info] JmhBench.bench_iS_fmc_arb_1 thrpt 25 27552.048 ± 172.476 ops/s
+[info] JmhBench.bench_iS_fmc_arr_0 thrpt 25 21065476.479 ± 205039.828 ops/s
+[info] JmhBench.bench_iS_fmc_arr_1 thrpt 25 29128.579 ± 250.629 ops/s
+[info] JmhBench.bench_iS_fmc_ars_0 thrpt 25 20695026.482 ± 88802.378 ops/s
+[info] JmhBench.bench_iS_fmc_ars_1 thrpt 25 27806.607 ± 178.834 ops/s
+[info] JmhBench.bench_iS_fmc_ast_0 thrpt 25 25600313.157 ± 317157.005 ops/s
+[info] JmhBench.bench_iS_fmc_ast_1 thrpt 25 31883.764 ± 250.718 ops/s
+[info] JmhBench.bench_iS_fmc_ils_0 thrpt 25 14362194.610 ± 173685.590 ops/s
+[info] JmhBench.bench_iS_fmc_ils_1 thrpt 25 27422.246 ± 475.305 ops/s
+[info] JmhBench.bench_iS_fmc_ish_0 thrpt 25 11106914.870 ± 304024.165 ops/s
+[info] JmhBench.bench_iS_fmc_ish_1 thrpt 25 6266.457 ± 50.467 ops/s
+[info] JmhBench.bench_iS_fmc_lhs_0 thrpt 25 22715287.169 ± 149617.853 ops/s
+[info] JmhBench.bench_iS_fmc_lhs_1 thrpt 25 28972.273 ± 328.804 ops/s
+[info] JmhBench.bench_iS_fmc_lst_0 thrpt 25 21752765.860 ± 238227.475 ops/s
+[info] JmhBench.bench_iS_fmc_lst_1 thrpt 25 27163.131 ± 560.292 ops/s
+[info] JmhBench.bench_iS_fmc_mhs_0 thrpt 25 13668175.591 ± 75209.492 ops/s
+[info] JmhBench.bench_iS_fmc_mhs_1 thrpt 25 5765.118 ± 29.925 ops/s
+[info] JmhBench.bench_iS_fmc_muq_0 thrpt 25 9638550.537 ± 157743.693 ops/s
+[info] JmhBench.bench_iS_fmc_muq_1 thrpt 25 24535.554 ± 319.728 ops/s
+[info] JmhBench.bench_iS_fmc_prq_0 thrpt 25 21586397.825 ± 513866.266 ops/s
+[info] JmhBench.bench_iS_fmc_prq_1 thrpt 25 20012.133 ± 438.172 ops/s
+[info] JmhBench.bench_iS_fmc_que_0 thrpt 25 19349313.994 ± 291925.270 ops/s
+[info] JmhBench.bench_iS_fmc_que_1 thrpt 25 27455.560 ± 249.001 ops/s
+[info] JmhBench.bench_iS_fmc_stm_0 thrpt 25 3967962.807 ± 230987.833 ops/s
+[info] JmhBench.bench_iS_fmc_stm_1 thrpt 25 4584.761 ± 288.495 ops/s
+[info] JmhBench.bench_iS_fmc_trs_0 thrpt 25 10500586.619 ± 543350.914 ops/s
+[info] JmhBench.bench_iS_fmc_trs_1 thrpt 25 7758.939 ± 260.818 ops/s
+[info] JmhBench.bench_iS_fmc_vec_0 thrpt 25 16202222.266 ± 1185179.036 ops/s
+[info] JmhBench.bench_iS_fmc_vec_1 thrpt 25 20328.860 ± 357.803 ops/s
+[info] JmhBench.bench_iS_fmc_wra_0 thrpt 25 22170885.258 ± 82756.344 ops/s
+[info] JmhBench.bench_iS_fmc_wra_1 thrpt 25 28812.002 ± 257.772 ops/s
+[info] JmhBench.bench_iS_htrg_arb_0 thrpt 25 99861.730 ± 209.117 ops/s
+[info] JmhBench.bench_iS_htrg_arb_1 thrpt 25 98.417 ± 0.171 ops/s
+[info] JmhBench.bench_iS_htrg_arr_0 thrpt 25 99625.567 ± 163.801 ops/s
+[info] JmhBench.bench_iS_htrg_arr_1 thrpt 25 98.296 ± 0.210 ops/s
+[info] JmhBench.bench_iS_htrg_ars_0 thrpt 25 99879.643 ± 156.190 ops/s
+[info] JmhBench.bench_iS_htrg_ars_1 thrpt 25 98.363 ± 0.183 ops/s
+[info] JmhBench.bench_iS_htrg_ast_0 thrpt 25 99380.973 ± 336.195 ops/s
+[info] JmhBench.bench_iS_htrg_ast_1 thrpt 25 98.387 ± 0.198 ops/s
+[info] JmhBench.bench_iS_htrg_ils_0 thrpt 25 99964.680 ± 174.309 ops/s
+[info] JmhBench.bench_iS_htrg_ils_1 thrpt 25 98.294 ± 0.227 ops/s
+[info] JmhBench.bench_iS_htrg_ish_0 thrpt 25 99433.408 ± 247.431 ops/s
+[info] JmhBench.bench_iS_htrg_ish_1 thrpt 25 97.311 ± 0.150 ops/s
+[info] JmhBench.bench_iS_htrg_lhs_0 thrpt 25 99265.630 ± 291.685 ops/s
+[info] JmhBench.bench_iS_htrg_lhs_1 thrpt 25 98.447 ± 0.194 ops/s
+[info] JmhBench.bench_iS_htrg_lst_0 thrpt 25 99902.619 ± 186.008 ops/s
+[info] JmhBench.bench_iS_htrg_lst_1 thrpt 25 98.498 ± 0.209 ops/s
+[info] JmhBench.bench_iS_htrg_mhs_0 thrpt 25 99003.158 ± 187.515 ops/s
+[info] JmhBench.bench_iS_htrg_mhs_1 thrpt 25 96.822 ± 0.413 ops/s
+[info] JmhBench.bench_iS_htrg_muq_0 thrpt 25 100012.595 ± 276.322 ops/s
+[info] JmhBench.bench_iS_htrg_muq_1 thrpt 25 98.282 ± 0.258 ops/s
+[info] JmhBench.bench_iS_htrg_prq_0 thrpt 25 99909.274 ± 269.579 ops/s
+[info] JmhBench.bench_iS_htrg_prq_1 thrpt 25 97.929 ± 0.434 ops/s
+[info] JmhBench.bench_iS_htrg_que_0 thrpt 25 99927.315 ± 151.573 ops/s
+[info] JmhBench.bench_iS_htrg_que_1 thrpt 25 98.434 ± 0.299 ops/s
+[info] JmhBench.bench_iS_htrg_stm_0 thrpt 25 98035.244 ± 198.742 ops/s
+[info] JmhBench.bench_iS_htrg_stm_1 thrpt 25 96.635 ± 0.265 ops/s
+[info] JmhBench.bench_iS_htrg_trs_0 thrpt 25 99717.022 ± 174.509 ops/s
+[info] JmhBench.bench_iS_htrg_trs_1 thrpt 25 97.415 ± 0.245 ops/s
+[info] JmhBench.bench_iS_htrg_vec_0 thrpt 25 99966.597 ± 221.390 ops/s
+[info] JmhBench.bench_iS_htrg_vec_1 thrpt 25 98.199 ± 0.172 ops/s
+[info] JmhBench.bench_iS_htrg_wra_0 thrpt 25 99874.236 ± 179.219 ops/s
+[info] JmhBench.bench_iS_htrg_wra_1 thrpt 25 98.288 ± 0.196 ops/s
+[info] JmhBench.bench_iS_mdtc_arb_0 thrpt 25 2097899.982 ± 23027.980 ops/s
+[info] JmhBench.bench_iS_mdtc_arb_1 thrpt 25 1887060.512 ± 26123.879 ops/s
+[info] JmhBench.bench_iS_mdtc_arr_0 thrpt 25 2082275.844 ± 34790.548 ops/s
+[info] JmhBench.bench_iS_mdtc_arr_1 thrpt 25 1845126.936 ± 20293.322 ops/s
+[info] JmhBench.bench_iS_mdtc_ars_0 thrpt 25 2009995.771 ± 76910.203 ops/s
+[info] JmhBench.bench_iS_mdtc_ars_1 thrpt 25 1870000.666 ± 40742.596 ops/s
+[info] JmhBench.bench_iS_mdtc_ast_0 thrpt 25 2178819.994 ± 221518.015 ops/s
+[info] JmhBench.bench_iS_mdtc_ast_1 thrpt 25 2123261.170 ± 154628.266 ops/s
+[info] JmhBench.bench_iS_mdtc_lst_0 thrpt 25 2328914.058 ± 32074.037 ops/s
+[info] JmhBench.bench_iS_mdtc_lst_1 thrpt 25 2041954.017 ± 42234.460 ops/s
+[info] JmhBench.bench_iS_mdtc_muq_0 thrpt 25 2100724.686 ± 25639.833 ops/s
+[info] JmhBench.bench_iS_mdtc_muq_1 thrpt 25 1911625.218 ± 23276.435 ops/s
+[info] JmhBench.bench_iS_mdtc_que_0 thrpt 25 2329239.766 ± 30110.120 ops/s
+[info] JmhBench.bench_iS_mdtc_que_1 thrpt 25 2006283.293 ± 45267.124 ops/s
+[info] JmhBench.bench_iS_mdtc_stm_0 thrpt 25 1639832.628 ± 33564.535 ops/s
+[info] JmhBench.bench_iS_mdtc_stm_1 thrpt 25 1559980.428 ± 58314.308 ops/s
+[info] JmhBench.bench_iS_mdtc_vec_0 thrpt 25 2075815.450 ± 25831.246 ops/s
+[info] JmhBench.bench_iS_mdtc_vec_1 thrpt 25 1774053.986 ± 24836.414 ops/s
+[info] JmhBench.bench_iS_mdtc_wra_0 thrpt 25 2082465.430 ± 54266.074 ops/s
+[info] JmhBench.bench_iS_mdtc_wra_1 thrpt 25 1852111.865 ± 40534.660 ops/s
+[info] JmhBench.bench_iS_nbr_arb_0 thrpt 25 15093643.409 ± 312819.522 ops/s
+[info] JmhBench.bench_iS_nbr_arb_1 thrpt 25 16536.134 ± 44.776 ops/s
+[info] JmhBench.bench_iS_nbr_arr_0 thrpt 25 13681116.218 ± 2069446.439 ops/s
+[info] JmhBench.bench_iS_nbr_arr_1 thrpt 25 16216.197 ± 153.748 ops/s
+[info] JmhBench.bench_iS_nbr_ars_0 thrpt 25 15231820.552 ± 71198.860 ops/s
+[info] JmhBench.bench_iS_nbr_ars_1 thrpt 25 16431.260 ± 58.286 ops/s
+[info] JmhBench.bench_iS_nbr_ast_0 thrpt 25 16422832.425 ± 160552.096 ops/s
+[info] JmhBench.bench_iS_nbr_ast_1 thrpt 25 17926.164 ± 56.371 ops/s
+[info] JmhBench.bench_iS_nbr_ils_0 thrpt 25 13584445.254 ± 117216.650 ops/s
+[info] JmhBench.bench_iS_nbr_ils_1 thrpt 25 16068.090 ± 2653.041 ops/s
+[info] JmhBench.bench_iS_nbr_ish_0 thrpt 25 13215826.280 ± 1505586.375 ops/s
+[info] JmhBench.bench_iS_nbr_ish_1 thrpt 25 6105.864 ± 59.147 ops/s
+[info] JmhBench.bench_iS_nbr_lhs_0 thrpt 25 17670261.677 ± 161144.754 ops/s
+[info] JmhBench.bench_iS_nbr_lhs_1 thrpt 25 20389.690 ± 2324.186 ops/s
+[info] JmhBench.bench_iS_nbr_lst_0 thrpt 25 16357641.101 ± 60754.533 ops/s
+[info] JmhBench.bench_iS_nbr_lst_1 thrpt 25 18433.714 ± 2057.837 ops/s
+[info] JmhBench.bench_iS_nbr_mhs_0 thrpt 25 11812511.313 ± 88367.679 ops/s
+[info] JmhBench.bench_iS_nbr_mhs_1 thrpt 25 5600.543 ± 17.450 ops/s
+[info] JmhBench.bench_iS_nbr_muq_0 thrpt 25 11691763.921 ± 46245.840 ops/s
+[info] JmhBench.bench_iS_nbr_muq_1 thrpt 25 18182.019 ± 4847.548 ops/s
+[info] JmhBench.bench_iS_nbr_prq_0 thrpt 25 15349594.898 ± 76157.252 ops/s
+[info] JmhBench.bench_iS_nbr_prq_1 thrpt 25 15811.057 ± 4892.669 ops/s
+[info] JmhBench.bench_iS_nbr_que_0 thrpt 25 15718603.188 ± 111532.970 ops/s
+[info] JmhBench.bench_iS_nbr_que_1 thrpt 25 19776.658 ± 2178.055 ops/s
+[info] JmhBench.bench_iS_nbr_stm_0 thrpt 25 4132893.909 ± 194559.967 ops/s
+[info] JmhBench.bench_iS_nbr_stm_1 thrpt 25 4726.500 ± 338.295 ops/s
+[info] JmhBench.bench_iS_nbr_trs_0 thrpt 25 10698968.841 ± 70991.716 ops/s
+[info] JmhBench.bench_iS_nbr_trs_1 thrpt 25 9598.236 ± 785.458 ops/s
+[info] JmhBench.bench_iS_nbr_vec_0 thrpt 25 14664874.142 ± 77772.684 ops/s
+[info] JmhBench.bench_iS_nbr_vec_1 thrpt 25 17564.678 ± 3868.762 ops/s
+[info] JmhBench.bench_iS_nbr_wra_0 thrpt 25 15708895.657 ± 50767.513 ops/s
+[info] JmhBench.bench_iS_nbr_wra_1 thrpt 25 16808.537 ± 132.263 ops/s
+[info] JmhBench.bench_spI_pfmc_arb_0 thrpt 25 122026.458 ± 3338.778 ops/s
+[info] JmhBench.bench_spI_pfmc_arb_1 thrpt 25 31955.438 ± 3265.388 ops/s
+[info] JmhBench.bench_spI_pfmc_arr_0 thrpt 25 123793.942 ± 1465.776 ops/s
+[info] JmhBench.bench_spI_pfmc_arr_1 thrpt 25 55926.755 ± 582.057 ops/s
+[info] JmhBench.bench_spI_pfmc_ars_0 thrpt 25 123838.933 ± 2528.316 ops/s
+[info] JmhBench.bench_spI_pfmc_ars_1 thrpt 25 31911.979 ± 1354.094 ops/s
+[info] JmhBench.bench_spI_pfmc_ish_0 thrpt 25 101313.969 ± 1541.856 ops/s
+[info] JmhBench.bench_spI_pfmc_ish_1 thrpt 25 17564.133 ± 179.150 ops/s
+[info] JmhBench.bench_spI_pfmc_jix_0 thrpt 25 124602.760 ± 1339.185 ops/s
+[info] JmhBench.bench_spI_pfmc_jix_1 thrpt 25 46913.983 ± 1399.403 ops/s
+[info] JmhBench.bench_spI_pfmc_jln_0 thrpt 25 122034.673 ± 2914.257 ops/s
+[info] JmhBench.bench_spI_pfmc_jln_1 thrpt 25 21508.984 ± 2283.637 ops/s
+[info] JmhBench.bench_spI_pfmc_mhs_0 thrpt 25 149803.545 ± 3416.269 ops/s
+[info] JmhBench.bench_spI_pfmc_mhs_1 thrpt 25 18125.518 ± 1343.974 ops/s
+[info] JmhBench.bench_spI_pfmc_vec_0 thrpt 25 121742.883 ± 1495.545 ops/s
+[info] JmhBench.bench_spI_pfmc_vec_1 thrpt 25 30318.891 ± 1097.725 ops/s
+[info] JmhBench.bench_spI_pfmc_wra_0 thrpt 25 124890.583 ± 706.846 ops/s
+[info] JmhBench.bench_spI_pfmc_wra_1 thrpt 25 26081.649 ± 187.747 ops/s
+[info] JmhBench.bench_spI_psum_arb_0 thrpt 25 120576.423 ± 1468.003 ops/s
+[info] JmhBench.bench_spI_psum_arb_1 thrpt 25 33624.042 ± 476.147 ops/s
+[info] JmhBench.bench_spI_psum_arr_0 thrpt 25 119288.186 ± 1423.925 ops/s
+[info] JmhBench.bench_spI_psum_arr_1 thrpt 25 67775.549 ± 3304.787 ops/s
+[info] JmhBench.bench_spI_psum_ars_0 thrpt 25 119588.690 ± 1729.515 ops/s
+[info] JmhBench.bench_spI_psum_ars_1 thrpt 25 36403.156 ± 302.723 ops/s
+[info] JmhBench.bench_spI_psum_ish_0 thrpt 25 102179.787 ± 1467.909 ops/s
+[info] JmhBench.bench_spI_psum_ish_1 thrpt 25 18745.407 ± 97.495 ops/s
+[info] JmhBench.bench_spI_psum_jix_0 thrpt 25 121718.375 ± 1209.540 ops/s
+[info] JmhBench.bench_spI_psum_jix_1 thrpt 25 57101.512 ± 9299.544 ops/s
+[info] JmhBench.bench_spI_psum_jln_0 thrpt 25 118907.263 ± 1689.327 ops/s
+[info] JmhBench.bench_spI_psum_jln_1 thrpt 25 24048.469 ± 2075.903 ops/s
+[info] JmhBench.bench_spI_psum_mhs_0 thrpt 25 146367.207 ± 2070.261 ops/s
+[info] JmhBench.bench_spI_psum_mhs_1 thrpt 25 17278.757 ± 65.427 ops/s
+[info] JmhBench.bench_spI_psum_vec_0 thrpt 25 118634.736 ± 2482.411 ops/s
+[info] JmhBench.bench_spI_psum_vec_1 thrpt 25 35514.411 ± 316.920 ops/s
+[info] JmhBench.bench_spI_psum_wra_0 thrpt 25 121026.432 ± 976.185 ops/s
+[info] JmhBench.bench_spI_psum_wra_1 thrpt 25 26725.301 ± 163.464 ops/s
+[info] JmhBench.bench_spI_ptrig_arb_0 thrpt 25 89470.600 ± 767.024 ops/s
+[info] JmhBench.bench_spI_ptrig_arb_1 thrpt 25 794.995 ± 3.720 ops/s
+[info] JmhBench.bench_spI_ptrig_arr_0 thrpt 25 89645.535 ± 571.222 ops/s
+[info] JmhBench.bench_spI_ptrig_arr_1 thrpt 25 804.330 ± 5.509 ops/s
+[info] JmhBench.bench_spI_ptrig_ars_0 thrpt 25 89499.574 ± 825.471 ops/s
+[info] JmhBench.bench_spI_ptrig_ars_1 thrpt 25 782.195 ± 20.628 ops/s
+[info] JmhBench.bench_spI_ptrig_ish_0 thrpt 25 77761.399 ± 661.445 ops/s
+[info] JmhBench.bench_spI_ptrig_ish_1 thrpt 25 749.151 ± 5.523 ops/s
+[info] JmhBench.bench_spI_ptrig_jix_0 thrpt 25 88337.024 ± 1120.008 ops/s
+[info] JmhBench.bench_spI_ptrig_jix_1 thrpt 25 801.746 ± 7.369 ops/s
+[info] JmhBench.bench_spI_ptrig_jln_0 thrpt 25 87959.641 ± 364.156 ops/s
+[info] JmhBench.bench_spI_ptrig_jln_1 thrpt 25 739.279 ± 4.313 ops/s
+[info] JmhBench.bench_spI_ptrig_mhs_0 thrpt 25 84923.215 ± 359.009 ops/s
+[info] JmhBench.bench_spI_ptrig_mhs_1 thrpt 25 776.755 ± 4.260 ops/s
+[info] JmhBench.bench_spI_ptrig_vec_0 thrpt 25 87511.031 ± 774.512 ops/s
+[info] JmhBench.bench_spI_ptrig_vec_1 thrpt 25 788.650 ± 9.614 ops/s
+[info] JmhBench.bench_spI_ptrig_wra_0 thrpt 25 89686.421 ± 971.655 ops/s
+[info] JmhBench.bench_spI_ptrig_wra_1 thrpt 25 787.302 ± 5.752 ops/s
+[info] JmhBench.bench_spS_pfmc_arb_0 thrpt 25 120005.523 ± 3795.221 ops/s
+[info] JmhBench.bench_spS_pfmc_arb_1 thrpt 25 39776.834 ± 2984.305 ops/s
+[info] JmhBench.bench_spS_pfmc_arr_0 thrpt 25 122280.558 ± 1336.325 ops/s
+[info] JmhBench.bench_spS_pfmc_arr_1 thrpt 25 45979.842 ± 477.262 ops/s
+[info] JmhBench.bench_spS_pfmc_ars_0 thrpt 25 123052.552 ± 1867.415 ops/s
+[info] JmhBench.bench_spS_pfmc_ars_1 thrpt 25 40875.035 ± 2405.416 ops/s
+[info] JmhBench.bench_spS_pfmc_ish_0 thrpt 25 103990.927 ± 1116.911 ops/s
+[info] JmhBench.bench_spS_pfmc_ish_1 thrpt 25 16612.000 ± 1061.350 ops/s
+[info] JmhBench.bench_spS_pfmc_jix_0 thrpt 25 118688.056 ± 3835.042 ops/s
+[info] JmhBench.bench_spS_pfmc_jix_1 thrpt 25 48450.737 ± 209.135 ops/s
+[info] JmhBench.bench_spS_pfmc_jln_0 thrpt 25 115844.257 ± 3520.553 ops/s
+[info] JmhBench.bench_spS_pfmc_jln_1 thrpt 25 16845.440 ± 1730.417 ops/s
+[info] JmhBench.bench_spS_pfmc_mhs_0 thrpt 25 131205.292 ± 1626.360 ops/s
+[info] JmhBench.bench_spS_pfmc_mhs_1 thrpt 25 18525.922 ± 1488.423 ops/s
+[info] JmhBench.bench_spS_pfmc_vec_0 thrpt 25 120071.251 ± 1925.718 ops/s
+[info] JmhBench.bench_spS_pfmc_vec_1 thrpt 25 43352.191 ± 472.814 ops/s
+[info] JmhBench.bench_spS_pfmc_wra_0 thrpt 25 124290.660 ± 2022.406 ops/s
+[info] JmhBench.bench_spS_pfmc_wra_1 thrpt 25 41701.119 ± 2265.434 ops/s
+[info] JmhBench.bench_spS_phtrg_arb_0 thrpt 25 81797.538 ± 548.798 ops/s
+[info] JmhBench.bench_spS_phtrg_arb_1 thrpt 25 570.817 ± 5.242 ops/s
+[info] JmhBench.bench_spS_phtrg_arr_0 thrpt 25 82795.075 ± 685.318 ops/s
+[info] JmhBench.bench_spS_phtrg_arr_1 thrpt 25 571.434 ± 4.941 ops/s
+[info] JmhBench.bench_spS_phtrg_ars_0 thrpt 25 82077.986 ± 824.614 ops/s
+[info] JmhBench.bench_spS_phtrg_ars_1 thrpt 25 573.351 ± 3.988 ops/s
+[info] JmhBench.bench_spS_phtrg_ish_0 thrpt 25 75813.040 ± 434.354 ops/s
+[info] JmhBench.bench_spS_phtrg_ish_1 thrpt 25 532.699 ± 2.842 ops/s
+[info] JmhBench.bench_spS_phtrg_jix_0 thrpt 25 82789.954 ± 556.422 ops/s
+[info] JmhBench.bench_spS_phtrg_jix_1 thrpt 25 566.457 ± 11.434 ops/s
+[info] JmhBench.bench_spS_phtrg_jln_0 thrpt 25 82330.442 ± 848.242 ops/s
+[info] JmhBench.bench_spS_phtrg_jln_1 thrpt 25 529.041 ± 2.995 ops/s
+[info] JmhBench.bench_spS_phtrg_mhs_0 thrpt 25 77381.806 ± 381.747 ops/s
+[info] JmhBench.bench_spS_phtrg_mhs_1 thrpt 25 555.069 ± 2.452 ops/s
+[info] JmhBench.bench_spS_phtrg_vec_0 thrpt 25 82664.902 ± 862.091 ops/s
+[info] JmhBench.bench_spS_phtrg_vec_1 thrpt 25 573.708 ± 3.414 ops/s
+[info] JmhBench.bench_spS_phtrg_wra_0 thrpt 25 81739.577 ± 929.248 ops/s
+[info] JmhBench.bench_spS_phtrg_wra_1 thrpt 25 572.521 ± 4.090 ops/s
+[info] JmhBench.bench_spS_pnbr_arb_0 thrpt 25 125276.095 ± 1514.002 ops/s
+[info] JmhBench.bench_spS_pnbr_arb_1 thrpt 25 29841.668 ± 254.424 ops/s
+[info] JmhBench.bench_spS_pnbr_arr_0 thrpt 25 123884.469 ± 2242.992 ops/s
+[info] JmhBench.bench_spS_pnbr_arr_1 thrpt 25 34171.150 ± 571.312 ops/s
+[info] JmhBench.bench_spS_pnbr_ars_0 thrpt 25 124496.684 ± 2599.330 ops/s
+[info] JmhBench.bench_spS_pnbr_ars_1 thrpt 25 34250.875 ± 2183.277 ops/s
+[info] JmhBench.bench_spS_pnbr_ish_0 thrpt 25 104652.916 ± 1160.961 ops/s
+[info] JmhBench.bench_spS_pnbr_ish_1 thrpt 25 17229.432 ± 109.380 ops/s
+[info] JmhBench.bench_spS_pnbr_jix_0 thrpt 25 123150.422 ± 1242.209 ops/s
+[info] JmhBench.bench_spS_pnbr_jix_1 thrpt 25 38114.715 ± 4984.153 ops/s
+[info] JmhBench.bench_spS_pnbr_jln_0 thrpt 25 120365.993 ± 1728.280 ops/s
+[info] JmhBench.bench_spS_pnbr_jln_1 thrpt 25 14622.187 ± 1880.274 ops/s
+[info] JmhBench.bench_spS_pnbr_mhs_0 thrpt 25 135428.927 ± 4568.452 ops/s
+[info] JmhBench.bench_spS_pnbr_mhs_1 thrpt 25 15520.900 ± 88.414 ops/s
+[info] JmhBench.bench_spS_pnbr_vec_0 thrpt 25 125389.867 ± 1739.809 ops/s
+[info] JmhBench.bench_spS_pnbr_vec_1 thrpt 25 32482.390 ± 250.674 ops/s
+[info] JmhBench.bench_spS_pnbr_wra_0 thrpt 25 124679.925 ± 2175.996 ops/s
+[info] JmhBench.bench_spS_pnbr_wra_1 thrpt 25 34420.077 ± 2410.935 ops/s
+[info] JmhBench.bench_ssI_fmc_arb_0 thrpt 25 9250153.823 ± 888445.531 ops/s
+[info] JmhBench.bench_ssI_fmc_arb_1 thrpt 25 9355.086 ± 742.574 ops/s
+[info] JmhBench.bench_ssI_fmc_arr_0 thrpt 25 16052416.844 ± 961240.618 ops/s
+[info] JmhBench.bench_ssI_fmc_arr_1 thrpt 25 76936.655 ± 1407.831 ops/s
+[info] JmhBench.bench_ssI_fmc_ars_0 thrpt 25 8782587.762 ± 742059.840 ops/s
+[info] JmhBench.bench_ssI_fmc_ars_1 thrpt 25 9050.227 ± 780.554 ops/s
+[info] JmhBench.bench_ssI_fmc_ast_0 thrpt 25 8141416.177 ± 637829.950 ops/s
+[info] JmhBench.bench_ssI_fmc_ast_1 thrpt 25 10100.534 ± 503.490 ops/s
+[info] JmhBench.bench_ssI_fmc_ils_0 thrpt 25 6515951.736 ± 398883.162 ops/s
+[info] JmhBench.bench_ssI_fmc_ils_1 thrpt 25 9154.419 ± 328.846 ops/s
+[info] JmhBench.bench_ssI_fmc_ish_0 thrpt 25 7957383.510 ± 807469.463 ops/s
+[info] JmhBench.bench_ssI_fmc_ish_1 thrpt 25 8534.034 ± 76.508 ops/s
+[info] JmhBench.bench_ssI_fmc_jix_0 thrpt 25 10325320.390 ± 737830.832 ops/s
+[info] JmhBench.bench_ssI_fmc_jix_1 thrpt 25 23670.508 ± 1300.536 ops/s
+[info] JmhBench.bench_ssI_fmc_jln_0 thrpt 25 10147871.532 ± 321143.743 ops/s
+[info] JmhBench.bench_ssI_fmc_jln_1 thrpt 25 25868.179 ± 890.519 ops/s
+[info] JmhBench.bench_ssI_fmc_lhs_0 thrpt 25 8167530.225 ± 68842.632 ops/s
+[info] JmhBench.bench_ssI_fmc_lhs_1 thrpt 25 10305.165 ± 649.741 ops/s
+[info] JmhBench.bench_ssI_fmc_lst_0 thrpt 25 7450089.752 ± 860591.681 ops/s
+[info] JmhBench.bench_ssI_fmc_lst_1 thrpt 25 5580.838 ± 89.269 ops/s
+[info] JmhBench.bench_ssI_fmc_mhs_0 thrpt 25 7298703.199 ± 478617.272 ops/s
+[info] JmhBench.bench_ssI_fmc_mhs_1 thrpt 25 10089.122 ± 207.164 ops/s
+[info] JmhBench.bench_ssI_fmc_muq_0 thrpt 25 3306530.823 ± 240247.734 ops/s
+[info] JmhBench.bench_ssI_fmc_muq_1 thrpt 25 4707.455 ± 112.368 ops/s
+[info] JmhBench.bench_ssI_fmc_prq_0 thrpt 25 8466869.742 ± 656493.257 ops/s
+[info] JmhBench.bench_ssI_fmc_prq_1 thrpt 25 8092.785 ± 356.931 ops/s
+[info] JmhBench.bench_ssI_fmc_que_0 thrpt 25 7342169.186 ± 237418.673 ops/s
+[info] JmhBench.bench_ssI_fmc_que_1 thrpt 25 10399.761 ± 166.829 ops/s
+[info] JmhBench.bench_ssI_fmc_stm_0 thrpt 25 7367724.075 ± 1129148.866 ops/s
+[info] JmhBench.bench_ssI_fmc_stm_1 thrpt 25 8236.488 ± 2628.423 ops/s
+[info] JmhBench.bench_ssI_fmc_trs_0 thrpt 25 7780121.129 ± 108678.562 ops/s
+[info] JmhBench.bench_ssI_fmc_trs_1 thrpt 25 7679.958 ± 200.984 ops/s
+[info] JmhBench.bench_ssI_fmc_vec_0 thrpt 25 9118653.340 ± 247215.668 ops/s
+[info] JmhBench.bench_ssI_fmc_vec_1 thrpt 25 9589.100 ± 1791.009 ops/s
+[info] JmhBench.bench_ssI_fmc_wra_0 thrpt 25 9262801.298 ± 456880.630 ops/s
+[info] JmhBench.bench_ssI_fmc_wra_1 thrpt 25 8448.089 ± 751.665 ops/s
+[info] JmhBench.bench_ssI_mdtc_arb_0 thrpt 25 6947123.970 ± 215862.500 ops/s
+[info] JmhBench.bench_ssI_mdtc_arb_1 thrpt 25 4216205.596 ± 81236.212 ops/s
+[info] JmhBench.bench_ssI_mdtc_arr_0 thrpt 25 7877041.387 ± 175458.225 ops/s
+[info] JmhBench.bench_ssI_mdtc_arr_1 thrpt 25 4754725.775 ± 49021.630 ops/s
+[info] JmhBench.bench_ssI_mdtc_ars_0 thrpt 25 6745190.439 ± 476861.322 ops/s
+[info] JmhBench.bench_ssI_mdtc_ars_1 thrpt 25 4262939.806 ± 47183.691 ops/s
+[info] JmhBench.bench_ssI_mdtc_ast_0 thrpt 25 6854949.067 ± 68537.150 ops/s
+[info] JmhBench.bench_ssI_mdtc_ast_1 thrpt 25 4025499.567 ± 104981.719 ops/s
+[info] JmhBench.bench_ssI_mdtc_jix_0 thrpt 25 5227027.825 ± 94030.854 ops/s
+[info] JmhBench.bench_ssI_mdtc_jix_1 thrpt 25 3156089.920 ± 140112.857 ops/s
+[info] JmhBench.bench_ssI_mdtc_jln_0 thrpt 25 5380258.918 ± 245567.821 ops/s
+[info] JmhBench.bench_ssI_mdtc_jln_1 thrpt 25 3130643.665 ± 184628.801 ops/s
+[info] JmhBench.bench_ssI_mdtc_lst_0 thrpt 25 6075277.338 ± 117938.332 ops/s
+[info] JmhBench.bench_ssI_mdtc_lst_1 thrpt 25 4140145.442 ± 438069.320 ops/s
+[info] JmhBench.bench_ssI_mdtc_muq_0 thrpt 25 2785261.264 ± 65612.901 ops/s
+[info] JmhBench.bench_ssI_mdtc_muq_1 thrpt 25 1364771.167 ± 23748.839 ops/s
+[info] JmhBench.bench_ssI_mdtc_que_0 thrpt 25 5122120.176 ± 104187.267 ops/s
+[info] JmhBench.bench_ssI_mdtc_que_1 thrpt 25 2820520.670 ± 33621.491 ops/s
+[info] JmhBench.bench_ssI_mdtc_stm_0 thrpt 25 6030630.852 ± 162783.134 ops/s
+[info] JmhBench.bench_ssI_mdtc_stm_1 thrpt 25 4232143.930 ± 34806.929 ops/s
+[info] JmhBench.bench_ssI_mdtc_vec_0 thrpt 25 6841092.491 ± 167568.603 ops/s
+[info] JmhBench.bench_ssI_mdtc_vec_1 thrpt 25 4182368.069 ± 164073.205 ops/s
+[info] JmhBench.bench_ssI_mdtc_wra_0 thrpt 25 6514842.858 ± 82706.838 ops/s
+[info] JmhBench.bench_ssI_mdtc_wra_1 thrpt 25 3742865.389 ± 25362.161 ops/s
+[info] JmhBench.bench_ssI_sum_arb_0 thrpt 25 9715905.252 ± 226945.687 ops/s
+[info] JmhBench.bench_ssI_sum_arb_1 thrpt 25 11672.133 ± 1735.140 ops/s
+[info] JmhBench.bench_ssI_sum_arr_0 thrpt 25 24618518.546 ± 257756.997 ops/s
+[info] JmhBench.bench_ssI_sum_arr_1 thrpt 25 55474.149 ± 161.288 ops/s
+[info] JmhBench.bench_ssI_sum_ars_0 thrpt 25 9485950.081 ± 462558.656 ops/s
+[info] JmhBench.bench_ssI_sum_ars_1 thrpt 25 11299.644 ± 1711.369 ops/s
+[info] JmhBench.bench_ssI_sum_ast_0 thrpt 25 8429742.725 ± 392860.041 ops/s
+[info] JmhBench.bench_ssI_sum_ast_1 thrpt 25 11110.412 ± 1268.393 ops/s
+[info] JmhBench.bench_ssI_sum_ils_0 thrpt 25 15909722.568 ± 349441.040 ops/s
+[info] JmhBench.bench_ssI_sum_ils_1 thrpt 25 9678.768 ± 235.065 ops/s
+[info] JmhBench.bench_ssI_sum_ish_0 thrpt 25 13619341.652 ± 147547.281 ops/s
+[info] JmhBench.bench_ssI_sum_ish_1 thrpt 25 6212.693 ± 56.017 ops/s
+[info] JmhBench.bench_ssI_sum_jix_0 thrpt 25 26310816.947 ± 153269.402 ops/s
+[info] JmhBench.bench_ssI_sum_jix_1 thrpt 25 109104.485 ± 12951.334 ops/s
+[info] JmhBench.bench_ssI_sum_jln_0 thrpt 25 24230659.032 ± 130893.341 ops/s
+[info] JmhBench.bench_ssI_sum_jln_1 thrpt 25 44752.456 ± 3333.934 ops/s
+[info] JmhBench.bench_ssI_sum_lhs_0 thrpt 25 9055689.390 ± 262812.071 ops/s
+[info] JmhBench.bench_ssI_sum_lhs_1 thrpt 25 11230.558 ± 1611.547 ops/s
+[info] JmhBench.bench_ssI_sum_lst_0 thrpt 25 13729453.044 ± 327014.089 ops/s
+[info] JmhBench.bench_ssI_sum_lst_1 thrpt 25 17518.869 ± 183.762 ops/s
+[info] JmhBench.bench_ssI_sum_mhs_0 thrpt 25 10573254.637 ± 79889.822 ops/s
+[info] JmhBench.bench_ssI_sum_mhs_1 thrpt 25 4901.874 ± 36.980 ops/s
+[info] JmhBench.bench_ssI_sum_muq_0 thrpt 25 3809588.908 ± 286246.301 ops/s
+[info] JmhBench.bench_ssI_sum_muq_1 thrpt 25 5193.727 ± 65.227 ops/s
+[info] JmhBench.bench_ssI_sum_prq_0 thrpt 25 8280044.390 ± 169984.161 ops/s
+[info] JmhBench.bench_ssI_sum_prq_1 thrpt 25 10344.875 ± 908.924 ops/s
+[info] JmhBench.bench_ssI_sum_que_0 thrpt 25 9207756.772 ± 1668707.276 ops/s
+[info] JmhBench.bench_ssI_sum_que_1 thrpt 25 11101.518 ± 132.127 ops/s
+[info] JmhBench.bench_ssI_sum_stm_0 thrpt 25 13160208.480 ± 222285.592 ops/s
+[info] JmhBench.bench_ssI_sum_stm_1 thrpt 25 9703.721 ± 199.536 ops/s
+[info] JmhBench.bench_ssI_sum_trs_0 thrpt 25 11550300.294 ± 168610.279 ops/s
+[info] JmhBench.bench_ssI_sum_trs_1 thrpt 25 8148.181 ± 221.631 ops/s
+[info] JmhBench.bench_ssI_sum_vec_0 thrpt 25 8807366.131 ± 181526.563 ops/s
+[info] JmhBench.bench_ssI_sum_vec_1 thrpt 25 11708.860 ± 1701.693 ops/s
+[info] JmhBench.bench_ssI_sum_wra_0 thrpt 25 8933774.049 ± 32608.515 ops/s
+[info] JmhBench.bench_ssI_sum_wra_1 thrpt 25 10768.478 ± 1900.586 ops/s
+[info] JmhBench.bench_ssI_trig_arb_0 thrpt 25 127701.752 ± 300.487 ops/s
+[info] JmhBench.bench_ssI_trig_arb_1 thrpt 25 127.874 ± 0.244 ops/s
+[info] JmhBench.bench_ssI_trig_arr_0 thrpt 25 128529.229 ± 147.708 ops/s
+[info] JmhBench.bench_ssI_trig_arr_1 thrpt 25 128.141 ± 0.184 ops/s
+[info] JmhBench.bench_ssI_trig_ars_0 thrpt 25 127889.038 ± 160.223 ops/s
+[info] JmhBench.bench_ssI_trig_ars_1 thrpt 25 127.690 ± 0.348 ops/s
+[info] JmhBench.bench_ssI_trig_ast_0 thrpt 25 127744.419 ± 223.829 ops/s
+[info] JmhBench.bench_ssI_trig_ast_1 thrpt 25 127.805 ± 0.212 ops/s
+[info] JmhBench.bench_ssI_trig_ils_0 thrpt 25 127427.062 ± 250.370 ops/s
+[info] JmhBench.bench_ssI_trig_ils_1 thrpt 25 127.624 ± 0.198 ops/s
+[info] JmhBench.bench_ssI_trig_ish_0 thrpt 25 126980.180 ± 201.098 ops/s
+[info] JmhBench.bench_ssI_trig_ish_1 thrpt 25 125.386 ± 0.839 ops/s
+[info] JmhBench.bench_ssI_trig_jix_0 thrpt 25 128047.658 ± 232.857 ops/s
+[info] JmhBench.bench_ssI_trig_jix_1 thrpt 25 127.976 ± 0.179 ops/s
+[info] JmhBench.bench_ssI_trig_jln_0 thrpt 25 128373.708 ± 156.722 ops/s
+[info] JmhBench.bench_ssI_trig_jln_1 thrpt 25 127.963 ± 0.215 ops/s
+[info] JmhBench.bench_ssI_trig_lhs_0 thrpt 25 127860.927 ± 268.862 ops/s
+[info] JmhBench.bench_ssI_trig_lhs_1 thrpt 25 127.581 ± 0.288 ops/s
+[info] JmhBench.bench_ssI_trig_lst_0 thrpt 25 127175.254 ± 376.425 ops/s
+[info] JmhBench.bench_ssI_trig_lst_1 thrpt 25 127.725 ± 0.237 ops/s
+[info] JmhBench.bench_ssI_trig_mhs_0 thrpt 25 127309.073 ± 796.229 ops/s
+[info] JmhBench.bench_ssI_trig_mhs_1 thrpt 25 126.488 ± 0.355 ops/s
+[info] JmhBench.bench_ssI_trig_muq_0 thrpt 25 125063.545 ± 299.759 ops/s
+[info] JmhBench.bench_ssI_trig_muq_1 thrpt 25 124.286 ± 0.881 ops/s
+[info] JmhBench.bench_ssI_trig_prq_0 thrpt 25 127111.698 ± 354.458 ops/s
+[info] JmhBench.bench_ssI_trig_prq_1 thrpt 25 127.102 ± 0.424 ops/s
+[info] JmhBench.bench_ssI_trig_que_0 thrpt 25 127059.599 ± 786.206 ops/s
+[info] JmhBench.bench_ssI_trig_que_1 thrpt 25 126.141 ± 1.355 ops/s
+[info] JmhBench.bench_ssI_trig_stm_0 thrpt 25 127112.678 ± 241.836 ops/s
+[info] JmhBench.bench_ssI_trig_stm_1 thrpt 25 127.085 ± 0.441 ops/s
+[info] JmhBench.bench_ssI_trig_trs_0 thrpt 25 127168.343 ± 253.254 ops/s
+[info] JmhBench.bench_ssI_trig_trs_1 thrpt 25 125.868 ± 0.414 ops/s
+[info] JmhBench.bench_ssI_trig_vec_0 thrpt 25 127900.540 ± 166.834 ops/s
+[info] JmhBench.bench_ssI_trig_vec_1 thrpt 25 127.803 ± 0.190 ops/s
+[info] JmhBench.bench_ssI_trig_wra_0 thrpt 25 128020.166 ± 213.353 ops/s
+[info] JmhBench.bench_ssI_trig_wra_1 thrpt 25 127.817 ± 0.152 ops/s
+[info] JmhBench.bench_ssS_fmc_arb_0 thrpt 25 7463503.099 ± 761023.850 ops/s
+[info] JmhBench.bench_ssS_fmc_arb_1 thrpt 25 22735.029 ± 216.868 ops/s
+[info] JmhBench.bench_ssS_fmc_arr_0 thrpt 25 7692217.391 ± 662399.601 ops/s
+[info] JmhBench.bench_ssS_fmc_arr_1 thrpt 25 23523.761 ± 3082.429 ops/s
+[info] JmhBench.bench_ssS_fmc_ars_0 thrpt 25 7359939.104 ± 733550.142 ops/s
+[info] JmhBench.bench_ssS_fmc_ars_1 thrpt 25 18184.014 ± 3207.106 ops/s
+[info] JmhBench.bench_ssS_fmc_ast_0 thrpt 25 6777545.559 ± 711554.629 ops/s
+[info] JmhBench.bench_ssS_fmc_ast_1 thrpt 25 17990.091 ± 2754.649 ops/s
+[info] JmhBench.bench_ssS_fmc_ils_0 thrpt 25 5536641.969 ± 173682.607 ops/s
+[info] JmhBench.bench_ssS_fmc_ils_1 thrpt 25 16297.925 ± 1948.984 ops/s
+[info] JmhBench.bench_ssS_fmc_ish_0 thrpt 25 5276557.648 ± 151673.651 ops/s
+[info] JmhBench.bench_ssS_fmc_ish_1 thrpt 25 5487.043 ± 26.346 ops/s
+[info] JmhBench.bench_ssS_fmc_jix_0 thrpt 25 8622948.878 ± 545772.382 ops/s
+[info] JmhBench.bench_ssS_fmc_jix_1 thrpt 25 25400.994 ± 2093.185 ops/s
+[info] JmhBench.bench_ssS_fmc_jln_0 thrpt 25 8110492.748 ± 334080.983 ops/s
+[info] JmhBench.bench_ssS_fmc_jln_1 thrpt 25 26365.259 ± 2299.475 ops/s
+[info] JmhBench.bench_ssS_fmc_lhs_0 thrpt 25 6786461.725 ± 739728.565 ops/s
+[info] JmhBench.bench_ssS_fmc_lhs_1 thrpt 25 20871.320 ± 2145.218 ops/s
+[info] JmhBench.bench_ssS_fmc_lst_0 thrpt 25 5694810.309 ± 980249.336 ops/s
+[info] JmhBench.bench_ssS_fmc_lst_1 thrpt 25 16006.665 ± 115.192 ops/s
+[info] JmhBench.bench_ssS_fmc_mhs_0 thrpt 25 4918958.662 ± 1011742.955 ops/s
+[info] JmhBench.bench_ssS_fmc_mhs_1 thrpt 25 6243.466 ± 16.259 ops/s
+[info] JmhBench.bench_ssS_fmc_muq_0 thrpt 25 3143846.099 ± 161160.702 ops/s
+[info] JmhBench.bench_ssS_fmc_muq_1 thrpt 25 5153.514 ± 88.295 ops/s
+[info] JmhBench.bench_ssS_fmc_prq_0 thrpt 25 6494916.233 ± 659140.032 ops/s
+[info] JmhBench.bench_ssS_fmc_prq_1 thrpt 25 13046.181 ± 129.301 ops/s
+[info] JmhBench.bench_ssS_fmc_que_0 thrpt 25 5233751.510 ± 600136.627 ops/s
+[info] JmhBench.bench_ssS_fmc_que_1 thrpt 25 11701.632 ± 255.248 ops/s
+[info] JmhBench.bench_ssS_fmc_stm_0 thrpt 25 5954886.043 ± 721275.435 ops/s
+[info] JmhBench.bench_ssS_fmc_stm_1 thrpt 25 12476.953 ± 657.314 ops/s
+[info] JmhBench.bench_ssS_fmc_trs_0 thrpt 25 5512418.318 ± 431220.677 ops/s
+[info] JmhBench.bench_ssS_fmc_trs_1 thrpt 25 7876.367 ± 49.840 ops/s
+[info] JmhBench.bench_ssS_fmc_vec_0 thrpt 25 6647652.124 ± 808794.052 ops/s
+[info] JmhBench.bench_ssS_fmc_vec_1 thrpt 25 18797.521 ± 4612.928 ops/s
+[info] JmhBench.bench_ssS_fmc_wra_0 thrpt 25 7312179.994 ± 727113.651 ops/s
+[info] JmhBench.bench_ssS_fmc_wra_1 thrpt 25 19996.576 ± 3747.471 ops/s
+[info] JmhBench.bench_ssS_htrg_arb_0 thrpt 25 99446.779 ± 280.765 ops/s
+[info] JmhBench.bench_ssS_htrg_arb_1 thrpt 25 98.641 ± 0.151 ops/s
+[info] JmhBench.bench_ssS_htrg_arr_0 thrpt 25 99590.833 ± 277.204 ops/s
+[info] JmhBench.bench_ssS_htrg_arr_1 thrpt 25 98.728 ± 0.115 ops/s
+[info] JmhBench.bench_ssS_htrg_ars_0 thrpt 25 99488.987 ± 325.960 ops/s
+[info] JmhBench.bench_ssS_htrg_ars_1 thrpt 25 98.556 ± 0.157 ops/s
+[info] JmhBench.bench_ssS_htrg_ast_0 thrpt 25 99404.624 ± 239.178 ops/s
+[info] JmhBench.bench_ssS_htrg_ast_1 thrpt 25 98.474 ± 0.236 ops/s
+[info] JmhBench.bench_ssS_htrg_ils_0 thrpt 25 99089.876 ± 928.141 ops/s
+[info] JmhBench.bench_ssS_htrg_ils_1 thrpt 25 98.270 ± 0.161 ops/s
+[info] JmhBench.bench_ssS_htrg_ish_0 thrpt 25 99700.720 ± 151.216 ops/s
+[info] JmhBench.bench_ssS_htrg_ish_1 thrpt 25 96.097 ± 0.123 ops/s
+[info] JmhBench.bench_ssS_htrg_jix_0 thrpt 25 100076.554 ± 253.018 ops/s
+[info] JmhBench.bench_ssS_htrg_jix_1 thrpt 25 98.762 ± 0.134 ops/s
+[info] JmhBench.bench_ssS_htrg_jln_0 thrpt 25 100312.125 ± 185.924 ops/s
+[info] JmhBench.bench_ssS_htrg_jln_1 thrpt 25 98.734 ± 0.126 ops/s
+[info] JmhBench.bench_ssS_htrg_lhs_0 thrpt 25 99754.119 ± 217.214 ops/s
+[info] JmhBench.bench_ssS_htrg_lhs_1 thrpt 25 98.602 ± 0.120 ops/s
+[info] JmhBench.bench_ssS_htrg_lst_0 thrpt 25 99829.970 ± 238.825 ops/s
+[info] JmhBench.bench_ssS_htrg_lst_1 thrpt 25 98.721 ± 0.082 ops/s
+[info] JmhBench.bench_ssS_htrg_mhs_0 thrpt 25 99476.088 ± 201.311 ops/s
+[info] JmhBench.bench_ssS_htrg_mhs_1 thrpt 25 97.000 ± 0.127 ops/s
+[info] JmhBench.bench_ssS_htrg_muq_0 thrpt 25 97745.699 ± 289.134 ops/s
+[info] JmhBench.bench_ssS_htrg_muq_1 thrpt 25 96.814 ± 0.216 ops/s
+[info] JmhBench.bench_ssS_htrg_prq_0 thrpt 25 99471.700 ± 420.144 ops/s
+[info] JmhBench.bench_ssS_htrg_prq_1 thrpt 25 97.984 ± 0.144 ops/s
+[info] JmhBench.bench_ssS_htrg_que_0 thrpt 25 99167.531 ± 519.919 ops/s
+[info] JmhBench.bench_ssS_htrg_que_1 thrpt 25 97.867 ± 0.734 ops/s
+[info] JmhBench.bench_ssS_htrg_stm_0 thrpt 25 99286.997 ± 493.065 ops/s
+[info] JmhBench.bench_ssS_htrg_stm_1 thrpt 25 98.307 ± 0.123 ops/s
+[info] JmhBench.bench_ssS_htrg_trs_0 thrpt 25 99632.863 ± 167.388 ops/s
+[info] JmhBench.bench_ssS_htrg_trs_1 thrpt 25 97.235 ± 0.186 ops/s
+[info] JmhBench.bench_ssS_htrg_vec_0 thrpt 25 99346.287 ± 342.790 ops/s
+[info] JmhBench.bench_ssS_htrg_vec_1 thrpt 25 98.639 ± 0.134 ops/s
+[info] JmhBench.bench_ssS_htrg_wra_0 thrpt 25 99393.808 ± 435.384 ops/s
+[info] JmhBench.bench_ssS_htrg_wra_1 thrpt 25 98.650 ± 0.113 ops/s
+[info] JmhBench.bench_ssS_mdtc_arb_0 thrpt 25 1984988.001 ± 60815.590 ops/s
+[info] JmhBench.bench_ssS_mdtc_arb_1 thrpt 25 1804763.676 ± 24880.414 ops/s
+[info] JmhBench.bench_ssS_mdtc_arr_0 thrpt 25 2039192.164 ± 20642.902 ops/s
+[info] JmhBench.bench_ssS_mdtc_arr_1 thrpt 25 1869149.671 ± 57778.551 ops/s
+[info] JmhBench.bench_ssS_mdtc_ars_0 thrpt 25 2152810.620 ± 257467.311 ops/s
+[info] JmhBench.bench_ssS_mdtc_ars_1 thrpt 25 1943524.599 ± 249992.603 ops/s
+[info] JmhBench.bench_ssS_mdtc_ast_0 thrpt 25 2098672.703 ± 224737.345 ops/s
+[info] JmhBench.bench_ssS_mdtc_ast_1 thrpt 25 1756317.464 ± 32268.509 ops/s
+[info] JmhBench.bench_ssS_mdtc_jix_0 thrpt 25 1886876.043 ± 40790.835 ops/s
+[info] JmhBench.bench_ssS_mdtc_jix_1 thrpt 25 1776842.938 ± 87607.424 ops/s
+[info] JmhBench.bench_ssS_mdtc_jln_0 thrpt 25 1924389.622 ± 100113.823 ops/s
+[info] JmhBench.bench_ssS_mdtc_jln_1 thrpt 25 1739231.139 ± 27705.929 ops/s
+[info] JmhBench.bench_ssS_mdtc_lst_0 thrpt 25 2088812.599 ± 282022.358 ops/s
+[info] JmhBench.bench_ssS_mdtc_lst_1 thrpt 25 1885221.781 ± 98783.686 ops/s
+[info] JmhBench.bench_ssS_mdtc_muq_0 thrpt 25 1535772.126 ± 139156.482 ops/s
+[info] JmhBench.bench_ssS_mdtc_muq_1 thrpt 25 1348730.978 ± 123859.731 ops/s
+[info] JmhBench.bench_ssS_mdtc_que_0 thrpt 25 1808813.567 ± 38380.283 ops/s
+[info] JmhBench.bench_ssS_mdtc_que_1 thrpt 25 1859406.391 ± 243374.664 ops/s
+[info] JmhBench.bench_ssS_mdtc_stm_0 thrpt 25 2159647.943 ± 261644.254 ops/s
+[info] JmhBench.bench_ssS_mdtc_stm_1 thrpt 25 2060597.468 ± 239102.768 ops/s
+[info] JmhBench.bench_ssS_mdtc_vec_0 thrpt 25 1960074.223 ± 19074.784 ops/s
+[info] JmhBench.bench_ssS_mdtc_vec_1 thrpt 25 1838536.051 ± 83700.683 ops/s
+[info] JmhBench.bench_ssS_mdtc_wra_0 thrpt 25 1974542.200 ± 19477.153 ops/s
+[info] JmhBench.bench_ssS_mdtc_wra_1 thrpt 25 1846644.168 ± 61236.016 ops/s
+[info] JmhBench.bench_ssS_nbr_arb_0 thrpt 25 15162942.609 ± 190397.163 ops/s
+[info] JmhBench.bench_ssS_nbr_arb_1 thrpt 25 34172.246 ± 11486.810 ops/s
+[info] JmhBench.bench_ssS_nbr_arr_0 thrpt 25 15507888.940 ± 238185.693 ops/s
+[info] JmhBench.bench_ssS_nbr_arr_1 thrpt 25 35941.101 ± 10040.604 ops/s
+[info] JmhBench.bench_ssS_nbr_ars_0 thrpt 25 15197879.786 ± 98346.084 ops/s
+[info] JmhBench.bench_ssS_nbr_ars_1 thrpt 25 38301.207 ± 9362.340 ops/s
+[info] JmhBench.bench_ssS_nbr_ast_0 thrpt 25 13432007.539 ± 405165.436 ops/s
+[info] JmhBench.bench_ssS_nbr_ast_1 thrpt 25 32959.315 ± 8359.559 ops/s
+[info] JmhBench.bench_ssS_nbr_ils_0 thrpt 25 8549875.457 ± 500035.754 ops/s
+[info] JmhBench.bench_ssS_nbr_ils_1 thrpt 25 21605.083 ± 8611.146 ops/s
+[info] JmhBench.bench_ssS_nbr_ish_0 thrpt 25 7664446.924 ± 98245.672 ops/s
+[info] JmhBench.bench_ssS_nbr_ish_1 thrpt 25 5854.499 ± 28.620 ops/s
+[info] JmhBench.bench_ssS_nbr_jix_0 thrpt 25 16089447.761 ± 68029.793 ops/s
+[info] JmhBench.bench_ssS_nbr_jix_1 thrpt 25 40651.466 ± 4089.126 ops/s
+[info] JmhBench.bench_ssS_nbr_jln_0 thrpt 25 14995175.785 ± 244736.253 ops/s
+[info] JmhBench.bench_ssS_nbr_jln_1 thrpt 25 37382.867 ± 1452.421 ops/s
+[info] JmhBench.bench_ssS_nbr_lhs_0 thrpt 25 13926273.218 ± 110410.977 ops/s
+[info] JmhBench.bench_ssS_nbr_lhs_1 thrpt 25 27298.620 ± 8327.998 ops/s
+[info] JmhBench.bench_ssS_nbr_lst_0 thrpt 25 10221445.868 ± 204571.661 ops/s
+[info] JmhBench.bench_ssS_nbr_lst_1 thrpt 25 22706.524 ± 127.693 ops/s
+[info] JmhBench.bench_ssS_nbr_mhs_0 thrpt 25 9484224.952 ± 83230.676 ops/s
+[info] JmhBench.bench_ssS_nbr_mhs_1 thrpt 25 4272.497 ± 16.585 ops/s
+[info] JmhBench.bench_ssS_nbr_muq_0 thrpt 25 3306298.286 ± 32629.694 ops/s
+[info] JmhBench.bench_ssS_nbr_muq_1 thrpt 25 5674.616 ± 95.096 ops/s
+[info] JmhBench.bench_ssS_nbr_prq_0 thrpt 25 13602518.766 ± 182996.531 ops/s
+[info] JmhBench.bench_ssS_nbr_prq_1 thrpt 25 8229.425 ± 1387.909 ops/s
+[info] JmhBench.bench_ssS_nbr_que_0 thrpt 25 7926786.770 ± 71210.458 ops/s
+[info] JmhBench.bench_ssS_nbr_que_1 thrpt 25 12578.198 ± 340.733 ops/s
+[info] JmhBench.bench_ssS_nbr_stm_0 thrpt 25 10451796.812 ± 162198.366 ops/s
+[info] JmhBench.bench_ssS_nbr_stm_1 thrpt 25 10900.482 ± 876.892 ops/s
+[info] JmhBench.bench_ssS_nbr_trs_0 thrpt 25 8243471.097 ± 135268.322 ops/s
+[info] JmhBench.bench_ssS_nbr_trs_1 thrpt 25 5423.466 ± 46.213 ops/s
+[info] JmhBench.bench_ssS_nbr_vec_0 thrpt 25 11273633.534 ± 133713.186 ops/s
+[info] JmhBench.bench_ssS_nbr_vec_1 thrpt 25 22784.871 ± 3851.382 ops/s
+[info] JmhBench.bench_ssS_nbr_wra_0 thrpt 25 15100257.953 ± 74244.381 ops/s
+[info] JmhBench.bench_ssS_nbr_wra_1 thrpt 25 33805.074 ± 11062.118 ops/s
+[info] JmhBench.bench_tpI_sum_arb_0 thrpt 25 26739900.465 ± 335390.195 ops/s
+[info] JmhBench.bench_tpI_sum_arb_1 thrpt 25 36127.483 ± 192.396 ops/s
+[info] JmhBench.bench_tpI_sum_arr_0 thrpt 25 96980149.604 ± 307301.990 ops/s
+[info] JmhBench.bench_tpI_sum_arr_1 thrpt 25 433545.154 ± 505.319 ops/s
+[info] JmhBench.bench_tpI_sum_ars_0 thrpt 25 62659319.636 ± 263473.537 ops/s
+[info] JmhBench.bench_tpI_sum_ars_1 thrpt 25 134066.476 ± 2016.903 ops/s
+[info] JmhBench.bench_tpI_sum_ish_0 thrpt 25 13553901.120 ± 539231.487 ops/s
+[info] JmhBench.bench_tpI_sum_ish_1 thrpt 25 7114.146 ± 88.443 ops/s
+[info] JmhBench.bench_tpI_sum_mhs_0 thrpt 25 34967900.851 ± 170504.872 ops/s
+[info] JmhBench.bench_tpI_sum_mhs_1 thrpt 25 28972.583 ± 4297.660 ops/s
+[info] JmhBench.bench_tpI_sum_vec_0 thrpt 25 40722024.527 ± 324420.816 ops/s
+[info] JmhBench.bench_tpI_sum_vec_1 thrpt 25 56600.790 ± 453.750 ops/s
+[info] JmhBench.bench_tpI_sum_wra_0 thrpt 25 21076023.537 ± 321478.351 ops/s
+[info] JmhBench.bench_tpI_sum_wra_1 thrpt 25 21466.089 ± 1622.643 ops/s
+[info] JmhBench.bench_tpI_trig_arb_0 thrpt 25 129620.815 ± 139.024 ops/s
+[info] JmhBench.bench_tpI_trig_arb_1 thrpt 25 128.952 ± 0.106 ops/s
+[info] JmhBench.bench_tpI_trig_arr_0 thrpt 25 129958.638 ± 148.953 ops/s
+[info] JmhBench.bench_tpI_trig_arr_1 thrpt 25 129.385 ± 0.112 ops/s
+[info] JmhBench.bench_tpI_trig_ars_0 thrpt 25 129745.070 ± 228.564 ops/s
+[info] JmhBench.bench_tpI_trig_ars_1 thrpt 25 128.757 ± 0.199 ops/s
+[info] JmhBench.bench_tpI_trig_ish_0 thrpt 25 128598.096 ± 207.794 ops/s
+[info] JmhBench.bench_tpI_trig_ish_1 thrpt 25 125.427 ± 0.108 ops/s
+[info] JmhBench.bench_tpI_trig_mhs_0 thrpt 25 129109.741 ± 173.754 ops/s
+[info] JmhBench.bench_tpI_trig_mhs_1 thrpt 25 127.048 ± 0.209 ops/s
+[info] JmhBench.bench_tpI_trig_vec_0 thrpt 25 129567.839 ± 205.096 ops/s
+[info] JmhBench.bench_tpI_trig_vec_1 thrpt 25 128.955 ± 0.139 ops/s
+[info] JmhBench.bench_tpI_trig_wra_0 thrpt 25 129438.595 ± 145.718 ops/s
+[info] JmhBench.bench_tpI_trig_wra_1 thrpt 25 128.359 ± 0.198 ops/s
+[info] JmhBench.bench_tpS_htrg_arb_0 thrpt 25 100158.018 ± 205.248 ops/s
+[info] JmhBench.bench_tpS_htrg_arb_1 thrpt 25 98.649 ± 0.169 ops/s
+[info] JmhBench.bench_tpS_htrg_arr_0 thrpt 25 100144.281 ± 158.463 ops/s
+[info] JmhBench.bench_tpS_htrg_arr_1 thrpt 25 98.765 ± 0.260 ops/s
+[info] JmhBench.bench_tpS_htrg_ars_0 thrpt 25 100096.628 ± 172.960 ops/s
+[info] JmhBench.bench_tpS_htrg_ars_1 thrpt 25 98.710 ± 0.179 ops/s
+[info] JmhBench.bench_tpS_htrg_ish_0 thrpt 25 99760.501 ± 217.237 ops/s
+[info] JmhBench.bench_tpS_htrg_ish_1 thrpt 25 97.228 ± 0.519 ops/s
+[info] JmhBench.bench_tpS_htrg_mhs_0 thrpt 25 99806.585 ± 153.342 ops/s
+[info] JmhBench.bench_tpS_htrg_mhs_1 thrpt 25 97.412 ± 0.354 ops/s
+[info] JmhBench.bench_tpS_htrg_vec_0 thrpt 25 99612.078 ± 530.034 ops/s
+[info] JmhBench.bench_tpS_htrg_vec_1 thrpt 25 98.638 ± 0.206 ops/s
+[info] JmhBench.bench_tpS_htrg_wra_0 thrpt 25 100084.080 ± 194.389 ops/s
+[info] JmhBench.bench_tpS_htrg_wra_1 thrpt 25 98.759 ± 0.217 ops/s
+[info] JmhBench.bench_tpS_nbr_arb_0 thrpt 25 27773552.600 ± 107286.891 ops/s
+[info] JmhBench.bench_tpS_nbr_arb_1 thrpt 25 26047.916 ± 541.631 ops/s
+[info] JmhBench.bench_tpS_nbr_arr_0 thrpt 25 32696587.907 ± 125809.446 ops/s
+[info] JmhBench.bench_tpS_nbr_arr_1 thrpt 25 31707.576 ± 1469.663 ops/s
+[info] JmhBench.bench_tpS_nbr_ars_0 thrpt 25 27763273.573 ± 75994.385 ops/s
+[info] JmhBench.bench_tpS_nbr_ars_1 thrpt 25 25907.969 ± 499.582 ops/s
+[info] JmhBench.bench_tpS_nbr_ish_0 thrpt 25 10561733.949 ± 333991.228 ops/s
+[info] JmhBench.bench_tpS_nbr_ish_1 thrpt 25 6686.211 ± 38.894 ops/s
+[info] JmhBench.bench_tpS_nbr_mhs_0 thrpt 25 20592408.675 ± 290612.904 ops/s
+[info] JmhBench.bench_tpS_nbr_mhs_1 thrpt 25 6586.088 ± 57.671 ops/s
+[info] JmhBench.bench_tpS_nbr_vec_0 thrpt 25 19918742.462 ± 129361.736 ops/s
+[info] JmhBench.bench_tpS_nbr_vec_1 thrpt 25 22393.856 ± 660.971 ops/s
+[info] JmhBench.bench_tpS_nbr_wra_0 thrpt 25 27798715.944 ± 399855.662 ops/s
+[info] JmhBench.bench_tpS_nbr_wra_1 thrpt 25 26368.583 ± 698.515 ops/s
+[info] JmhBench.bench_tsI_sum_ast_0 thrpt 25 29292472.271 ± 378141.088 ops/s
+[info] JmhBench.bench_tsI_sum_ast_1 thrpt 25 38732.103 ± 250.264 ops/s
+[info] JmhBench.bench_tsI_sum_ils_0 thrpt 25 12612812.138 ± 2285614.348 ops/s
+[info] JmhBench.bench_tsI_sum_ils_1 thrpt 25 20618.454 ± 7399.667 ops/s
+[info] JmhBench.bench_tsI_sum_lhs_0 thrpt 25 19047956.030 ± 102806.511 ops/s
+[info] JmhBench.bench_tsI_sum_lhs_1 thrpt 25 21098.108 ± 1892.775 ops/s
+[info] JmhBench.bench_tsI_sum_lst_0 thrpt 25 13250785.213 ± 284214.672 ops/s
+[info] JmhBench.bench_tsI_sum_lst_1 thrpt 25 20620.823 ± 7198.647 ops/s
+[info] JmhBench.bench_tsI_sum_muq_0 thrpt 25 6186108.761 ± 49405.604 ops/s
+[info] JmhBench.bench_tsI_sum_muq_1 thrpt 25 6953.879 ± 68.504 ops/s
+[info] JmhBench.bench_tsI_sum_prq_0 thrpt 25 15439239.952 ± 61151.281 ops/s
+[info] JmhBench.bench_tsI_sum_prq_1 thrpt 25 15760.730 ± 44.485 ops/s
+[info] JmhBench.bench_tsI_sum_que_0 thrpt 25 6544132.929 ± 90771.895 ops/s
+[info] JmhBench.bench_tsI_sum_que_1 thrpt 25 7583.197 ± 82.784 ops/s
+[info] JmhBench.bench_tsI_sum_stm_0 thrpt 25 12838212.904 ± 40317.104 ops/s
+[info] JmhBench.bench_tsI_sum_stm_1 thrpt 25 13428.876 ± 412.327 ops/s
+[info] JmhBench.bench_tsI_sum_trs_0 thrpt 25 11018879.369 ± 36863.225 ops/s
+[info] JmhBench.bench_tsI_sum_trs_1 thrpt 25 12874.559 ± 320.397 ops/s
+[info] JmhBench.bench_tsI_trig_ast_0 thrpt 25 129218.582 ± 247.185 ops/s
+[info] JmhBench.bench_tsI_trig_ast_1 thrpt 25 128.730 ± 0.134 ops/s
+[info] JmhBench.bench_tsI_trig_ils_0 thrpt 25 128764.813 ± 270.973 ops/s
+[info] JmhBench.bench_tsI_trig_ils_1 thrpt 25 128.383 ± 0.229 ops/s
+[info] JmhBench.bench_tsI_trig_lhs_0 thrpt 25 129310.531 ± 402.325 ops/s
+[info] JmhBench.bench_tsI_trig_lhs_1 thrpt 25 128.862 ± 0.132 ops/s
+[info] JmhBench.bench_tsI_trig_lst_0 thrpt 25 128629.859 ± 169.266 ops/s
+[info] JmhBench.bench_tsI_trig_lst_1 thrpt 25 128.817 ± 0.136 ops/s
+[info] JmhBench.bench_tsI_trig_muq_0 thrpt 25 126882.540 ± 261.902 ops/s
+[info] JmhBench.bench_tsI_trig_muq_1 thrpt 25 124.074 ± 0.275 ops/s
+[info] JmhBench.bench_tsI_trig_prq_0 thrpt 25 128704.594 ± 132.903 ops/s
+[info] JmhBench.bench_tsI_trig_prq_1 thrpt 25 127.264 ± 0.215 ops/s
+[info] JmhBench.bench_tsI_trig_que_0 thrpt 25 127027.541 ± 305.857 ops/s
+[info] JmhBench.bench_tsI_trig_que_1 thrpt 25 127.115 ± 0.387 ops/s
+[info] JmhBench.bench_tsI_trig_stm_0 thrpt 25 128763.321 ± 170.721 ops/s
+[info] JmhBench.bench_tsI_trig_stm_1 thrpt 25 127.858 ± 0.341 ops/s
+[info] JmhBench.bench_tsI_trig_trs_0 thrpt 25 128251.208 ± 143.219 ops/s
+[info] JmhBench.bench_tsI_trig_trs_1 thrpt 25 125.752 ± 0.714 ops/s
+[info] JmhBench.bench_tsS_htrg_ast_0 thrpt 25 99993.610 ± 190.884 ops/s
+[info] JmhBench.bench_tsS_htrg_ast_1 thrpt 25 98.665 ± 0.229 ops/s
+[info] JmhBench.bench_tsS_htrg_ils_0 thrpt 25 99769.301 ± 181.360 ops/s
+[info] JmhBench.bench_tsS_htrg_ils_1 thrpt 25 97.749 ± 0.981 ops/s
+[info] JmhBench.bench_tsS_htrg_lhs_0 thrpt 25 99843.502 ± 435.773 ops/s
+[info] JmhBench.bench_tsS_htrg_lhs_1 thrpt 25 98.554 ± 0.370 ops/s
+[info] JmhBench.bench_tsS_htrg_lst_0 thrpt 25 99994.704 ± 271.382 ops/s
+[info] JmhBench.bench_tsS_htrg_lst_1 thrpt 25 98.679 ± 0.216 ops/s
+[info] JmhBench.bench_tsS_htrg_muq_0 thrpt 25 97832.075 ± 224.268 ops/s
+[info] JmhBench.bench_tsS_htrg_muq_1 thrpt 25 96.275 ± 0.219 ops/s
+[info] JmhBench.bench_tsS_htrg_prq_0 thrpt 25 100041.101 ± 215.115 ops/s
+[info] JmhBench.bench_tsS_htrg_prq_1 thrpt 25 98.142 ± 0.362 ops/s
+[info] JmhBench.bench_tsS_htrg_que_0 thrpt 25 99899.045 ± 199.887 ops/s
+[info] JmhBench.bench_tsS_htrg_que_1 thrpt 25 98.160 ± 0.193 ops/s
+[info] JmhBench.bench_tsS_htrg_stm_0 thrpt 25 99938.866 ± 583.593 ops/s
+[info] JmhBench.bench_tsS_htrg_stm_1 thrpt 25 98.389 ± 0.258 ops/s
+[info] JmhBench.bench_tsS_htrg_trs_0 thrpt 25 99843.112 ± 278.174 ops/s
+[info] JmhBench.bench_tsS_htrg_trs_1 thrpt 25 97.433 ± 0.404 ops/s
+[info] JmhBench.bench_tsS_nbr_ast_0 thrpt 25 24754126.558 ± 2252827.519 ops/s
+[info] JmhBench.bench_tsS_nbr_ast_1 thrpt 25 25470.616 ± 2313.648 ops/s
+[info] JmhBench.bench_tsS_nbr_ils_0 thrpt 25 18815243.091 ± 229054.186 ops/s
+[info] JmhBench.bench_tsS_nbr_ils_1 thrpt 25 18405.753 ± 1106.520 ops/s
+[info] JmhBench.bench_tsS_nbr_lhs_0 thrpt 25 23611132.342 ± 214340.942 ops/s
+[info] JmhBench.bench_tsS_nbr_lhs_1 thrpt 25 19916.336 ± 750.264 ops/s
+[info] JmhBench.bench_tsS_nbr_lst_0 thrpt 25 16162287.601 ± 386166.719 ops/s
+[info] JmhBench.bench_tsS_nbr_lst_1 thrpt 25 15050.506 ± 225.637 ops/s
+[info] JmhBench.bench_tsS_nbr_muq_0 thrpt 25 3990516.577 ± 72332.103 ops/s
+[info] JmhBench.bench_tsS_nbr_muq_1 thrpt 25 3957.072 ± 47.475 ops/s
+[info] JmhBench.bench_tsS_nbr_prq_0 thrpt 25 24071415.301 ± 190014.780 ops/s
+[info] JmhBench.bench_tsS_nbr_prq_1 thrpt 25 12006.143 ± 668.510 ops/s
+[info] JmhBench.bench_tsS_nbr_que_0 thrpt 25 11035865.936 ± 125073.361 ops/s
+[info] JmhBench.bench_tsS_nbr_que_1 thrpt 25 10895.451 ± 82.204 ops/s
+[info] JmhBench.bench_tsS_nbr_stm_0 thrpt 25 15774294.393 ± 161310.226 ops/s
+[info] JmhBench.bench_tsS_nbr_stm_1 thrpt 25 12751.885 ± 218.859 ops/s
+[info] JmhBench.bench_tsS_nbr_trs_0 thrpt 25 12164073.361 ± 417198.078 ops/s
+[info] JmhBench.bench_tsS_nbr_trs_1 thrpt 25 9425.149 ± 212.728 ops/s
+[success] Total time: 42760 s, completed Jan 6, 2016 11:28:41 AM
+>
diff --git a/benchmark/src/main/scala/bench/CodeGen.scala b/benchmark/src/main/scala/bench/CodeGen.scala
new file mode 100644
index 0000000..53ede95
--- /dev/null
+++ b/benchmark/src/main/scala/bench/CodeGen.scala
@@ -0,0 +1,254 @@
+/*
+ * Scala (https://www.scala-lang.org)
+ *
+ * Copyright EPFL and Lightbend, Inc.
+ *
+ * Licensed under Apache License 2.0
+ * (http://www.apache.org/licenses/LICENSE-2.0).
+ *
+ * See the NOTICE file distributed with this work for
+ * additional information regarding copyright ownership.
+ */
+
+package bench.codegen
+
+import scala.util._
+import control.NonFatal
+
+object Generator {
+ // Trailing * means that a collection is not expected to work efficiently in parallel
+ // Trailing ! means that a collection is not expected to maintain original order
+ val annotated = "arr ish! lst* ils*! que* stm* trs*! vec arb ars ast* mhs! lhs*! prq*! muq* wra jix jln".split(' ')
+
+ // Parallel version if any appears after /
+ // Trailing % means that operation creates new collections and thus can't be used with Stepper (sequential ops only)
+ // Trailing ! means that collection must maintain original order (i.e. don't use if collection is marked !)
+ val allops = Seq(("OnInt", "I", "sum/psum trig/ptrig fmc%/pfmc mdtc!%"), ("OnString", "S", "nbr/pnbr htrg/phtrg fmc%/pfmc mdtc!%"))
+
+ def parsefs(fs: String) = fs.split(' ').map(_.split('/') match {
+ case Array(x) => (x.takeWhile(_.isLetter), None, x contains "!", x contains "%")
+ case Array(x,y) => (x.takeWhile(_.isLetter), Some(y.takeWhile(_.isLetter)), (x+y) contains "!", x contains "%")
+ })
+
+ val names = annotated.map(_.takeWhile(_.isLetter))
+ val nojname = names.filterNot(_ startsWith "j").toSet
+ val parname = annotated.filterNot(_ contains "*").map(_.takeWhile(_.isLetter)).toSet
+ val sqnname = names.filterNot(parname).toSet union names.filterNot(nojname).toSet
+ val ordname = annotated.filterNot(_ contains "!").map(_.takeWhile(_.isLetter)).toSet
+ val jmhsizes = Array(10, 10000) // JMH takes FOREVER, so we're lucky to get two sizes.
+
+ def writeTo(f: java.io.File)(pr: (String => Unit) => Unit): Either[Throwable, Unit] = {
+ try {
+ val pw = new java.io.PrintWriter(f)
+ val wr: String => Unit = s => pw.println(s)
+ try { pr(wr); Right(()) }
+ catch { case NonFatal(t) => Left(t) }
+ finally { pw.close() }
+ }
+ catch { case NonFatal(t) => Left(t) }
+ }
+
+ def sayArrayI(oa: Option[Array[Int]]) = oa match { case Some(a) => a.mkString("Array(", ",", ")"); case _ => "" }
+
+ def agreement(target: java.io.File, sizes: Option[Array[Int]] = None): Unit = {
+ val q = "\""
+ if (target.exists) throw new java.io.IOException("Generator will not write to existing file: " + target.getPath)
+ writeTo(target){ pr =>
+ pr( """package bench.test""")
+ pr( """""")
+ pr( """import bench.generate._, bench.operate._, bench.generate.EnableIterators._""")
+ pr( """import scala.compat.java8.StreamConverters._""")
+ pr( """""")
+ pr( """object Agreement {""")
+ pr( """ def run() {""")
+ pr( """ val wrong = new collection.mutable.ArrayBuffer[String]""")
+ pr( """ def check[A](a1: A, a2: => A, msg: String) {""")
+ pr( """ var t = System.nanoTime""")
+ pr( """ if (!CloseEnough(a1, { val ans = a2; t = System.nanoTime - t; ans}))""")
+ pr( """ wrong += msg""")
+ pr( """ if (t > 2000000000) wrong += "Slow " + msg""")
+ pr( """ }""")
+ pr( s" val m = (new bench.generate.Things(${sayArrayI(sizes)})).N;" )
+ allops.foreach{ case (o, t, fs) =>
+ names.foreach{ n =>
+ pr( s" { // Scope for operations $o collection $n")
+ pr( s" var x = new bench.generate.Things(${sayArrayI(sizes)})" )
+ parsefs(fs).foreach{ case (f, pf, ord, nu) =>
+ if (ordname(n) || !ord) {
+ pr( """ for (i <- 0 until m) {""")
+ pr( s" val z = $o.$f(x.arr.c$t(i))")
+ if (nojname(n)) {
+ pr( s" check(z, $o.$f(x.$n.c$t(i)), ${q}c$t $f $n ${q}+i.toString)")
+ pr( s" check(z, $o.$f(x.$n.i$t(i)), ${q}i$t $f $n ${q}+i.toString)")
+ if (pf.isDefined)
+ pr( s" check(z, $o.${pf.get}(x.$n.c$t(i).par), ${q}i$t ${pf.get} $n ${q}+i.toString)")
+ }
+ if (sqnname(n) || parname(n)) {
+ pr( s" check(z, $o.$f(x.$n.ss$t(i)), ${q}ss$t $f $n ${q}+i.toString)")
+ if (nojname(n) && !nu) {
+ if (sqnname(n))
+ pr( s" check(z, $o.$f(x.$n.ts$t(i)), ${q}ts$t $f $n ${q}+i.toString)")
+ else
+ pr( s" check(z, $o.$f(x.$n.tp$t(i)), ${q}tp$t $f $n ${q}+i.toString)")
+ }
+ }
+ if (parname(n) && pf.isDefined) {
+ pr( s" check(z, $o.${pf.get}(x.$n.sp$t(i)), ${q}sp$t ${pf.get} $n ${q}+i.toString)")
+ if (nojname(n) && !nu)
+ pr( s" check(z, $o.${pf.get}(x.$n.zp$t(i)), ${q}zp$t ${pf.get} $n ${q}+i.toString)")
+ }
+ pr( s" }")
+ }
+ }
+ pr( s" x = null // Allow GC" )
+ pr( s" } // End scope for operations $o collection $n")
+ }
+ }
+ pr( """ wrong.foreach(println)""")
+ pr( """ if (wrong.nonEmpty) sys.exit(1) """)
+ pr( """ }""")
+ pr( """}""")
+ } match {
+ case Left(t) => println("Did not successfully write file: " + target.getPath); throw t
+ case _ =>
+ }
+ }
+
+ def quickBenchWithThyme(target: java.io.File, sizes: Option[Array[Int]] = None): Unit = {
+ val q = "\""
+ if (target.exists) throw new java.io.IOException("Generator will not write to existing file: " + target.getPath)
+ writeTo(target){ pr =>
+ pr( """package bench.test""")
+ pr( """""")
+ pr( """import bench.generate._, bench.operate._, bench.generate.EnableIterators._""")
+ pr( """import scala.compat.java8.StreamConverters._""")
+ pr( """import ichi.bench.Thyme""")
+ pr( """""")
+ pr( """object ThymeBench {""")
+ pr( """ def run() {""")
+ pr( """ val th = Thyme.warmed()""")
+ pr( s" val m = (new bench.generate.Things(${sayArrayI(sizes)})).N;" )
+ pr( """ def timings[A](x: bench.generate.Things, op: Int => A, name: String) {""")
+ pr( """ val ts = new collection.mutable.ArrayBuffer[(Double, Double, Double)]""")
+ pr( """ val discard = th.clock(op(m-1))(_ => ()) // Init collections""")
+ pr( """ for (i <- 0 until m) {""")
+ pr( """ println(name + i)""")
+ pr( """ val b = Thyme.Benched.empty""")
+ pr( """ val a = th.bench(op(i))(b)""")
+ pr( """ if (a == null) ts += ((Double.NaN, Double.NaN, Double.NaN))""")
+ pr( """ else ts += ((""")
+ pr( """ b.runtime * 1e6, b.runtimeCI95._1 * 1e6, b.runtimeCI95._2 * 1e6""")
+ pr( """ ))""")
+ pr( """ }""")
+ pr( """ val sb = new StringBuilder""")
+ pr( """ sb ++= name + ":" """)
+ pr( """ if (sb.length < 16) sb ++= " " * (16 - sb.length)""")
+ pr( """ ts.foreach{ case (c, lo, hi) =>""")
+ pr( """ sb ++= " " """)
+ pr( """ sb ++= " %11.4f".format(c)""")
+ pr( """ sb ++= " %11.4f".format(lo)""")
+ pr( """ sb ++= " %11.4f".format(hi)""")
+ pr( """ }""")
+ pr( """ println(sb.result)""")
+ pr( """ }""")
+ allops.foreach{ case (o, t, fs) =>
+ names.foreach{ n =>
+ pr( s" { // Scope for operations $o collection $n")
+ pr( s" var x = new bench.generate.Things(${sayArrayI(sizes)})" )
+ parsefs(fs).foreach{ case (f, pf, ord, nu) =>
+ if (ordname(n) || !ord) {
+ if (nojname(n)) {
+ pr( s" timings(x, i => $o.$f(x.$n.c$t(i)), ${q}c$t $f $n${q})");
+ pr( s" timings(x, i => $o.$f(x.$n.i$t(i)), ${q}i$t $f $n${q})")
+ if (!nu) {
+ if (sqnname(n))
+ pr( s" timings(x, i => $o.$f(x.$n.ts$t(i)), ${q}ts$t $f $n${q})");
+ else
+ pr( s" timings(x, i => $o.$f(x.$n.tp$t(i)), ${q}tp$t $f $n${q})");
+ }
+ }
+ if (sqnname(n)) {
+ pr( s" timings(x, i => $o.$f(x.$n.ss$t(i)), ${q}ss$t $f $n${q})")
+ if (nojname(n))
+ pr( s" timings(x, i => $o.$f(x.$n.zs$t(i)), ${q}zs$t $f $n${q})")
+ }
+ if (parname(n) && pf.isDefined) {
+ pr( s" timings(x, i => $o.$f(x.$n.sp$t(i)), ${q}sp$t $f $n${q})")
+ if (nojname(n))
+ pr( s" timings(x, i => $o.$f(x.$n.zp$t(i)), ${q}zp$t $f $n${q})")
+ }
+ }
+ }
+ pr( s" x = null // Allow GC" )
+ pr( s" } // End scope for operations $o collection $n")
+ }
+ }
+ pr( """ }""")
+ pr( """}""")
+ } match {
+ case Left(t) => println("Did not successfully write file: " + target.getPath); throw t
+ case _ =>
+ }
+ }
+
+ def jmhBench(target: java.io.File = new java.io.File("JmhBench.scala"), sizes: Option[Array[Int]] = Some(jmhsizes)): Unit = {
+ val q = "\""
+ if (target.exists) throw new java.io.IOException("Generator will not write to existing file: " + target.getPath)
+ writeTo(target){ pr =>
+ pr( """// This file auto-generated by bench.codegen.Generator.jmhBench. Do not modify directly.""")
+ pr( """""")
+ pr( """package bench.test""")
+ pr( """""")
+ pr( """import bench.generate._, bench.operate._, bench.generate.EnableIterators._""")
+ pr( """import scala.compat.java8.StreamConverters._""")
+ pr( """import org.openjdk.jmh.annotations._""")
+ pr( """""")
+ pr( """@State(Scope.Benchmark)""")
+ pr( """class JmhBench {""")
+ pr( s" val x = new bench.generate.Things(${sayArrayI(sizes)})")
+ val m = sizes.map(_.length).getOrElse(new bench.generate.Things().N)
+ allops.foreach{ case (o, t, fs) =>
+ names.foreach{ n =>
+ parsefs(fs).foreach{ case (f, pf, ord, nu) =>
+ for (i <- 0 until m) {
+ if (ordname(n) || !ord) {
+ if (nojname(n)) {
+ pr( s" @Benchmark def bench_c${t}_${f}_${n}_$i() = $o.$f(x.$n.c$t($i))")
+ pr( s" @Benchmark def bench_i${t}_${f}_${n}_$i() = $o.$f(x.$n.i$t($i))")
+ if (!nu) {
+ if (sqnname(n))
+ pr( s" @Benchmark def bench_ts${t}_${f}_${n}_$i() = $o.$f(x.$n.ts$t($i))")
+ else
+ pr( s" @Benchmark def bench_tp${t}_${f}_${n}_$i() = $o.$f(x.$n.tp$t($i))")
+ }
+ }
+ pr( s" @Benchmark def bench_ss${t}_${f}_${n}_$i() = $o.$f(x.$n.ss$t($i))")
+ //if (nojname(n))
+ // pr( s" @Benchmark def bench_zs${t}_${f}_${n}_$i() = $o.$f(x.$n.zs$t($i))")
+ if (parname(n) && pf.isDefined) {
+ if (nojname(n))
+ pr( s" @Benchmark def bench_cp${t}_${pf.get}_${n}_$i() = $o.${pf.get}(x.$n.c$t($i).par)")
+ pr( s" @Benchmark def bench_sp${t}_${pf.get}_${n}_$i() = $o.${pf.get}(x.$n.sp$t($i))")
+ //if (nojname(n))
+ // pr( s" @Benchmark def bench_zp${t}_${f}_${n}_$i() = $o.$f(x.$n.zp$t($i))")
+ }
+ }
+ }
+ }
+ }
+ }
+ pr( """}""")
+ } match {
+ case Left(t) => println("Did not successfully write file: " + target.getPath); throw t
+ case _ =>
+ }
+ }
+}
+
+object GenJmhBench {
+ def main(args: Array[String]): Unit = {
+ val f = new java.io.File("JmhBench.scala")
+ f.delete()
+ Generator.jmhBench(f)
+ }
+}
diff --git a/benchmark/src/main/scala/bench/CollectionSource.scala b/benchmark/src/main/scala/bench/CollectionSource.scala
new file mode 100644
index 0000000..07d021d
--- /dev/null
+++ b/benchmark/src/main/scala/bench/CollectionSource.scala
@@ -0,0 +1,298 @@
+/*
+ * Scala (https://www.scala-lang.org)
+ *
+ * Copyright EPFL and Lightbend, Inc.
+ *
+ * Licensed under Apache License 2.0
+ * (http://www.apache.org/licenses/LICENSE-2.0).
+ *
+ * See the NOTICE file distributed with this work for
+ * additional information regarding copyright ownership.
+ */
+
+package bench
+
+import java.util.stream._
+
+import scala.collection.generic.CanBuildFrom
+import scala.compat.java8.StreamConverters._
+import scala.compat.java8.collectionImpl._
+import scala.compat.java8.converterImpl._
+import scala.compat.java8.{MakesSequentialStream, MakesParallelStream}
+
+package object generate {
+ private def myInty(n: Int) = 0 until n
+ private def myStringy(n: Int) = myInty(n).map(i => (i*i).toString)
+
+ object Coll {
+ def i[CC[_]](n: Int)(implicit cbf: CanBuildFrom[Nothing, Int, CC[Int]]): CC[Int] = {
+ val b = cbf();
+ myInty(n).foreach(b += _)
+ b.result()
+ }
+ def s[CC[_]](n: Int)(implicit cbf: CanBuildFrom[Nothing, String, CC[String]]): CC[String] = {
+ val b = cbf();
+ myStringy(n).foreach(b += _)
+ b.result()
+ }
+ }
+
+ object Pstep {
+ def i[CC](cc: CC)(implicit steppize: CC => MakesStepper[Int, EfficientSubstep]): IntStepper =
+ steppize(cc).stepper
+ def s[CC](cc: CC)(implicit steppize: CC => MakesStepper[String, EfficientSubstep]): AnyStepper[String] =
+ steppize(cc).stepper
+ }
+
+ object Sstep {
+ def i[CC](cc: CC)(implicit steppize: CC => MakesStepper[Int, Any]): IntStepper =
+ steppize(cc).stepper
+ def s[CC](cc: CC)(implicit steppize: CC => MakesStepper[String, Any]): AnyStepper[String] =
+ steppize(cc).stepper
+ }
+
+ object PsStream {
+ def i[CC](cc: CC)(implicit steppize: CC => MakesStepper[Int, EfficientSubstep]): IntStream =
+ steppize(cc).stepper.parStream
+ def s[CC](cc: CC)(implicit steppize: CC => MakesStepper[String, EfficientSubstep]): Stream[String] =
+ steppize(cc).stepper.parStream
+ }
+
+ object SsStream {
+ def i[CC](cc: CC)(implicit steppize: CC => MakesStepper[Int, Any]): IntStream =
+ steppize(cc).stepper.seqStream
+ def s[CC](cc: CC)(implicit steppize: CC => MakesStepper[String, Any]): Stream[String] =
+ steppize(cc).stepper.seqStream
+ }
+
+ object Sstream {
+ def i[CC](cc: CC)(implicit streamize: CC => MakesSequentialStream[Int, IntStream]) =
+ streamize(cc).seqStream
+ def s[CC](cc: CC)(implicit streamize: CC => MakesSequentialStream[String, Stream[String]]) =
+ streamize(cc).seqStream
+ }
+
+ object Pstream {
+ def i[CC](cc: CC)(implicit streamize: CC => MakesParallelStream[Int, IntStream]) =
+ streamize(cc).parStream
+ def s[CC](cc: CC)(implicit streamize: CC => MakesParallelStream[String, Stream[String]]) =
+ streamize(cc).parStream
+ }
+
+ trait GenThingsOf[CC[_]] {
+ def title: String
+ def sizes: Array[Int]
+ }
+
+ trait IntThingsOf[CC[_]] extends GenThingsOf[CC] {
+ implicit def myCBFi: CanBuildFrom[Nothing, Int, CC[Int]]
+ // Base collection
+ val cI = sizes.map(n => Coll.i[CC](n))
+ // Iterator
+ def iI(j: Int)(implicit x: CC[Int] => Iterator[Int]) = x(cI(j))
+ // Steppers (second letter--s = sequential, p = parallel)
+ def tsI(j: Int)(implicit x: CC[Int] => MakesStepper[Int, Any]) = Sstep i cI(j)
+ def tpI(j: Int)(implicit x: CC[Int] => MakesStepper[Int, EfficientSubstep]) = Pstep i cI(j)
+ // Streams
+ def ssI(j: Int)(implicit x: CC[Int] => MakesSequentialStream[Int, IntStream]) = Sstream i cI(j)
+ def spI(j: Int)(implicit x: CC[Int] => MakesParallelStream[Int, IntStream]) = Pstream i cI(j)
+ // Streams via steppers
+ def zsI(j: Int)(implicit x: CC[Int] => MakesStepper[Int, Any]) = SsStream i cI(j)
+ def zpI(j: Int)(implicit x: CC[Int] => MakesStepper[Int, EfficientSubstep]) = PsStream i cI(j)
+ }
+
+ trait StringThingsOf[CC[_]] extends GenThingsOf[CC] {
+ implicit def myCBFs: CanBuildFrom[Nothing, String, CC[String]]
+ // Base collection
+ val cS = sizes.map(n => Coll.s[CC](n))
+ // Iterator
+ def iS(j: Int)(implicit x: CC[String] => Iterator[String]) = x(cS(j))
+ // Steppers (second letter--s = sequential, p = parallel)
+ def tsS(j: Int)(implicit x: CC[String] => MakesStepper[String, Any]) = Sstep s cS(j)
+ def tpS(j: Int)(implicit x: CC[String] => MakesStepper[String, EfficientSubstep]) = Pstep s cS(j)
+ // Streams
+ def ssS(j: Int)(implicit x: CC[String] => MakesSequentialStream[String, Stream[String]]) = Sstream s cS(j)
+ def spS(j: Int)(implicit x: CC[String] => MakesParallelStream[String, Stream[String]]) = Pstream s cS(j)
+ // Streams via steppers
+ def zsS(j: Int)(implicit x: CC[String] => MakesStepper[String, Any]) = SsStream s cS(j)
+ def zpS(j: Int)(implicit x: CC[String] => MakesStepper[String, EfficientSubstep]) = PsStream s cS(j)
+ }
+
+ trait ThingsOf[CC[_]] extends IntThingsOf[CC] with StringThingsOf[CC] {}
+
+ abstract class AbstractThings[CC[_]](val title: String)(
+ implicit
+ outerCBFi: CanBuildFrom[Nothing, Int, CC[Int]],
+ outerCBFs: CanBuildFrom[Nothing, String, CC[String]]
+ )
+ extends ThingsOf[CC] {
+ implicit def myCBFi = outerCBFi
+ implicit def myCBFs = outerCBFs
+ }
+
+ // Java collection CBFs
+
+ implicit val javaUtilArrayListIntCanBuildFrom = new CanBuildFrom[Nothing, Int, java.util.ArrayList[Int]] {
+ def apply(from: Nothing): collection.mutable.Builder[Int, java.util.ArrayList[Int]] = apply()
+ def apply(): collection.mutable.Builder[Int, java.util.ArrayList[Int]] = new collection.mutable.Builder[Int, java.util.ArrayList[Int]] {
+ private var myAL = new java.util.ArrayList[Int]
+ def clear() = { myAL = new java.util.ArrayList[Int]; () }
+ def result() = { val ans = myAL; clear(); ans }
+ def +=(x: Int) = { myAL add x; this }
+ }
+ }
+ implicit val javaUtilArrayListStringCanBuildFrom = new CanBuildFrom[Nothing, String, java.util.ArrayList[String]] {
+ def apply(from: Nothing): collection.mutable.Builder[String, java.util.ArrayList[String]] = apply()
+ def apply(): collection.mutable.Builder[String, java.util.ArrayList[String]] = new collection.mutable.Builder[String, java.util.ArrayList[String]] {
+ private var myAL = new java.util.ArrayList[String]
+ def clear() = { myAL = new java.util.ArrayList[String]; () }
+ def result() = { val ans = myAL; clear(); ans }
+ def +=(x: String) = { myAL add x; this }
+ }
+ }
+ implicit val javaUtilLinkedListIntCanBuildFrom = new CanBuildFrom[Nothing, Int, java.util.LinkedList[Int]] {
+ def apply(from: Nothing): collection.mutable.Builder[Int, java.util.LinkedList[Int]] = apply()
+ def apply(): collection.mutable.Builder[Int, java.util.LinkedList[Int]] = new collection.mutable.Builder[Int, java.util.LinkedList[Int]] {
+ private var myLL = new java.util.LinkedList[Int]
+ def clear() = { myLL = new java.util.LinkedList[Int]; () }
+ def result() = { val ans = myLL; clear(); ans }
+ def +=(x: Int) = { myLL add x; this }
+ }
+ }
+ implicit val javaUtilLinkedListStringCanBuildFrom = new CanBuildFrom[Nothing, String, java.util.LinkedList[String]] {
+ def apply(from: Nothing): collection.mutable.Builder[String, java.util.LinkedList[String]] = apply()
+ def apply(): collection.mutable.Builder[String, java.util.LinkedList[String]] = new collection.mutable.Builder[String, java.util.LinkedList[String]] {
+ private var myLL = new java.util.LinkedList[String]
+ def clear() = { myLL = new java.util.LinkedList[String]; () }
+ def result() = { val ans = myLL; clear(); ans }
+ def +=(x: String) = { myLL add x; this }
+ }
+ }
+
+ // Streams from ArrayList (Java)
+
+ implicit val getsParStreamFromArrayListInt: (java.util.ArrayList[Int] => MakesParallelStream[Int, IntStream]) = ali => {
+ new MakesParallelStream[Int, IntStream] {
+ def parStream: IntStream = ali.
+ asInstanceOf[java.util.ArrayList[java.lang.Integer]].
+ parallelStream.parallel.
+ mapToInt(new java.util.function.ToIntFunction[java.lang.Integer]{ def applyAsInt(i: java.lang.Integer) = i.intValue })
+ }
+ }
+ implicit val getsSeqStreamFromArrayListInt: (java.util.ArrayList[Int] => MakesSequentialStream[Int, IntStream]) = ali => {
+ new MakesSequentialStream[Int, IntStream] {
+ def seqStream: IntStream = ali.
+ asInstanceOf[java.util.ArrayList[java.lang.Integer]].
+ stream().
+ mapToInt(new java.util.function.ToIntFunction[java.lang.Integer]{ def applyAsInt(i: java.lang.Integer) = i.intValue })
+ }
+ }
+ implicit val getsParStreamFromArrayListString: (java.util.ArrayList[String] => MakesParallelStream[String, Stream[String]]) = als => {
+ new MakesParallelStream[String, Stream[String]] {
+ def parStream: Stream[String] = als.parallelStream.parallel
+ }
+ }
+ implicit val getsSeqStreamFromArrayListString: (java.util.ArrayList[String] => MakesSequentialStream[String, Stream[String]]) = als => {
+ new MakesSequentialStream[String, Stream[String]] {
+ def seqStream: Stream[String] = als.stream
+ }
+ }
+
+ // Streams from LinkedList (Java)
+
+ implicit val getsParStreamFromLinkedListInt: (java.util.LinkedList[Int] => MakesParallelStream[Int, IntStream]) = ali => {
+ new MakesParallelStream[Int, IntStream] {
+ def parStream: IntStream = ali.
+ asInstanceOf[java.util.LinkedList[java.lang.Integer]].
+ parallelStream.parallel.
+ mapToInt(new java.util.function.ToIntFunction[java.lang.Integer]{ def applyAsInt(i: java.lang.Integer) = i.intValue })
+ }
+ }
+ implicit val getsSeqStreamFromLinkedListInt: (java.util.LinkedList[Int] => MakesSequentialStream[Int, IntStream]) = ali => {
+ new MakesSequentialStream[Int, IntStream] {
+ def seqStream: IntStream = ali.
+ asInstanceOf[java.util.LinkedList[java.lang.Integer]].
+ stream().
+ mapToInt(new java.util.function.ToIntFunction[java.lang.Integer]{ def applyAsInt(i: java.lang.Integer) = i.intValue })
+ }
+ }
+ implicit val getsParStreamFromLinkedListString: (java.util.LinkedList[String] => MakesParallelStream[String, Stream[String]]) = als => {
+ new MakesParallelStream[String, Stream[String]] {
+ def parStream: Stream[String] = als.parallelStream.parallel
+ }
+ }
+ implicit val getsSeqStreamFromLinkedListString: (java.util.LinkedList[String] => MakesSequentialStream[String, Stream[String]]) = als => {
+ new MakesSequentialStream[String, Stream[String]] {
+ def seqStream: Stream[String] = als.stream
+ }
+ }
+
+ object EnableIterators {
+ implicit val iterableIntToIterator: (Iterable[Int] => Iterator[Int]) = _.iterator
+ implicit val iterableStringToIterator: (Iterable[String] => Iterator[String]) = _.iterator
+ implicit val arrayIntToIterator: (Array[Int] => Iterator[Int]) = (a: Array[Int]) => new Iterator[Int] {
+ private[this] var i = 0
+ def hasNext = i < a.length
+ def next = if (hasNext) { var ans = a(i); i += 1; ans } else throw new NoSuchElementException(i.toString)
+ }
+ implicit val arrayStringToIterator: (Array[String] => Iterator[String]) = _.iterator
+ }
+
+ class ArrThings(val sizes: Array[Int]) extends AbstractThings[Array]("Array") {}
+
+ class IshThings(val sizes: Array[Int]) extends AbstractThings[collection.immutable.HashSet]("immutable.HashSet") {}
+
+ class LstThings(val sizes: Array[Int]) extends AbstractThings[List]("List") {}
+
+ class IlsThings(val sizes: Array[Int]) extends AbstractThings[collection.immutable.ListSet]("immutable.ListSet") {}
+
+ class QueThings(val sizes: Array[Int]) extends AbstractThings[collection.immutable.Queue]("immutable.Queue") {}
+
+ class StmThings(val sizes: Array[Int]) extends AbstractThings[collection.immutable.Stream]("immutable.Stream") {}
+
+ class TrsThings(val sizes: Array[Int]) extends AbstractThings[collection.immutable.TreeSet]("immutable.TreeSet") {}
+
+ class VecThings(val sizes: Array[Int]) extends AbstractThings[Vector]("Vector") {}
+
+ class ArbThings(val sizes: Array[Int]) extends AbstractThings[collection.mutable.ArrayBuffer]("mutable.ArrayBuffer") {}
+
+ class ArsThings(val sizes: Array[Int]) extends AbstractThings[collection.mutable.ArraySeq]("mutable.ArraySeq") {}
+
+ class AstThings(val sizes: Array[Int]) extends AbstractThings[collection.mutable.ArrayStack]("mutable.ArrayStack") {}
+
+ class MhsThings(val sizes: Array[Int]) extends AbstractThings[collection.mutable.HashSet]("mutable.HashSet") {}
+
+ class LhsThings(val sizes: Array[Int]) extends AbstractThings[collection.mutable.LinkedHashSet]("mutable.LinkedHashSet") {}
+
+ class PrqThings(val sizes: Array[Int]) extends AbstractThings[collection.mutable.PriorityQueue]("mutable.PriorityQueue") {}
+
+ class MuqThings(val sizes: Array[Int]) extends AbstractThings[collection.mutable.Queue]("mutable.Queue") {}
+
+ class WraThings(val sizes: Array[Int]) extends AbstractThings[collection.mutable.WrappedArray]("mutable.WrappedArray") {}
+
+ class JixThings(val sizes: Array[Int]) extends AbstractThings[java.util.ArrayList]("java.util.ArrayList") {}
+
+ class JlnThings(val sizes: Array[Int]) extends AbstractThings[java.util.LinkedList]("java.util.LinkedList") {}
+
+ class Things(sizes: Array[Int] = Array(0, 1, 2, 5, 7, 15, 16, 32, 33, 64, 129, 256, 1023, 2914, 7151/*, 20000, 50000, 200000*/)) {
+ def N = sizes.length
+ lazy val arr = new ArrThings(sizes)
+ lazy val ish = new IshThings(sizes)
+ lazy val lst = new LstThings(sizes)
+ lazy val ils = new IlsThings(sizes)
+ lazy val que = new QueThings(sizes)
+ lazy val stm = new StmThings(sizes)
+ lazy val trs = new TrsThings(sizes)
+ lazy val vec = new VecThings(sizes)
+ lazy val arb = new ArbThings(sizes)
+ lazy val ars = new ArsThings(sizes)
+ lazy val ast = new AstThings(sizes)
+ lazy val mhs = new MhsThings(sizes)
+ lazy val lhs = new LhsThings(sizes)
+ lazy val prq = new PrqThings(sizes)
+ lazy val muq = new MuqThings(sizes)
+ lazy val wra = new WraThings(sizes)
+ lazy val jix = new JixThings(sizes)
+ lazy val jln = new JlnThings(sizes)
+ }
+}
diff --git a/benchmark/src/main/scala/bench/Operations.scala b/benchmark/src/main/scala/bench/Operations.scala
new file mode 100644
index 0000000..0a13126
--- /dev/null
+++ b/benchmark/src/main/scala/bench/Operations.scala
@@ -0,0 +1,138 @@
+/*
+ * Scala (https://www.scala-lang.org)
+ *
+ * Copyright EPFL and Lightbend, Inc.
+ *
+ * Licensed under Apache License 2.0
+ * (http://www.apache.org/licenses/LICENSE-2.0).
+ *
+ * See the NOTICE file distributed with this work for
+ * additional information regarding copyright ownership.
+ */
+
+package bench.operate
+
+import java.util.stream._
+import java.util.{function => jf}
+
+import scala.collection.parallel.ParIterable
+
+import scala.compat.java8.StreamConverters._
+import scala.compat.java8.converterImpl._
+import scala.compat.java8.collectionImpl._
+
+object CloseEnough {
+ import scala.math._
+ def apply[A](a: A, b: => A): Boolean = a match {
+ case da: Double => b match {
+ case db: Double => (da.isNaN && db.isNaN) || abs(da - db) <= max(1, max(abs(da), abs(db)))*1e-6
+ case x => a == x
+ }
+ case _ => a == b
+ }
+}
+
+object OnInt {
+ def expensive(i: Int) = { var v = i.toDouble; var j = 0; while (j < 10) { v = math.exp(math.sin(v)); j += 1 }; v+j }
+
+ def sum(a: Array[Int]): Int = { var s,i = 0; while (i < a.length) { s += a(i); i += 1 }; s }
+ def sum(t: Traversable[Int]): Int = t.sum
+ def sum(i: Iterator[Int]): Int = i.sum
+ def sum(s: IntStepper): Int = s.fold(0)(_ + _)
+ def sum(s: IntStream): Int = {
+ s.sum
+ /*var r = 0
+ val it = s.iterator()
+ while(it.hasNext) r += it.nextInt()
+ r*/
+ }
+ def psum(i: ParIterable[Int]): Int = i.sum
+ def psum(s: IntStream): Int = s.sum
+
+ def trig(a: Array[Int]): Double = { var i = 0; var s = 0.0; while (i < a.length) { s += expensive(a(i)); i += 1 }; s }
+ def trig(t: Traversable[Int]): Double = t.map(expensive).sum
+ def trig(i: Iterator[Int]): Double = i.map(expensive).sum
+ def trig(s: IntStepper): Double = s.fold(0.0)((x,i) => x + expensive(i))
+ def trig(s: IntStream): Double = s.mapToDouble(new jf.IntToDoubleFunction{ def applyAsDouble(i: Int) = expensive(i) }).sum
+ def ptrig(i: ParIterable[Int]): Double = i.map(expensive).sum
+ def ptrig(s: IntStream): Double = trig(s)
+
+ def fmc(a: Array[Int]): Int = { var s,i = 0; while (i < a.length) { if (i%7 == 1) s += (i/7)*i; i += 1 }; s }
+ def fmc(t: Traversable[Int]): Int = t.filter(x => (x%7) == 1).map(x => (x/7)*x).sum
+ def fmc(i: Iterator[Int]): Int = i.filter(x => (x%7) == 1).map(x => (x/7)*x).sum
+ def fmc(s: IntStream): Int = s.
+ filter(new jf.IntPredicate { def test(x: Int) = (x%7) == 1 }).
+ map(new jf.IntUnaryOperator{ def applyAsInt(x: Int) = (x/7)*x }).
+ sum
+ def pfmc(i: ParIterable[Int]): Int = i.filter(x => (x%7) == 1).map(x => (x/7)*x).sum
+ def pfmc(s: IntStream): Int = fmc(s)
+
+ def mdtc(a: Array[Int]): Int = { var i = 1; while(i < a.length) { if ((a(i) << 1) >= 42) return i-1; i += 1 }; i - 1 }
+ def mdtc(t: Traversable[Int]): Int = t.map(_ << 1).drop(1).takeWhile(_ < 42).size
+ def mdtc(i: Iterator[Int]): Int = i.map(_ << 1).drop(1).takeWhile(_ < 42).size
+ def mdtc(s: IntStream): Int = {
+ val temp = s.map(new jf.IntUnaryOperator { def applyAsInt(x: Int) = x << 1 }).skip(1)
+ val acc = new IntAccumulator
+ temp.allMatch(new jf.IntPredicate{ def test(x: Int) = if (x < 42) { acc += x; true } else false })
+ acc.size.toInt
+ }
+}
+
+object OnString {
+ def expensive(s: String) = { val h = scala.util.hashing.MurmurHash3.stringHash(s); OnInt.expensive(h) }
+
+ def nbr(a: Array[String]): Int = { var s,i = 0; while (i < a.length) { if (a(i).charAt(a(i).length-1) < '5') s += 1; i += 1 }; s }
+ def nbr(t: Traversable[String]): Int = t.count(s => s.charAt(s.length-1) < '5')
+ def nbr(i: Iterator[String]): Int = i.count(s => s.charAt(s.length-1) < '5')
+ def nbr(p: Stepper[String]): Int = p.fold(0)((i,s) => if (s.charAt(s.length-1) < '5') i+1 else i)
+ def nbr(q: Stream[String]): Int = q.filter(new jf.Predicate[String] { def test(s: String) = s.charAt(s.length-1) < '5' }).count.toInt
+ def pnbr(i: ParIterable[String]): Int = i.count(s => s.charAt(s.length-1) < '5')
+ def pnbr(q: Stream[String]): Int = nbr(q)
+
+ def htrg(a: Array[String]): Double = { var s = 0.0; var i = 0; while (i < a.length) { s += expensive(a(i)); i += 1 }; s }
+ def htrg(t: Traversable[String]): Double = t.map(expensive).sum
+ def htrg(i: Iterator[String]): Double = i.map(expensive).sum
+ def htrg(p: Stepper[String]): Double = p.fold(0.0)((x,s) => x + expensive(s))
+ def htrg(q: Stream[String]): Double = q.mapToDouble(new jf.ToDoubleFunction[String]{ def applyAsDouble(s: String) = expensive(s) }).sum
+ def phtrg(i: ParIterable[String]): Double = i.map(expensive).sum
+ def phtrg(q: Stream[String]): Double = htrg(q)
+
+ def fmc(a: Array[String]): Int = {
+ var s, i = 0
+ while (i < a.length) {
+ val x = a(i)
+ if (x.charAt(x.length-1) == '1' && (x.length > 2 || (x.charAt(0) != '-' && x.length > 1))) s += 1
+ i += 1
+ }
+ s
+ }
+ def fmc(t: Traversable[String]): Int =
+ t.filter(x => x.charAt(x.length-1) == '1').map(x => if (x.charAt(0) == '-') x.substring(1) else x).count(_.length > 1)
+ def fmc(i: Iterator[String]): Int =
+ i.filter(x => x.charAt(x.length-1) == '1').map(x => if (x.charAt(0) == '-') x.substring(1) else x).count(_.length > 1)
+ def fmc(q: Stream[String]): Int =
+ q.filter(new jf.Predicate[String]{ def test(x: String) = x.charAt(x.length-1) == '1' }).
+ map[String](new jf.Function[String, String]{ def apply(x: String) = if (x.charAt(0) == '-') x.substring(1) else x }).
+ filter(new jf.Predicate[String]{ def test(x: String) = x.length > 1 }).
+ count.toInt
+ def pfmc(i: ParIterable[String]): Int =
+ i.filter(x => x.charAt(x.length-1) == '1').map(x => if (x.charAt(0) == '-') x.substring(1) else x).count(_.length > 1)
+ def pfmc(q: Stream[String]): Int = fmc(q)
+
+ def mdtc(a: Array[String]): Int = {
+ var i = 1
+ while (i < a.length) {
+ if (a(i).reverse.length >= 3) return i-1
+ i += 1
+ }
+ i-1
+ }
+ def mdtc(t: Traversable[String]): Int = t.map(_.reverse).drop(1).takeWhile(_.length < 3).size
+ def mdtc(i: Iterator[String]): Int = i.map(_.reverse).drop(1).takeWhile(_.length < 3).size
+ def mdtc(q: Stream[String]): Int = {
+ val temp = q.map[String](new jf.UnaryOperator[String] { def apply(x: String) = x.reverse }).skip(1)
+ val acc = new Accumulator[String]
+ temp.allMatch(new jf.Predicate[String]{ def test(x: String) = if (x.length < 3) { acc += x; true } else false })
+ acc.size.toInt
+ }
+}
diff --git a/benchmark/src/main/scala/bench/ParseJmhLog.scala b/benchmark/src/main/scala/bench/ParseJmhLog.scala
new file mode 100644
index 0000000..0263c45
--- /dev/null
+++ b/benchmark/src/main/scala/bench/ParseJmhLog.scala
@@ -0,0 +1,160 @@
+/*
+ * Scala (https://www.scala-lang.org)
+ *
+ * Copyright EPFL and Lightbend, Inc.
+ *
+ * Licensed under Apache License 2.0
+ * (http://www.apache.org/licenses/LICENSE-2.0).
+ *
+ * See the NOTICE file distributed with this work for
+ * additional information regarding copyright ownership.
+ */
+
+package bench.examine
+
+import scala.util._
+import scala.util.control.NonFatal
+
+object ParseJmhLog {
+ // Manual path to the log file (which may have been put there manually)
+ val logLocation = "results/jmhbench.log"
+
+ // Warning--this is maintained manually! Please take care to keep it up to date.
+ val collectionNames = Map(
+ "arb" -> "collection.mutable.ArrayBuffer",
+ "arr" -> "Array",
+ "ars" -> "collection.mutable.ArraySeq",
+ "ast" -> "collection.mutable.ArrayStack",
+ "ils" -> "collection.immutable.ListSet",
+ "ish" -> "collection.immutable.HashSet",
+ "lhs" -> "collection.mutable.LinkedHashSet",
+ "lst" -> "collection.immutable.List",
+ "mhs" -> "collection.mutable.HashSet",
+ "muq" -> "collection.mutable.Queue",
+ "prq" -> "collection.mutable.PriorityQueue",
+ "que" -> "collection.immutable.Queue",
+ "stm" -> "collection.immutable.Stream",
+ "trs" -> "collection.immutable.TreeSet",
+ "vec" -> "collection.immutable.Vector",
+ "wra" -> "collection.mutable.WrappedArray",
+ "jix" -> "java.util.ArrayList",
+ "jln" -> "java.util.LinkedList"
+ )
+
+ // Warning--this is maintained manually! Please take care to keep it up to date.
+ val dataNames = Map(
+ "cI" -> "Int, base collection",
+ "cpI" -> "Int, par collection",
+ "iI" -> "Int, iterator on coll",
+ "ssI" -> "Int, serial stream",
+ "spI" -> "Int, parallel stream",
+ "tpI" -> "Int Stepper (can par)",
+ "tsI" -> "Int Stepper (seq only)",
+ "cS" -> "String, base collection",
+ "cpS" -> "String, par collection",
+ "iS" -> "String, iterator on coll",
+ "ssS" -> "String, serial stream",
+ "spS" -> "String, parallel stream",
+ "tpS" -> "String Stepper (can par)",
+ "tsS" -> "String Stepper (seq only)"
+ )
+ val dataColumnWidth = dataNames.map(_._2).map(_.length).max + 1
+
+ // Warning--this is maintained manually! Please take care to keep it up to date.
+ val operationNames = Map(
+ "sum" -> "fast summation",
+ "psum" -> "fast parallel summation",
+ "nbr" -> "fast sum of lengths",
+ "pnbr" -> "fast parallel sum of lengths",
+ "trig" -> "slow trigonometry",
+ "ptrig" -> "slow parallel trigonometry",
+ "htrg" -> "slow trig on hashCode",
+ "phtrg" -> "slow parallel trig on hashCode",
+ "fmc" -> "filter/map/sum trio",
+ "pfmc" -> "parallel filter/map/sum trio",
+ "mdtc" -> "map/filter/take trio"
+ )
+
+ private def ensure(satisfied: Boolean)(not: => Unit): Unit = {
+ if (!satisfied) {
+ not
+ assert(satisfied)
+ }
+ }
+
+ private def indicate(cols: Int, value: Double): String = {
+ val one = math.min((3*cols)/4, cols-5)
+ val me = math.rint(one*3*value).toInt
+ if (me <= 3*(cols-1)) {
+ val filled =
+ if ((me%3) != 0) "#"*(me/3) + (if ((me%3) == 1) "-" else "=")
+ else "#"*(me/3)
+ filled + " "*(cols - filled.length)
+ }
+ else "#"*(cols-4) + "~~# "
+ }
+
+ case class Entry(op: String, coll: String, big: Boolean, data: String, speed: Double, errbar: Double) {
+ ensure(collectionNames contains coll){ println(coll) }
+ ensure(dataNames contains data){ println(data) }
+ ensure(operationNames contains op){ println(op) }
+ }
+
+ def apply(f: java.io.File = new java.io.File(logLocation)) = {
+ val lines = {
+ val s = scala.io.Source.fromFile(f)
+ try { s.getLines().toVector } finally { s.close }
+ }
+
+ val relevant = lines.
+ dropWhile(x => !(x contains "Run complete.")).
+ dropWhile(x => !(x contains "JmhBench.bench_")).
+ takeWhile(x => x contains "JmhBench.bench_").
+ map{ x =>
+ val ys = x.split("\\s+")
+ ys(1).split('_').drop(1) match {
+ case Array(dat, op, coll, n) => Entry (op, coll, n == "1", dat, ys(4).toDouble, ys(6).toDouble)
+ case _ => throw new Exception("Bad benchmark log line, please investigate manually.")
+ }
+ }.
+ toArray
+
+ val normalized = relevant.
+ groupBy(e => (e.op, e.big, e.data.takeRight(1))).
+ mapValues{ vs =>
+ val one = vs.find(e => e.coll == "arr" && e.data.startsWith("c")).get.speed
+ vs.map(v => v.copy(speed = v.speed/one, errbar = 100 * v.errbar/v.speed)) // Error bar in percent error from mean
+ }.
+ map(_._2).
+ toArray.
+ sortBy(_(0) match { case Entry(o, _, b, d, _, _) => (o, d.takeRight(1), b) }).
+ map(_.sortBy{ case Entry(_, c, _, d, _, _) => (c, d.dropRight(1)) })
+
+ normalized.foreach{ es =>
+ println
+ println(">"*79)
+ println
+ var remaining = es.toList
+ while (remaining.nonEmpty) {
+ val (esa, esb) = remaining.span(_.coll == remaining.head.coll)
+ remaining = esb
+ println(operationNames(esa.head.op))
+ println(if (esa.head.big) "10000 elements" else "10 elements")
+ println(collectionNames(esa.head.coll))
+ esa.foreach{ e =>
+ println(
+ s" %-${dataColumnWidth}s ".format(dataNames(e.data)) +
+ indicate(79 - (dataColumnWidth+3) - 16, e.speed) +
+ "%5.3f +- %5.1f %%".format(e.speed, e.errbar)
+ )
+ }
+ if (remaining.nonEmpty) println
+ }
+ }
+ println
+ println("-"*79)
+ println
+ }
+
+ def main(args: Array[String]): Unit = apply()
+}
diff --git a/build.sbt b/build.sbt
index 0defedc..d6aa6cf 100644
--- a/build.sbt
+++ b/build.sbt
@@ -1,101 +1,152 @@
-import com.typesafe.tools.mima.plugin.{MimaPlugin, MimaKeys}
+val disableDocs =
+ sys.props("nodocs") == "true" ||
+ // on jdk 11 https://github.com/scala/scala-java8-compat/issues/160, seems to fail the build (not on 8)
+ !sys.props("java.version").startsWith("1.")
-scalaModuleSettings
-
-scalaVersion := "2.11.5"
-
-snapshotScalaBinaryVersion := "2.11.5"
-
-organization := "org.scala-lang.modules"
-
-name := "scala-java8-compat"
-
-version := "0.3.0-SNAPSHOT"
-
-// important!! must come here (why?)
-scalaModuleOsgiSettings
-
-OsgiKeys.exportPackage := Seq(s"scala.compat.java8.*;version=${version.value}")
-
-OsgiKeys.privatePackage := List("scala.concurrent.java8.*")
-
-libraryDependencies += "junit" % "junit" % "4.11" % "test"
-
-libraryDependencies += "com.novocode" % "junit-interface" % "0.10" % "test"
-
-MimaPlugin.mimaDefaultSettings
-
-MimaKeys.previousArtifact := None
-
-// run mima during tests
-test in Test := {
- MimaKeys.reportBinaryIssues.value
- (test in Test).value
-}
-
-testOptions += Tests.Argument(TestFrameworks.JUnit, "-v", "-a")
-
-sourceGenerators in Compile <+= sourceManaged in Compile map { dir =>
- def write(name: String, content: String) = {
- val f = dir / "scala" / "compat" / "java8" / s"${name}.java"
- IO.write(f, content)
- f
- }
- (
- Seq(write("JFunction", CodeGen.factory)) ++
- (0 to 22).map(n => write("JFunction" + n, CodeGen.fN(n))) ++
- (0 to 22).map(n => write("JProcedure" + n, CodeGen.pN(n))) ++
- CodeGen.specializedF0.map((write _).tupled) ++
- CodeGen.specializedF1.map((write _).tupled) ++
- CodeGen.specializedF2.map((write _).tupled)
- )
-}
+lazy val JavaDoc = config("genjavadoc") extend Compile
-sourceGenerators in Test <+= sourceManaged in Test map { dir =>
- def write(name: String, content: String) = {
- val f = dir / "scala" / "compat" / "java8" / s"${name}.java"
- IO.write(f, content)
- f
- }
- Seq(write("TestApi", CodeGen.testApi))
+def jwrite(dir: java.io.File, pck: String = "scala/compat/java8")(name: String, content: String) = {
+ val f = dir / pck / s"${name}.java"
+ IO.write(f, content)
+ f
}
-initialize := {
- // Run previously configured inialization...
- initialize.value
- // ... and then check the Java version.
- val specVersion = sys.props("java.specification.version")
- if (Set("1.5", "1.6", "1.7") contains specVersion)
- sys.error("Java 8 or higher is required for this project.")
+def osgiExport(scalaVersion: String, version: String) = {
+ (CrossVersion.partialVersion(scalaVersion) match {
+ case Some((2, 11)) => Seq(s"scala.runtime.java8.*;version=${version}")
+ case _ => Nil
+ }) ++ Seq(s"scala.compat.java8.*;version=${version}")
}
-val disableDocs = sys.props("nodocs") == "true"
-
-publishArtifact in packageDoc := !disableDocs
-
-lazy val JavaDoc = config("genjavadoc") extend Compile
-
-sources in (Compile, doc) := {
- val orig = (sources in (Compile, doc)).value
- orig.filterNot(_.getName.endsWith(".java")) // raw types not cooked by scaladoc: https://issues.scala-lang.org/browse/SI-8449
-}
-
-inConfig(JavaDoc)(Defaults.configSettings) ++ (if (disableDocs) Nil else Seq(
- packageDoc in Compile <<= packageDoc in JavaDoc,
- sources in JavaDoc <<= (target, compile in Compile, sources in Compile) map {(t, c, s) =>
- val allJavaSources = (t / "java" ** "*.java").get ++ s.filter(_.getName.endsWith(".java"))
- allJavaSources.filterNot(_.getName.contains("FuturesConvertersImpl.java")) // this file triggers bugs in genjavadoc
+lazy val commonSettings = Seq(
+ crossScalaVersions := Seq("2.13.16", "2.12.20", "2.11.12", "3.3.6"),
+ scalaVersion := crossScalaVersions.value.head,
+ // we could make this stricter again (BinaryAndSourceCompatible)
+ // after our reference version was built on Scala 3.1.x
+ versionPolicyIntention := Compatibility.BinaryCompatible,
+ Compile / unmanagedSourceDirectories ++= {
+ (Compile / unmanagedSourceDirectories).value.flatMap { dir =>
+ CrossVersion.partialVersion(scalaVersion.value) match {
+ case Some((2, 11)) => Seq(file(dir.getPath ++ "-2.13-"), file(dir.getPath ++ "-2.11"))
+ case Some((2, 12)) => Seq(file(dir.getPath ++ "-2.13-"))
+ case _ => Seq(file(dir.getPath ++ "-2.13+"))
+ }
+ }
},
- javacOptions in JavaDoc := Seq(),
- artifactName in packageDoc in JavaDoc := ((sv, mod, art) => "" + mod.name + "_" + sv.binary + "-" + mod.revision + "-javadoc.jar"),
- libraryDependencies += compilerPlugin("com.typesafe.genjavadoc" % "genjavadoc-plugin" % "0.8" cross CrossVersion.full),
- scalacOptions in Compile <+= target map (t => "-P:genjavadoc:out=" + (t / "java"))
-))
-
-initialCommands :=
-"""|import scala.concurrent._
- |import ExecutionContext.Implicits.global
- |import java.util.concurrent.{CompletionStage,CompletableFuture}
- |import scala.compat.java8.FutureConverter._
- |""".stripMargin
-
+ Test / unmanagedSourceDirectories ++= {
+ (Test / unmanagedSourceDirectories).value.flatMap { dir =>
+ CrossVersion.partialVersion(scalaVersion.value) match {
+ case Some((2, 11)) => Seq(file(dir.getPath ++ "-2.13-"), file(dir.getPath ++ "-2.11"))
+ case Some((2, 12)) => Seq(file(dir.getPath ++ "-2.13-"))
+ case _ => Seq(file(dir.getPath ++ "-2.13+"))
+ }
+ }
+ },
+)
+
+lazy val scalaJava8Compat = (project in file("."))
+ .settings(ScalaModulePlugin.scalaModuleSettings)
+ .enablePlugins(SbtOsgi)
+ .settings(ScalaModulePlugin.scalaModuleOsgiSettings)
+ .settings(commonSettings)
+ .settings(
+ name := "scala-java8-compat",
+ scalaModuleAutomaticModuleName := Some("scala.compat.java8"),
+ )
+ .settings(
+ OsgiKeys.exportPackage := osgiExport(scalaVersion.value, version.value),
+
+ OsgiKeys.privatePackage := List("scala.concurrent.java8.*"),
+
+ libraryDependencies += "junit" % "junit" % "4.13.2" % "test",
+
+ libraryDependencies += "org.apache.commons" % "commons-lang3" % "3.12.0" % "test",
+
+ libraryDependencies += "com.github.sbt" % "junit-interface" % "0.13.3" % "test",
+
+ // see https://github.com/scala/scala-java8-compat/issues/247
+ versionPolicyPreviousVersions := versionPolicyPreviousVersions.value.flatMap {
+ case VersionNumber(Seq(0, _*), _, _) => Nil
+ case VersionNumber(Seq(1, 0, n, _*), _, _) if n <= 1 => Nil
+ case v => Seq(v)
+ },
+
+ // shouldn't be needed anymore after our reference version is a version
+ // built on Scala 3.1.x
+ mimaBinaryIssueFilters := {
+ import com.typesafe.tools.mima.core.ProblemFilters._
+ import com.typesafe.tools.mima.core._
+ Seq(
+ exclude[IncompatibleSignatureProblem]("scala.compat.java8.*"),
+ exclude[IncompatibleSignatureProblem]("scala.concurrent.java8.*"),
+ ),
+ },
+
+ testOptions += Tests.Argument(TestFrameworks.JUnit, "-v", "-a"),
+
+ (Compile / sourceGenerators) += Def.task {
+ val f = (Compile / sourceManaged).value / "FunctionConverters.scala"
+ IO.write(f, WrapFnGen.code)
+ Seq(f)
+ }.taskValue,
+
+ Compile / sourceGenerators += Def.task {
+ val dir = (Compile / sourceManaged).value
+ val write = jwrite(dir) _
+ if(scalaVersion.value.startsWith("2.11.")) {
+ Seq(write("JFunction", CodeGen.factory)) ++
+ (0 to 22).map(n => write("JFunction" + n, CodeGen.fN(n))) ++
+ (0 to 22).map(n => write("JProcedure" + n, CodeGen.pN(n))) ++
+ CodeGen.specializedF0.map(write.tupled) ++
+ CodeGen.specializedF1.map(write.tupled) ++
+ CodeGen.specializedF2.map(write.tupled) ++
+ CodeGen.packageDummy.map((jwrite(dir, "java/runtime/java8") _).tupled)
+ } else CodeGen.create212.map(write.tupled)
+ }.taskValue,
+
+ Test / sourceGenerators += Def.task {
+ Seq(jwrite((Test / sourceManaged).value)("TestApi", CodeGen.testApi))
+ }.taskValue,
+
+ initialize := {
+ // Run previously configured inialization...
+ val _ = initialize.value
+ // ... and then check the Java version.
+ val specVersion = sys.props("java.specification.version")
+ if (Set("1.5", "1.6", "1.7") contains specVersion)
+ sys.error("Java 8 or higher is required for this project.")
+ },
+ )
+ .settings(
+ inConfig(JavaDoc)(Defaults.configSettings) ++ {
+ if (disableDocs) Nil
+ else Seq(
+ Compile / packageDoc := (JavaDoc / packageDoc).value,
+ JavaDoc / sources := {
+ val allJavaSources =
+ (target.value / "java" ** "*.java").get ++
+ (Compile / sources).value.filter(_.getName.endsWith(".java"))
+ allJavaSources.filterNot(_.getName.contains("FuturesConvertersImpl.java")) // this file triggers bugs in genjavadoc
+ },
+ JavaDoc / javacOptions := Seq("-Xdoclint:none"),
+ JavaDoc / packageDoc / artifactName := ((sv, mod, art) => "" + mod.name + "_" + sv.binary + "-" + mod.revision + "-javadoc.jar"),
+ libraryDependencies ++= (CrossVersion.partialVersion(scalaVersion.value) match {
+ case Some((3, _)) => Seq()
+ case Some((2, 11)) => Seq(compilerPlugin("com.typesafe.genjavadoc" % "genjavadoc-plugin" % "0.18" cross CrossVersion.full))
+ case _ => Seq(compilerPlugin("com.typesafe.genjavadoc" % "genjavadoc-plugin" % "0.19" cross CrossVersion.full))
+ }),
+ Compile / scalacOptions ++= (CrossVersion.partialVersion(scalaVersion.value) match {
+ case Some((3, _)) => Seq()
+ case _ => Seq(s"""-P:genjavadoc:out=${target.value / "java"}""")
+ }),
+ )
+ }
+ )
+ .settings(
+ initialCommands :=
+ """|import scala.concurrent._
+ |import ExecutionContext.Implicits.global
+ |import java.util.concurrent.{CompletionStage,CompletableFuture}
+ |import scala.compat.java8.FutureConverters._
+ |""".stripMargin
+ )
diff --git a/project/CodeGen.scala b/project/CodeGen.scala
index 0e0234c..bb3a37e 100644
--- a/project/CodeGen.scala
+++ b/project/CodeGen.scala
@@ -1,5 +1,13 @@
/*
- * Copyright (C) 2012-2014 Typesafe Inc.
+ * Scala (https://www.scala-lang.org)
+ *
+ * Copyright EPFL and Lightbend, Inc.
+ *
+ * Licensed under Apache License 2.0
+ * (http://www.apache.org/licenses/LICENSE-2.0).
+ *
+ * See the NOTICE file distributed with this work for
+ * additional information regarding copyright ownership.
*/
sealed abstract class Type(val code: Char, val prim: String, val ref: String) {
@@ -40,7 +48,7 @@ object CodeGen {
|$packaging
|
|@FunctionalInterface
- |public interface JFunction0 extends scala.Function0 {
+ |public interface JFunction0 extends scala.Function0, java.io.Serializable {
| default void $initName() {
| };
|""".stripMargin
@@ -51,7 +59,7 @@ object CodeGen {
|$packaging
|
|@FunctionalInterface
- |public interface JFunction1 extends scala.Function1 {
+ |public interface JFunction1 extends scala.Function1, java.io.Serializable {
| default void $initName() {
| };
|
@@ -77,7 +85,7 @@ object CodeGen {
|$packaging
|
|@FunctionalInterface
- |public interface JFunction$n<$tparams, R> extends scala.Function$n<$tparams, R> {
+ |public interface JFunction$n<$tparams, R> extends scala.Function$n<$tparams, R>, java.io.Serializable {
| default void $initName() {
| };
|
@@ -288,7 +296,7 @@ object CodeGen {
private val copyright =
"""
|/*
- | * Copyright (C) 2012-2015 Typesafe Inc.
+ | * Copyright (C) Lightbend Inc.
| */""".stripMargin.trim
private def function0SpecMethods = {
@@ -331,26 +339,9 @@ object CodeGen {
|}
|""".stripMargin.trim
}
- // andThen / compose variants are no longer needed under 2.11 (@unspecialized has been fixed),
- // but harmless. With them, we can use the same artifact for 2.10 and 2.11
- val compose = specialized("compose", function1Spec) {
- case (name, List(t1, r1)) =>
- s"""
- |default scala.Function1 $name(scala.Function1 g) {
- | return compose(g);
- |}""".stripMargin.trim
- }
- val andThen = specialized("andThen", function1Spec) {
- case (name, List(t1, r1)) =>
- s"""
- |default scala.Function1 $name(scala.Function1 g) {
- | return andThen(g);
- |}""".stripMargin.trim
- }
- indent(List(apply, compose, andThen).mkString("\n\n"))
+ indent(List(apply).mkString("\n\n"))
}
- // No longer needed under 2.11 (@unspecialized has been fixed), but harmless to keep around to avoid cross-publishing this artifact.
private def function2SpecMethods = {
val apply = specialized("apply", function2Spec) {
case (name, List(t1, t2, r)) =>
@@ -363,21 +354,7 @@ object CodeGen {
|}
|""".stripMargin.trim
}
- val curried = specialized("curried", function2Spec) {
- case (name, List(t1, t2, r)) =>
- s"""
- |default scala.Function1 $name() {
- | return curried();
- |}""".stripMargin.trim
- }
- val tupled = specialized("tupled", function2Spec) {
- case (name, List(t1, t2, r)) =>
- s"""
- |default scala.Function1 $name() {
- | return tupled();
- |}""".stripMargin.trim
- }
- indent(List(apply, curried, tupled).mkString("\n\n"))
+ indent(List(apply).mkString("\n\n"))
}
def specializedSuffix(tparamNames: List[String], tps: List[Type]): String = {
@@ -464,4 +441,101 @@ object CodeGen {
}
def indent(s: String) = s.linesIterator.map(" " + _).mkString("\n")
+
+ /** Create a dummy class to put into scala.runtime.java8 for Scala 2.11 so that wildcard imports from the
+ * package won't fail. This allows importing both `scala.runtime.java8.*` and `scala.compat.java8.*` for
+ * source compatibility between 2.11 and 2.12.
+ */
+ def packageDummy: Seq[(String, String)] = Seq(
+ ( "PackageDummy",
+ s"""$copyright
+ |
+ |package scala.runtime.java8;
+ |
+ |public final class PackageDummy {
+ | private PackageDummy() {}
+ |}
+ """.stripMargin)
+ )
+
+ /** Create the simpler JFunction and JProcedure sources for Scala 2.12+ */
+ def create212: Seq[(String, String)] = {
+ val blocks = for(i <- 0 to 22) yield {
+ val ts = (1 to i).map(i => s"T$i").mkString(", ")
+ val tsComma = if(ts.isEmpty) "" else s"$ts,"
+ val tsAngled = if(ts.isEmpty) "" else s"<$ts>"
+ val paramTs = (1 to i).map(i => s"T$i t$i").mkString(", ")
+ val argTs = (1 to i).map(i => s"t$i").mkString(", ")
+
+ (
+ ( s"JFunction$i",
+ s"""$copyright
+ |$packaging
+ |
+ |/** @deprecated Use scala.Function$i in Scala 2.12 */
+ |@Deprecated
+ |@FunctionalInterface
+ |public interface JFunction$i<$tsComma R> extends scala.Function$i<$tsComma R>, java.io.Serializable {}
+ """.stripMargin),
+ ( s"JProcedure$i",
+ s"""$copyright
+ |$packaging
+ |
+ |import scala.runtime.BoxedUnit;
+ |
+ |@FunctionalInterface
+ |public interface JProcedure$i$tsAngled extends scala.Function$i<$tsComma BoxedUnit> {
+ | void applyVoid($paramTs);
+ | default BoxedUnit apply($paramTs) { applyVoid($argTs); return BoxedUnit.UNIT; }
+ |}
+ """.stripMargin),
+ s""" /** @deprecated Not needed anymore in Scala 2.12 */
+ | @Deprecated
+ | public static <$tsComma R> scala.Function$i<$tsComma R> func(scala.Function$i<$tsComma R> f) { return f; }
+ | public static $tsAngled scala.Function$i<$tsComma BoxedUnit> proc(JProcedure$i$tsAngled p) { return p; }
+ """.stripMargin
+ )
+ }
+
+ def specialize(args: String): List[(Int, String, String)] = {
+ def combinations(l: List[String]): List[List[Char]] =
+ l.foldRight(List(Nil: List[Char])) { (s, z) => s.toList.flatMap(c => z.map(c :: _)) }
+ val split = args.split(",")
+ combinations(split.toList).map { s =>
+ val types = s.map {
+ case 'B' => "Byte"
+ case 'S' => "Short"
+ case 'V' => "BoxedUnit"
+ case 'I' => "Integer"
+ case 'J' => "Long"
+ case 'C' => "Character"
+ case 'F' => "Float"
+ case 'D' => "Double"
+ case 'Z' => "Boolean"
+ }
+ (split.length-1, (types.tail :+ types.head).mkString(", "), "$mc" + s.mkString + "$sp")
+ }
+ }
+
+ val specialized =
+ List("V", "V,IJFD", "V,IJD,IJD").flatMap(specialize).map { case (i, a, sp) =>
+ s" public static scala.Function$i<$a> procSpecialized(JFunction$i$sp f) { return (scala.Function$i<$a>)(Object)f; }" } ++
+ List("BSIJCFDZ", "ZIFJD,IJFD", "ZIFJD,IJD,IJD").flatMap(specialize).map { case (i, a, sp) =>
+ s" public static scala.Function$i<$a> funcSpecialized(JFunction$i$sp f) { return (scala.Function$i<$a>)(Object)f; }" }
+
+ (blocks.map(_._1) ++ blocks.map(_._2)) :+
+ ( "JFunction",
+ s"""$copyright
+ |$packaging
+ |
+ |import scala.runtime.BoxedUnit;
+ |import scala.runtime.java8.*;
+ |
+ |public final class JFunction {
+ | private JFunction() {}
+ |${specialized.mkString("\n")}
+ |${blocks.map(_._3).mkString("\n")}
+ |}
+ """.stripMargin)
+ }
}
diff --git a/project/WrapFnGen.scala b/project/WrapFnGen.scala
new file mode 100644
index 0000000..eaf4482
--- /dev/null
+++ b/project/WrapFnGen.scala
@@ -0,0 +1,236 @@
+/*
+ * Scala (https://www.scala-lang.org)
+ *
+ * Copyright EPFL and Lightbend, Inc.
+ *
+ * Licensed under Apache License 2.0
+ * (http://www.apache.org/licenses/LICENSE-2.0).
+ *
+ * See the NOTICE file distributed with this work for
+ * additional information regarding copyright ownership.
+ */
+
+import scala.collection.mutable
+
+object WrapFnGen {
+ /** all 43 interfaces in java.util.function package */
+ private lazy val allJfn = Seq(
+ "BiConsumer[T, U]: accept(T, U): Unit",
+ "BiFunction[T, U, R]: apply(T, U): R",
+ "BiPredicate[T, U]: test(T, U): Boolean",
+ "BinaryOperator[T]: apply(T, T): T",
+ "BooleanSupplier: getAsBoolean: Boolean",
+ "Consumer[T]: accept(T): Unit",
+ "DoubleBinaryOperator: applyAsDouble(Double, Double): Double",
+ "DoubleConsumer: accept(Double): Unit",
+ "DoubleFunction[R]: apply(Double): R",
+ "DoublePredicate: test(Double): Boolean",
+ "DoubleSupplier: getAsDouble: Double",
+ "DoubleToIntFunction: applyAsInt(Double): Int",
+ "DoubleToLongFunction: applyAsLong(Double): Long",
+ "DoubleUnaryOperator: applyAsDouble(Double): Double",
+ "Function[T, R]: apply(T): R",
+ "IntBinaryOperator: applyAsInt(Int, Int): Int",
+ "IntConsumer: accept(Int): Unit",
+ "IntFunction[R]: apply(Int): R",
+ "IntPredicate: test(Int): Boolean",
+ "IntSupplier: getAsInt: Int",
+ "IntToDoubleFunction: applyAsDouble(Int): Double",
+ "IntToLongFunction: applyAsLong(Int): Long",
+ "IntUnaryOperator: applyAsInt(Int): Int",
+ "LongBinaryOperator: applyAsLong(Long, Long): Long",
+ "LongConsumer: accept(Long): Unit",
+ "LongFunction[R]: apply(Long): R",
+ "LongPredicate: test(Long): Boolean",
+ "LongSupplier: getAsLong: Long",
+ "LongToDoubleFunction: applyAsDouble(Long): Double",
+ "LongToIntFunction: applyAsInt(Long): Int",
+ "LongUnaryOperator: applyAsLong(Long): Long",
+ "ObjDoubleConsumer[T]: accept(T, Double): Unit",
+ "ObjIntConsumer[T]: accept(T, Int): Unit",
+ "ObjLongConsumer[T]: accept(T, Long): Unit",
+ "Predicate[T]: test(T): Boolean",
+ "Supplier[T]: get: T",
+ "ToDoubleBiFunction[T, U]: applyAsDouble(T, U): Double",
+ "ToDoubleFunction[T]: applyAsDouble(T): Double",
+ "ToIntBiFunction[T, U]: applyAsInt(T, U): Int",
+ "ToIntFunction[T]: applyAsInt(T): Int",
+ "ToLongBiFunction[T, U]: applyAsLong(T, U): Long",
+ "ToLongFunction[T]: applyAsLong(T): Long",
+ "UnaryOperator[T]: apply(T): T",
+ ).map(Jfn.apply)
+
+ /** @param sig - ex: "BiConsumer[T,U]: accept(T,U): Unit"
+ * or "DoubleToIntFunction: applyAsInt(Double): Int" */
+ case class Jfn(sig: String) {
+ val Array(
+ iface, // interface name included type args, ex: BiConsumer[T,U] | DoubleToIntFunction
+ _method, // Temp val, ex: accept(T,U) | applyAsInt(Double)
+ rType // java function return type, ex: Unit | Int
+ ) = sig.split(':').map(_.trim)
+
+ // interface name and java interface's type args,
+ // ex: ("BiConsumer", "[T,U]") | ("DoubleToIntFunction", "")
+ val (ifaceName, jtargs) = iface.span(_ != '[')
+
+ // java method name and temp val, ex: "accept" -> "(T,U)" | "applyAsInt" -> "(Double)"
+ val (jmethod, _targs) = _method.span(_ != '(')
+
+ // java method's type args, ex: Seq("T", "U") | Seq("Double")
+ val pTypes: Seq[String] = _targs.unwrapMe
+
+ // arguments names, ex: Seq("x1", "x2")
+ val args: Seq[String] = pTypes.indices.map { i => "x" + (i+1) }
+ // ex: "(x1: T, x2: U)" | "(x1: Double)"
+ val argsDecl: String = args.zip(pTypes).map {
+ // Don't really need this case. Only here so the generated code is
+ // exactly == the code gen by the old method using scala-compiler + scala-reflect
+ case (p, t @ ("Double"|"Long"|"Int")) => s"$p: scala.$t"
+ case (p, t) => s"$p: $t"
+ }.mkString("(", ", ", ")")
+ // ex: "(x1, x2)"
+ val argsCall: String = args.mkString("(", ", ", ")")
+
+ // arity of scala.Function
+ val arity: Int = args.length
+
+ // ex: "java.util.function.BiConsumer[T,U]" | "java.util.function.DoubleToIntFunction"
+ val javaFn = s"java.util.function.$iface"
+
+ // ex: "scala.Function2[T, U, Unit]" | "scala.Function1[Double, Int]"
+ val scalaFn = s"scala.Function$arity[${(pTypes :+ rType).mkString(", ")}]"
+
+ def fromJavaCls: String =
+ s"""class FromJava$iface(jf: $javaFn) extends $scalaFn {
+ | def apply$argsDecl = jf.$jmethod$argsCall
+ |}""".stripMargin
+
+ val richAsFnClsName = s"Rich${ifaceName}AsFunction$arity$jtargs"
+ def richAsFnCls: String =
+ s"""class $richAsFnClsName(private val underlying: $javaFn) extends AnyVal {
+ | @inline def asScala: $scalaFn = new FromJava$iface(underlying)
+ |}""".stripMargin
+
+ def asJavaCls: String =
+ s"""class AsJava$iface(sf: $scalaFn) extends $javaFn {
+ | def $jmethod$argsDecl = sf.apply$argsCall
+ |}""".stripMargin
+
+ val richFnAsClsName = s"RichFunction${arity}As$iface"
+ def richFnAsCls: String =
+ s"""class $richFnAsClsName(private val underlying: $scalaFn) extends AnyVal {
+ | @inline def asJava: $javaFn = new AsJava$iface(underlying)
+ |}""".stripMargin
+
+ def converterImpls: String =
+ s"""$fromJavaCls\n
+ |$richAsFnCls\n
+ |$asJavaCls\n
+ |$richFnAsCls\n
+ |""".stripMargin
+
+ /** @return "implicit def enrichAsJavaXX.." code */
+ def enrichAsJavaDef: String = {
+ // This is especially tricky because functions are contravariant in their arguments
+ // Need to prevent e.g. Any => String from "downcasting" itself to Int => String; we want the more exact conversion
+ // Instead of foo[A](f: (Int, A) => Long): Fuu[A] = new Foo[A](f)
+ // we want foo[X, A](f: (X, A) => Long)(implicit evX: Int =:= X): Fuu[A] = new Foo[A](f.asInstanceOf[(Int, A) => Long])
+ // Instead of bar[A](f: A => A): Brr[A] = new Foo[A](f)
+ // we want bar[A, B](f: A => B)(implicit evB: A =:= B): Brr[A] = new Foo[A](f.asInstanceOf[A => B])
+
+ val finalTypes = Set("Double", "Long", "Int", "Boolean", "Unit")
+ val An = "A(\\d+)".r
+ val numberedA = mutable.Set.empty[Int]
+ val evidences = mutable.ArrayBuffer.empty[(String, String)] // ex: "A0" -> "Double"
+ numberedA ++= pTypes.collect{ case An(digits) if (digits.length < 10) => digits.toInt }
+ val scalafnTnames = (pTypes :+ rType).zipWithIndex.map {
+ case (pt, i) if i < pTypes.length && finalTypes(pt) || !finalTypes(pt) && pTypes.take(i).contains(pt) =>
+ val j = Iterator.from(i).dropWhile(numberedA).next()
+ val genericName = s"A$j"
+ numberedA += j
+ evidences += (genericName -> pt)
+ genericName
+ case (pt, _) => pt
+ }
+ val scalafnTdefs = scalafnTnames.dropRight(if (finalTypes(rType)) 1 else 0).wrapMe()
+ val scalaFnGeneric = s"scala.Function${scalafnTnames.length - 1}[${scalafnTnames.mkString(", ")}]"
+ val evs = evidences
+ .map { case (generic, specific) => s"ev$generic: =:=[$generic, $specific]" }
+ .wrapMe("(implicit ", ")")
+ val sf = if (evs.isEmpty) "sf" else s"sf.asInstanceOf[$scalaFn]"
+ s"@inline implicit def enrichAsJava$ifaceName$scalafnTdefs(sf: $scalaFnGeneric)$evs: $richFnAsClsName = new $richFnAsClsName($sf)"
+ }
+
+ def asScalaFromDef = s"@inline def asScalaFrom$iface(jf: $javaFn): $scalaFn = new FromJava$iface(jf)"
+
+ def asJavaDef = s"@inline def asJava$iface(sf: $scalaFn): $javaFn = new AsJava$iface(sf)"
+
+ def enrichAsScalaDef = s"@inline implicit def enrichAsScalaFrom$iface(jf: $javaFn): $richAsFnClsName = new $richAsFnClsName(jf)"
+ }
+
+ def converters: String = {
+ val groups = allJfn
+ .map(jfn => jfn.jtargs.unwrapMe.length -> jfn.enrichAsJavaDef)
+ .groupBy(_._1)
+ .toSeq
+ .sortBy(_._1)
+ .reverse
+ val maxPriority = groups.head._1
+ groups.map { case (priority, seq) =>
+ val parent =
+ if (priority == maxPriority) ""
+ else s" extends Priority${priority + 1}FunctionConverters"
+ val me =
+ if (priority == 0) "package object FunctionConverters"
+ else s"trait Priority${priority}FunctionConverters"
+
+ val enrichAsJava = seq.map(_._2)
+ val (asXx, enrichAsScala) =
+ if (priority != 0) Nil -> Nil
+ else allJfn.map { jfn => jfn.asScalaFromDef + "\n\n" + jfn.asJavaDef } ->
+ allJfn.map(_.enrichAsScalaDef)
+
+ s"""$me$parent {
+ | import functionConverterImpls._
+ |${asXx.mkString("\n\n\n").indentMe}
+ |${enrichAsJava.mkString("\n\n").indentMe}
+ |${enrichAsScala.mkString("\n\n").indentMe}
+ |}""".stripMargin
+ }.mkString("\n\n\n")
+ }
+
+ def code: String =
+ s"""
+ |/*
+ | * Copyright EPFL and Lightbend, Inc.
+ | * This file auto-generated by WrapFnGen.scala. Do not modify directly.
+ | */
+ |
+ |package scala.compat.java8
+ |
+ |import language.implicitConversions
+ |
+ |package functionConverterImpls {
+ |${allJfn.map(_.converterImpls).mkString("\n").indentMe}
+ |}
+ |\n
+ |$converters
+ |""".stripMargin
+
+ implicit class StringExt(private val s: String) extends AnyVal {
+ def indentMe: String = s.linesIterator.map(" " + _).mkString("\n")
+ def unwrapMe: Seq[String] = s match {
+ case "" => Nil
+ case _ => s
+ .substring(1, s.length - 1) // drop "(" and ")" or "[" and "]"
+ .split(',').map(_.trim).toSeq
+ }
+ }
+
+ implicit class WrapMe(private val s: Seq[String]) extends AnyVal {
+ def wrapMe(start: String = "[", end: String = "]"): String = s match {
+ case Nil => ""
+ case _ => s.mkString(start, ", ", end)
+ }
+ }
+}
diff --git a/project/build.properties b/project/build.properties
index 748703f..c02c575 100644
--- a/project/build.properties
+++ b/project/build.properties
@@ -1 +1 @@
-sbt.version=0.13.7
+sbt.version=1.11.3
diff --git a/project/plugins.sbt b/project/plugins.sbt
index 5f604e6..983950c 100644
--- a/project/plugins.sbt
+++ b/project/plugins.sbt
@@ -1,3 +1 @@
-addSbtPlugin("org.scala-lang.modules" % "scala-module-plugin" % "1.0.2")
-
-addSbtPlugin("com.typesafe" % "sbt-mima-plugin" % "0.1.6")
+addSbtPlugin("org.scala-lang.modules" % "sbt-scala-module" % "3.3.0")
diff --git a/src/main/java-2.13+/scala/compat/java8/ScalaStreamSupport.java b/src/main/java-2.13+/scala/compat/java8/ScalaStreamSupport.java
new file mode 100644
index 0000000..2071d18
--- /dev/null
+++ b/src/main/java-2.13+/scala/compat/java8/ScalaStreamSupport.java
@@ -0,0 +1,384 @@
+/*
+ * Scala (https://www.scala-lang.org)
+ *
+ * Copyright EPFL and Lightbend, Inc. dba Akka
+ *
+ * Licensed under Apache License 2.0
+ * (http://www.apache.org/licenses/LICENSE-2.0).
+ *
+ * See the NOTICE file distributed with this work for
+ * additional information regarding copyright ownership.
+ */
+
+package scala.compat.java8;
+
+import java.util.stream.*;
+
+import scala.collection.*;
+import scala.jdk.javaapi.StreamConverters;
+
+/**
+ * This class contains static utility methods for creating Java Streams from Scala Collections, similar
+ * to the methods in {@code java.util.stream.StreamSupport} for other Java types. It is intended for
+ * use from Java code. In Scala code, you can use the extension methods provided by
+ * {@code scala.compat.java8.StreamConverters} instead.
+ *
+ * Streams created from immutable Scala collections are also immutable. Mutable collections should
+ * not be modified concurrently. There are no guarantees for success or failure modes of existing
+ * streams in case of concurrent modifications.
+ */
+public class ScalaStreamSupport {
+ /////////////////////
+ // Generic Streams //
+ /////////////////////
+
+ /**
+ * Generates a Stream that traverses a Scala collection.
+ *
+ * Parallel processing is only efficient for collections that have a Stepper implementation
+ * which supports efficient splitting. For collections where this is the case, the stepper
+ * method has a return type marked with EfficientSplit.
+ *
+ * @param coll The IterableOnce to traverse
+ * @return A Stream view of the collection which, by default, executes sequentially.
+ */
+ public static Stream stream(IterableOnce coll) {
+ return StreamConverters.asJavaSeqStream(coll);
+ }
+
+ /**
+ * Generates a Stream that traverses the keys of a scala.collection.Map.
+ *
+ * Parallel processing is only efficient for Maps that have a keyStepper implementation
+ * which supports efficient splitting. For collections where this is the case, the keyStepper
+ * method has a return type marked with EfficientSplit.
+ *
+ * @param coll The Map to traverse
+ * @return A Stream view of the collection which, by default, executes sequentially.
+ */
+ public static Stream streamKeys(Map coll) {
+ return StreamSupport.stream(coll.keyStepper(StepperShape.anyStepperShape()).spliterator(), false);
+ }
+
+ /**
+ * Generates a Stream that traverses the values of a scala.collection.Map.
+ *
+ * Parallel processing is only efficient for Maps that have a valueStepper implementation
+ * which supports efficient splitting. For collections where this is the case, the valueStepper
+ * method has a return type marked with EfficientSplit.
+ *
+ * @param coll The Map to traverse
+ * @return A Stream view of the collection which, by default, executes sequentially.
+ */
+ public static Stream streamValues(Map, V> coll) {
+ return StreamSupport.stream(coll.>valueStepper(StepperShape.anyStepperShape()).spliterator(), false);
+ }
+
+ /**
+ * Generates a Stream that traverses the key-value pairs of a scala.collection.Map.
+ *
+ * Parallel processing is only efficient for collections that have a Stepper implementation
+ * which supports efficient splitting. For collections where this is the case, the stepper
+ * method has a return type marked with EfficientSplit.
+ *
+ * @param coll The Map to traverse
+ * @return A Stream view of the collection which, by default, executes sequentially.
+ */
+ public static Stream< scala.Tuple2 > stream(Map coll) {
+ return StreamConverters.asJavaSeqStream(coll);
+ }
+
+ /**
+ * Generates a Stream that traverses any Scala collection by accumulating its entries
+ * into a buffer class (Accumulator).
+ *
+ * Both sequential and parallel operations will be efficient.
+ *
+ * @param coll The collection to traverse
+ * @return A Stream view of the collection which, by default, executes sequentially.
+ */
+ public static Stream streamAccumulated(IterableOnce coll) {
+ return StreamConverters.asJavaSeqStream(scala.jdk.AnyAccumulator.from(coll));
+ }
+
+ /**
+ * Generates a Stream that traverses the keys of any Scala map by
+ * accumulating those keys into a buffer class (Accumulator).
+ *
+ * Both sequential and parallel operations will be efficient.
+ *
+ * @param coll The map containing keys to traverse
+ * @return A Stream view of the collection which, by default, executes sequentially.
+ */
+ public static Stream streamAccumulatedKeys(Map coll) {
+ return StreamConverters.asJavaSeqStream(scala.jdk.AnyAccumulator.from(coll.keysIterator()));
+ }
+
+ /**
+ * Generates a Stream that traverses the values of any Scala map by
+ * accumulating those values into a buffer class (Accumulator).
+ *
+ * Both sequential and parallel operations will be efficient.
+ *
+ * @param coll The map containing values to traverse
+ * @return A Stream view of the collection which, by default, executes sequentially.
+ */
+ public static Stream streamAccumulatedValues(Map, V> coll) {
+ return StreamConverters.asJavaSeqStream(scala.jdk.AnyAccumulator.from(coll.valuesIterator()));
+ }
+
+ ////////////////////
+ // Double Streams //
+ ////////////////////
+
+ /**
+ * Generates a DoubleStream that traverses a Scala collection.
+ *
+ * Parallel processing is only efficient for collections that have a Stepper implementation
+ * which supports efficient splitting. For collections where this is the case, the stepper
+ * method has a return type marked with EfficientSplit.
+ *
+ * @param coll The IterableOnce to traverse
+ * @return A DoubleStream view of the collection which, by default, executes sequentially.
+ */
+ public static DoubleStream doubleStream(IterableOnce coll) {
+ return StreamConverters.asJavaSeqDoubleStream(coll);
+ }
+
+ /**
+ * Generates a DoubleStream that traverses the keys of a scala.collection.Map.
+ *
+ * Parallel processing is only efficient for Maps that have a keyStepper implementation
+ * which supports efficient splitting. For collections where this is the case, the keyStepper
+ * method has a return type marked with EfficientSplit.
+ *
+ * @param coll The Map to traverse
+ * @return A DoubleStream view of the collection which, by default, executes sequentially.
+ */
+ public static DoubleStream doubleStreamKeys(Map coll) {
+ return StreamSupport.doubleStream(coll.keyStepper((StepperShape)(Object)StepperShape.doubleStepperShape()).spliterator(), false);
+ }
+
+ /**
+ * Generates a DoubleStream that traverses the values of a scala.collection.Map.
+ *
+ * Parallel processing is only efficient for Maps that have a valueStepper implementation
+ * which supports efficient splitting. For collections where this is the case, the valueStepper
+ * method has a return type marked with EfficientSplit.
+ *
+ * @param coll The Map to traverse
+ * @return A DoubleStream view of the collection which, by default, executes sequentially.
+ */
+ public static DoubleStream doubleStreamValues(Map, Double> coll) {
+ return StreamSupport.doubleStream(coll.valueStepper((StepperShape)(Object)StepperShape.doubleStepperShape()).spliterator(), false);
+ }
+
+ /**
+ * Generates a DoubleStream that traverses any Scala collection by accumulating its entries
+ * into a buffer class (Accumulator).
+ *
+ * Both sequential and parallel operations will be efficient.
+ *
+ * @param coll The collection to traverse
+ * @return A DoubleStream view of the collection which, by default, executes sequentially.
+ */
+ public static DoubleStream doubleStreamAccumulated(IterableOnce coll) {
+ return StreamConverters.asJavaSeqDoubleStream((IterableOnce)(Object)scala.jdk.DoubleAccumulator$.MODULE$.fromSpecific((IterableOnce