Squashed 'third_party/immer/' content from commit ad3e3556d

git-subtree-dir: third_party/immer
git-subtree-split: ad3e3556d38bb75966dd24c61a774970a7c7957e
This commit is contained in:
Vincent Ambo 2020-07-15 08:20:18 +01:00
commit 7f19d64164
311 changed files with 74223 additions and 0 deletions

6
tools/scala/README.md Normal file
View file

@ -0,0 +1,6 @@
```
# sbt
> test
> test-only org.immer.* -- -verbose
```

27
tools/scala/build.sbt Normal file
View file

@ -0,0 +1,27 @@
/** This is the simplest possible use of ScalaMeter.
* It allows running ScalaMeter benchmarks as part of the test suite.
* It means, that when the test command is run, ScalaMeter benchmarks are run along
* the tests from other test frameworks, such as ScalaTest or ScalaCheck.
*/
lazy val basic = Project(
"basic",
file("."),
settings = Defaults.coreDefaultSettings ++ Seq(
name := "immer-bechmarks",
organization := "org.immer",
scalaVersion := "2.11.1",
scalacOptions ++= Seq("-deprecation", "-unchecked", "-feature", "-Xlint"),
publishArtifact := false,
libraryDependencies ++= Seq(
"com.storm-enroute" %% "scalameter" % "0.8.2" % "test",
"io.github.nicolasstucki" %% "scala-rrb-vector" % "0.1.1"
),
resolvers ++= Seq(
"Sonatype OSS Snapshots" at "https://oss.sonatype.org/content/repositories/snapshots",
"Sonatype OSS Releases" at "https://oss.sonatype.org/content/repositories/releases"
),
testFrameworks += new TestFramework("org.scalameter.ScalaMeterFramework"),
parallelExecution in Test := false,
logBuffered := false
)
)

View file

@ -0,0 +1,168 @@
package org.immer
import org.scalameter.api._
import scala.collection.immutable.Vector
import scala.collection.immutable.rrbvector.RRBVector
class BenchmarkBase extends Bench.ForkedTime {
val runs = 20
val size = 1000
val step = 10
val sizes = Gen.range("size")(size, size, 1)
//def relaxedV(v : RRBVector[Int], n : Int) : RRBVector[Int] = {
// var r = v
// for (i <- 0 to n) {
// r = (RRBVector.empty[Int] :+ i) ++ r
// }
// r
//}
var vectors = for { s <- sizes } yield Vector.empty[Int] ++ (0 until s)
var rrbvectors = for { s <- sizes } yield RRBVector.empty[Int] ++ (0 until s)
//var rrbvectorsF = for { s <- sizes } yield relaxedV(RRBVector.empty[Int], s)
var rrbsteps = for { s <- sizes } yield RRBVector.empty[Int] ++ (0 until s / step)
}
class PushBenchmark extends BenchmarkBase {
performance of "push" in {
measure method "Vector" in { using(sizes) config(exec.benchRuns -> runs) in { s => {
var v = Vector.empty[Int]
for (a <- 0 to s) {
v = v :+ a
}
v
}}}
measure method "RRBVector" in { using(sizes) config(exec.benchRuns -> runs) in { s => {
var v = RRBVector.empty[Int]
for (a <- 0 to s) {
v = v :+ a
}
v
}}}
}
}
class UpdateBenchmark extends BenchmarkBase {
performance of "update" in {
measure method "Vector" in { using(vectors) config(exec.benchRuns -> runs) in { v0 => {
var v = v0
for (a <- 0 to v.size - 1) {
v = v.updated(a, a + 1)
}
v
}}}
measure method "RRBVector" in { using(rrbvectors) config(exec.benchRuns -> runs) in { v0 => {
var v = v0
for (a <- 0 to v.size - 1) {
v = v.updated(a, a + 1)
}
v
}}}
//measure method "RRBVector/relaxed" in { using(rrbvectorsF) config(exec.benchRuns -> runs) in { v0 => {
// var v = v0
// for (a <- 0 to v.size - 1) {
// v = v.updated(a, a + 1)
// }
// v
//}}}
}
performance of "update/random" in {
measure method "Vector" in { using(vectors) config(exec.benchRuns -> runs) in { v0 => {
var v = v0
var r = new scala.util.Random
for (a <- 0 to v.size - 1) {
v = v.updated(r.nextInt(v.size), a + 1)
}
v
}}}
measure method "RRBVector" in { using(rrbvectors) config(exec.benchRuns -> runs) in { v0 => {
var v = v0
var r = new scala.util.Random
for (a <- 0 to v.size - 1) {
v = v.updated(r.nextInt(v.size), a + 1)
}
v
}}}
//measure method "RRBVector/relaxed" in { using(rrbvectorsF) config(exec.benchRuns -> runs) in { v0 => {
// var v = v0
// var r = new scala.util.Random
// for (a <- 0 to v.size - 1) {
// v = v.updated(r.nextInt(v.size), a + 1)
// }
// v
//}}}
}
}
object IterBenchmark extends BenchmarkBase {
performance of "access/reduce" in {
measure method "Vector" in { using(vectors) config(exec.benchRuns -> runs) in { v => {
v.reduceLeft(_ + _)
}}}
measure method "RRBVector" in { using(rrbvectors) config(exec.benchRuns -> runs) in { v => {
v.reduceLeft(_ + _)
}}}
//measure method "RRBVector/relaxed" in { using(rrbvectorsF) config(exec.benchRuns -> runs) in { v => {
// v.reduceLeft(_ + _)
//}}}
}
performance of "access/idx" in {
measure method "Vector" in { using(vectors) config(exec.benchRuns -> runs) in { v => {
var r = 0
for (a <- 0 to v.size - 1) {
r += v(a)
}
r
}}}
measure method "RRBVector" in { using(rrbvectors) config(exec.benchRuns -> runs) in { v => {
var r = 0
for (a <- 0 to v.size - 1) {
r += v(a)
}
r
}}}
//measure method "RRBVector/relaxed" in { using(rrbvectorsF) config(exec.benchRuns -> runs) in { v => {
// var r = 0
// for (a <- 0 to v.size - 1) {
// r += v(a)
// }
// r
//}}}
}
performance of "access/iter" in {
measure method "Vector" in { using(vectors) config(exec.benchRuns -> runs) in { v => {
var r = 0
for (a <- v) {
r += a
}
r
}}}
measure method "RRBVector" in { using(rrbvectors) config(exec.benchRuns -> runs) in { v => {
var r = 0
for (a <- v) {
r += a
}
r
}}}
//measure method "RRBVector/relaxed" in { using(rrbvectorsF) config(exec.benchRuns -> runs) in { v => {
// var r = 0
// for (a <- v) {
// r += a
// }
// r
//}}}
}
}
class ConcatBenchmark extends BenchmarkBase {
performance of "concat" in {
measure method "RRBVector ++" in { using(rrbsteps) config(exec.benchRuns -> runs) in { v => {
var r = RRBVector.empty[Int]
for (_ <- 0 to step) {
r = r ++ v
}
r
}}}
}
}

1
tools/scala/version.sbt Normal file
View file

@ -0,0 +1 @@
version in ThisBuild := "0.8.2"