Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
package framian.benchmark

import java.util.concurrent.TimeUnit

import scala.collection.immutable.BitSet
import scala.util.Random

import org.openjdk.jmh.annotations.{ Benchmark, Scope, State }
import org.openjdk.jmh.annotations.{ BenchmarkMode, Mode, OutputTimeUnit }

import framian.Column
import framian.column.Mask

class DenseColumnZipMapBenchmark {

@Benchmark
def zipMapArray(data: DenseZipMapData) = {
val xs = data.data0
val ys = data.data1
val len = spire.math.min(xs.length, ys.length)
val zs = new Array[Double](len)
var i = 0
while (i < xs.length && i < ys.length) {
zs(i) = xs(i) * ys(i)
i += 1
}
zs
}

@Benchmark
def zipMappedMaskedArray(data: DenseZipMapData) = {
val xs = data.data0
val ys = data.data1
val len = spire.math.min(xs.length, ys.length)
val na = data.na0 | data.na1
val nm = (data.nm0 | data.nm1).filter(i => i < len && !na(i))
val zs = new Array[Double](len)
var i = 0
while (i < xs.length && i < ys.length) {
if (!(na(i) || nm(i)))
zs(i) = xs(i) * ys(i)
i += 1
}
zs
}

@Benchmark
def squareColumn(data: DenseZipMapData) =
data.col0.zipMap(data.col1)(_ * _)
}

@State(Scope.Benchmark)
class DenseZipMapData {
val size = 1000
val rng = new Random(42)

val data0: Array[Double] = Array.fill(size)(rng.nextDouble)
val na0: Mask = Data.mask(rng, size, 0.1)
val nm0: Mask = Data.mask(rng, size, 0.01)
val col0: Column[Double] = Column.dense(data0, na0, nm0)

val data1: Array[Double] = Array.fill(size)(rng.nextDouble)
val na1: Mask = Data.mask(rng, size, 0.1)
val nm1: Mask = Data.mask(rng, size, 0.01)
val col1: Column[Double] = Column.dense(data1, na1, nm1)
}
10 changes: 10 additions & 0 deletions framian/src/main/scala/framian/Column.scala
Original file line number Diff line number Diff line change
Expand Up @@ -182,6 +182,16 @@ sealed trait Column[+A] { // TODO: Can't specialize in 2.10, but can in 2.11.
*/
def zipMap[B, C](that: Column[B])(f: (A, B) => C): Column[C]

/**
* Zips values together into 2-tuples. This is equivalent to calling
* `left.zipMap(right)((_, _))`.
*
* @param that the column to zip this column with
*
* @see [[Column#zipMap]]
*/
def zip[B](that: Column[B]): Column[(B, C)] = zipMap(that)((_, _))

override def toString: String =
(0 to 5).map(apply(_).toString).mkString("Column(", ", ", ", ...)")
}
Expand Down
2 changes: 0 additions & 2 deletions project/Dependencies.scala
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,6 @@ object Dependencies {
// Test libraries
val Specs2 = "2.4.2"
val ScalaCheck = "1.11.6"

val Jmh = "1.0"
}

// Compile
Expand Down
2 changes: 1 addition & 1 deletion project/plugins.sbt
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,6 @@ def customAddSbtPlugin(m: ModuleID) = Defaults.sbtPluginExtra(m, "0.13", "2.10")
libraryDependencies ++= Seq(
customAddSbtPlugin("de.johoop" % "jacoco4sbt" % "2.1.6"),
customAddSbtPlugin("me.lessis" % "bintray-sbt" % "0.1.2"),
customAddSbtPlugin("net.tixxit" % "sbt-benchmark" % "0.1.0")
customAddSbtPlugin("net.tixxit" % "sbt-benchmark" % "0.1.1")
)