Skip to content

Instantly share code, notes, and snippets.

@siriux
Created July 6, 2014 10:49
Show Gist options
  • Save siriux/f851fb292c14aaeadd07 to your computer and use it in GitHub Desktop.
Save siriux/f851fb292c14aaeadd07 to your computer and use it in GitHub Desktop.
Multivalue Benchmark on idea for scala value-plugin
import org.scalameter.api._
trait MultiValueStorage {
var val1: Long = 0
var val2: Long = 0
var val3: Long = 0
var val4: Long = 0
var val5: Long = 0
var ref1: Object = _
var ref2: Object = _
var ref3: Object = _
var ref4: Object = _
var ref5: Object = _
}
class BasicMultiValueStorage extends MultiValueStorage
object MultivalueBenchmark extends PerformanceTest {
lazy val executor = LocalExecutor(
new Executor.Warmer.Default,
Aggregator.median,
new Measurer.Default)
lazy val reporter = new LoggingReporter
lazy val persistor = Persistor.None
case class Three(a: Long, b: Long, c: Long)
case class SumProd(sum: Long, prod: Long)
val NumIterations = 1000000
var r: SumProd = SumProd(1,2)
def fCaseClass(x: Three): SumProd = SumProd(x.a+x.b+x.c, x.a*x.b*x.c)
performance of "Case class" in {
using(Gen.unit("")) in {
(_) => {
var i = NumIterations
while (i > 0) {
r = fCaseClass(Three(r.sum, r.prod, r.sum + r.prod))
i -= 1
}
}
}
}
// Using ThreadLocal
val _storage = new ThreadLocal[MultiValueStorage]
def getStorage(): MultiValueStorage = {
val s = _storage.get()
if (s != null) {
s
} else {
val ns = new BasicMultiValueStorage
_storage.set(ns)
ns
}
}
var rs: Long = 1
var rp: Long = 2
def fMultivalue(s: MultiValueStorage): MultiValueStorage = {
val a = s.val1
val b = s.val2
val c = s.val3
s.val1 = a+b+c
s.val2 = a*b*c
s
}
performance of "Multivalue" in {
using(Gen.unit("")) in {
(_) => {
var i = NumIterations
while (i > 0) {
val s1 = getStorage()
s1.val1 = rs
s1.val2 = rp
s1.val3 = rs + rp
val s2 = fMultivalue(s1)
rs = s2.val1
rp = s2.val2
i -= 1
}
}
}
}
performance of "Multivalue Reuse" in {
using(Gen.unit("")) in {
(_) => {
var i = NumIterations
val s = getStorage()
while (i > 0) {
val s1 = s
s1.val1 = rs
s1.val2 = rp
s1.val3 = rs + rp
val s2 = fMultivalue(s1)
rs = s2.val1
rp = s2.val2
i -= 1
}
}
}
}
var ov3: Long = 0
var ov4: Long = 0
var ov5: Long = 0
var or1: Object = _
var or2: Object = _
var or3: Object = _
var or4: Object = _
var or5: Object = _
val ref: Object = ""
performance of "Multivalue Generic Overhead 5" in {
using(Gen.unit("")) in {
(_) => {
var i = NumIterations
while (i > 0) {
val s1 = getStorage()
s1.val1 = rs
s1.val2 = rp
s1.val3 = rs + rp
// Generic Overhead
s1.val4 = -1
s1.val5 = -1
s1.ref1 = ref
s1.ref2 = ref
s1.ref3 = ref
s1.ref4 = ref
s1.ref5 = ref
val s2 = fMultivalue(s1)
rs = s2.val1
rp = s2.val2
// Generic Overhead
ov3 = s2.val3
ov4 = s2.val4
ov5 = s2.val5
or1 = s2.ref1
or2 = s2.ref2
or3 = s2.ref3
or4 = s2.ref4
or5 = s2.ref5
i -= 1
}
}
}
}
performance of "Multivalue Generic Overhead 5 Reuse" in {
using(Gen.unit("")) in {
(_) => {
var i = NumIterations
val s = getStorage()
while (i > 0) {
val s1 = s
s1.val1 = rs
s1.val2 = rp
s1.val3 = rs + rp
// Generic Overhead
s1.val4 = -1
s1.val5 = -1
s1.ref1 = ref
s1.ref2 = ref
s1.ref3 = ref
s1.ref4 = ref
s1.ref5 = ref
val s2 = fMultivalue(s1)
rs = s2.val1
rp = s2.val2
// Generic Overhead
ov3 = s2.val3
ov4 = s2.val4
ov5 = s2.val5
or1 = s2.ref1
or2 = s2.ref2
or3 = s2.ref3
or4 = s2.ref4
or5 = s2.ref5
i -= 1
}
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment