Late 2011 MacBook Air, Oracle HotSpot 7.
gcdDirect: 29.981 **1.00 x gcdDirect**
gcdSpire: 30.094 **1.00 x gcdDirect**
gcdSpireNonSpec: 36.903 **1.23 x gcdDirect**
gcdScala: 38.989 **1.30 x gcdDirect**
Late 2011 MacBook Air, Oracle HotSpot 7.
gcdDirect: 29.981 **1.00 x gcdDirect**
gcdSpire: 30.094 **1.00 x gcdDirect**
gcdSpireNonSpec: 36.903 **1.23 x gcdDirect**
gcdScala: 38.989 **1.30 x gcdDirect**
package benchmark | |
import org.scalameter.api._ | |
import spire.algebra._ | |
import spire.math._ | |
import spire.syntax._ | |
import spire.std.long._ | |
object GCDPerfTest extends PerformanceTest { | |
def gcdDirect(x: Long, y: Long): Long = | |
if (y == 0L) x else gcdDirect(y, x % y) | |
def gcdScala[A: scala.math.Integral](x: A, y: A): A = { | |
import scala.math.Integral.Implicits._ | |
if (y == 0) x else gcdScala(y, x % y) | |
} | |
def gcdSpireNonSpec[A: Integral](x: A, y: A): A = { | |
import spire.ops._ | |
if (y == 0) x else gcdSpireNonSpec(y, x % y) | |
} | |
def gcdSpire[@specialized(Long) A: Integral](x: A, y: A): A = { | |
import spire.ops._ | |
if (y == 0) x else gcdSpire(y, x % y) | |
} | |
val longs = Gen.single("random")(Array.fill(50000)(scala.util.Random.nextLong)) | |
performance of "gcd" in { | |
measure method "gcdDirect" in { | |
using(longs) in { xs => | |
cfor(1)(_ < xs.length, _ + 1) { i => gcdDirect(xs(i), xs(i - 1)) } | |
} | |
} | |
measure method "gcdScala" in { | |
using(longs) in { xs => | |
cfor(1)(_ < xs.length, _ + 1) { i => gcdScala(xs(i), xs(i - 1)) } | |
} | |
} | |
measure method "gcdSpireNonSpec" in { | |
using(longs) in { xs => | |
cfor(1)(_ < xs.length, _ + 1) { i => gcdSpireNonSpec(xs(i), xs(i - 1)) } | |
} | |
} | |
measure method "gcdSpire" in { | |
using(longs) in { xs => | |
cfor(1)(_ < xs.length, _ + 1) { i => gcdSpire(xs(i), xs(i - 1)) } | |
} | |
} | |
} | |
lazy val executor = LocalExecutor( | |
new Executor.Warmer.Default, | |
Aggregator.min, | |
new Measurer.Default) | |
lazy val reporter = new LoggingReporter | |
lazy val persistor = Persistor.None | |
} |
Late 2011 MacBook Air, Oracle HotSpot 7.
meanDirect: 10.592 **1.00 x gcdDirect**
meanSpire: 10.638 **1.00 x gcdDirect**
meanSpireNonSpec: 13.434 **1.26 x gcdDirect**
meanScala: 19.388 **1.83 x gcdDirect**
package benchmark | |
import org.scalameter.api._ | |
import spire.algebra._ | |
import spire.math._ | |
import spire.syntax._ | |
import spire.std.double._ | |
object MeanPerfTest extends HedralPerformanceTest { | |
def meanDirect(xs: Array[Double]): Double = { | |
var mean = 0D | |
cfor(0)(_ < xs.length, _ + 1) { i => | |
mean += (xs(i) - mean) / (i + 1) | |
} | |
mean | |
} | |
def meanScala[A](xs: Array[A])(implicit num: scala.math.Fractional[A]): A = { | |
import scala.math.Fractional.Implicits._ | |
var mean = num.zero | |
cfor(0)(_ < xs.length, _ + 1) { i => | |
mean += (xs(i) - mean) / (num.fromInt(i) + num.one) | |
} | |
mean | |
} | |
def meanSpireNonSpec[A: Fractional](xs: Array[A]): A = { | |
import spire.ops._ | |
var mean = Fractional[A].zero | |
cfor(0)(_ < xs.length, _ + 1) { i => | |
mean += (xs(i) - mean) / (i + 1) | |
} | |
mean | |
} | |
def meanSpire[@specialized(Double) A: Fractional](xs: Array[A]): A = { | |
import spire.ops._ | |
var mean = Fractional[A].zero | |
cfor(0)(_ < xs.length, _ + 1) { i => | |
mean += (xs(i) - mean) / (i + 1) | |
} | |
mean | |
} | |
val doubles = Gen.single("random")(Array.fill(1000000)(scala.util.Random.nextGaussian)) | |
performance of "mean" in { | |
measure method "meanDirect" in { | |
using(doubles) in { xs => | |
meanDirect(xs) | |
} | |
} | |
measure method "meanScala" in { | |
using(doubles) in { xs => | |
meanScala(xs) | |
} | |
} | |
measure method "meanSpireNonSpec" in { | |
using(doubles) in { xs => | |
meanSpireNonSpec(xs) | |
} | |
} | |
measure method "meanSpire" in { | |
using(doubles) in { xs => | |
meanSpire(xs) | |
} | |
} | |
} | |
lazy val executor = LocalExecutor( | |
new Executor.Warmer.Default, | |
Aggregator.min, | |
new Measurer.Default) | |
lazy val reporter = new LoggingReporter | |
lazy val persistor = Persistor.None | |
} |