add: benchmarks for Jafama

This commit is contained in:
therealansh 2021-06-08 19:19:55 +05:30
parent 590910ac2d
commit 9a9ebc7304
3 changed files with 106 additions and 53 deletions

View File

@ -30,6 +30,7 @@ kotlin {
implementation(project(":kmath-stat")) implementation(project(":kmath-stat"))
implementation(project(":kmath-dimensions")) implementation(project(":kmath-dimensions"))
implementation(project(":kmath-for-real")) implementation(project(":kmath-for-real"))
implementation(project(":kmath-jafama"))
implementation("org.jetbrains.kotlinx:kotlinx-benchmark-runtime:0.3.0") implementation("org.jetbrains.kotlinx:kotlinx-benchmark-runtime:0.3.0")
} }
} }
@ -42,7 +43,6 @@ kotlin {
implementation(project(":kmath-kotlingrad")) implementation(project(":kmath-kotlingrad"))
implementation(project(":kmath-viktor")) implementation(project(":kmath-viktor"))
implementation("org.nd4j:nd4j-native:1.0.0-beta7") implementation("org.nd4j:nd4j-native:1.0.0-beta7")
// uncomment if your system supports AVX2 // uncomment if your system supports AVX2
// val os = System.getProperty("os.name") // val os = System.getProperty("os.name")
// //
@ -95,6 +95,11 @@ benchmark {
commonConfiguration() commonConfiguration()
include("BigIntBenchmark") include("BigIntBenchmark")
} }
configurations.register("jafamaDouble") {
commonConfiguration()
include("JafamaBenchmark")
}
} }
// Fix kotlinx-benchmarks bug // Fix kotlinx-benchmarks bug

View File

@ -0,0 +1,48 @@
/*
* Copyright 2018-2021 KMath contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package space.kscience.kmath.benchmarks
import kotlinx.benchmark.Blackhole
import org.openjdk.jmh.annotations.Benchmark
import org.openjdk.jmh.annotations.Scope
import org.openjdk.jmh.annotations.State
import space.kscience.kmath.jafama.JafamaDoubleField
import space.kscience.kmath.jafama.StrictJafamaDoubleField
import space.kscience.kmath.operations.DoubleField
import space.kscience.kmath.operations.invoke
@State(Scope.Benchmark)
internal class JafamaBenchmark {
@Benchmark
fun jafamaBench(blackhole: Blackhole) = invokeBenchmarks(jafama, blackhole)
@Benchmark
fun coreBench(blackhole: Blackhole) = invokeBenchmarks(core,blackhole)
@Benchmark
fun strictJafamaBench(blackhole: Blackhole) = invokeBenchmarks(strictJafama,blackhole)
private fun invokeBenchmarks(expr: Double, blackhole: Blackhole) {
blackhole.consume(expr)
}
private companion object {
private val x: Double = Double.MAX_VALUE
private val jafama = JafamaDoubleField{
x * power(x, 1_000_000) * exp(x) / cos(x)
}
private val core = DoubleField {
x * power(x, 1_000_000) * exp(x) / cos(x)
}
private val strictJafama = StrictJafamaDoubleField {
x * power(x, 1_000_000) * exp(x) / cos(x)
}
}
}

View File

@ -8,8 +8,8 @@ import net.jafama.*
*/ */
@Suppress("EXTENSION_SHADOWED_BY_MEMBER", "OVERRIDE_BY_INLINE", "NOTHING_TO_INLINE") @Suppress("EXTENSION_SHADOWED_BY_MEMBER", "OVERRIDE_BY_INLINE", "NOTHING_TO_INLINE")
public object JafamaDoubleField : ExtendedField<Double>, Norm<Double, Double>, ScaleOperations<Double> { public object JafamaDoubleField : ExtendedField<Double>, Norm<Double, Double>, ScaleOperations<Double> {
public override inline val zero: Double get() = 0.0 public override val zero: Double get() = 0.0
public override inline val one: Double get() = 1.0 public override val one: Double get() = 1.0
public override fun number(value: Number): Double = value.toDouble() public override fun number(value: Number): Double = value.toDouble()
@ -19,38 +19,38 @@ public object JafamaDoubleField : ExtendedField<Double>, Norm<Double, Double>, S
else -> super<ExtendedField>.binaryOperationFunction(operation) else -> super<ExtendedField>.binaryOperationFunction(operation)
} }
public override inline fun add(a: Double, b: Double): Double = a + b public override fun add(a: Double, b: Double): Double = a + b
public override inline fun multiply(a: Double, b: Double): Double = a * b public override fun multiply(a: Double, b: Double): Double = a * b
public override inline fun divide(a: Double, b: Double): Double = a / b public override fun divide(a: Double, b: Double): Double = a / b
public override fun scale(a: Double, value: Double): Double = a * value public override fun scale(a: Double, value: Double): Double = a * value
public override inline fun sin(arg: Double): Double = FastMath.sin(arg) public override fun sin(arg: Double): Double = FastMath.sin(arg)
public override inline fun cos(arg: Double): Double = FastMath.cos(arg) public override fun cos(arg: Double): Double = FastMath.cos(arg)
public override inline fun tan(arg: Double): Double = FastMath.tan(arg) public override fun tan(arg: Double): Double = FastMath.tan(arg)
public override inline fun acos(arg: Double): Double = FastMath.acos(arg) public override fun acos(arg: Double): Double = FastMath.acos(arg)
public override inline fun asin(arg: Double): Double = FastMath.asin(arg) public override fun asin(arg: Double): Double = FastMath.asin(arg)
public override inline fun atan(arg: Double): Double = FastMath.atan(arg) public override fun atan(arg: Double): Double = FastMath.atan(arg)
public override inline fun sinh(arg: Double): Double = FastMath.sinh(arg) public override fun sinh(arg: Double): Double = FastMath.sinh(arg)
public override inline fun cosh(arg: Double): Double = FastMath.cosh(arg) public override fun cosh(arg: Double): Double = FastMath.cosh(arg)
public override inline fun tanh(arg: Double): Double = FastMath.tanh(arg) public override fun tanh(arg: Double): Double = FastMath.tanh(arg)
public override inline fun asinh(arg: Double): Double = FastMath.asinh(arg) public override fun asinh(arg: Double): Double = FastMath.asinh(arg)
public override inline fun acosh(arg: Double): Double = FastMath.acosh(arg) public override fun acosh(arg: Double): Double = FastMath.acosh(arg)
public override inline fun atanh(arg: Double): Double = FastMath.atanh(arg) public override fun atanh(arg: Double): Double = FastMath.atanh(arg)
public override inline fun power(arg: Double, pow: Number): Double = FastMath.pow(arg, pow.toDouble()) public override fun power(arg: Double, pow: Number): Double = FastMath.pow(arg, pow.toDouble())
public override inline fun exp(arg: Double): Double = FastMath.exp(arg) public override fun exp(arg: Double): Double = FastMath.exp(arg)
public override inline fun ln(arg: Double): Double = FastMath.log(arg) public override fun ln(arg: Double): Double = FastMath.log(arg)
public override inline fun norm(arg: Double): Double = FastMath.abs(arg) public override fun norm(arg: Double): Double = FastMath.abs(arg)
public override inline fun Double.unaryMinus(): Double = -this public override fun Double.unaryMinus(): Double = -this
public override inline fun Double.plus(b: Double): Double = this + b public override fun Double.plus(b: Double): Double = this + b
public override inline fun Double.minus(b: Double): Double = this - b public override fun Double.minus(b: Double): Double = this - b
public override inline fun Double.times(b: Double): Double = this * b public override fun Double.times(b: Double): Double = this * b
public override inline fun Double.div(b: Double): Double = this / b public override fun Double.div(b: Double): Double = this / b
} }
/** /**
@ -58,8 +58,8 @@ public object JafamaDoubleField : ExtendedField<Double>, Norm<Double, Double>, S
*/ */
@Suppress("EXTENSION_SHADOWED_BY_MEMBER", "OVERRIDE_BY_INLINE", "NOTHING_TO_INLINE") @Suppress("EXTENSION_SHADOWED_BY_MEMBER", "OVERRIDE_BY_INLINE", "NOTHING_TO_INLINE")
public object StrictJafamaDoubleField : ExtendedField<Double>, Norm<Double, Double>, ScaleOperations<Double> { public object StrictJafamaDoubleField : ExtendedField<Double>, Norm<Double, Double>, ScaleOperations<Double> {
public override inline val zero: Double get() = 0.0 public override val zero: Double get() = 0.0
public override inline val one: Double get() = 1.0 public override val one: Double get() = 1.0
public override fun number(value: Number): Double = value.toDouble() public override fun number(value: Number): Double = value.toDouble()
@ -69,38 +69,38 @@ public object StrictJafamaDoubleField : ExtendedField<Double>, Norm<Double, Doub
else -> super<ExtendedField>.binaryOperationFunction(operation) else -> super<ExtendedField>.binaryOperationFunction(operation)
} }
public override inline fun add(a: Double, b: Double): Double = a + b public override fun add(a: Double, b: Double): Double = a + b
public override inline fun multiply(a: Double, b: Double): Double = a * b public override fun multiply(a: Double, b: Double): Double = a * b
public override inline fun divide(a: Double, b: Double): Double = a / b public override fun divide(a: Double, b: Double): Double = a / b
public override fun scale(a: Double, value: Double): Double = a * value public override fun scale(a: Double, value: Double): Double = a * value
public override inline fun sin(arg: Double): Double = StrictFastMath.sin(arg) public override fun sin(arg: Double): Double = StrictFastMath.sin(arg)
public override inline fun cos(arg: Double): Double = StrictFastMath.cos(arg) public override fun cos(arg: Double): Double = StrictFastMath.cos(arg)
public override inline fun tan(arg: Double): Double = StrictFastMath.tan(arg) public override fun tan(arg: Double): Double = StrictFastMath.tan(arg)
public override inline fun acos(arg: Double): Double = StrictFastMath.acos(arg) public override fun acos(arg: Double): Double = StrictFastMath.acos(arg)
public override inline fun asin(arg: Double): Double = StrictFastMath.asin(arg) public override fun asin(arg: Double): Double = StrictFastMath.asin(arg)
public override inline fun atan(arg: Double): Double = StrictFastMath.atan(arg) public override fun atan(arg: Double): Double = StrictFastMath.atan(arg)
public override inline fun sinh(arg: Double): Double = StrictFastMath.sinh(arg) public override fun sinh(arg: Double): Double = StrictFastMath.sinh(arg)
public override inline fun cosh(arg: Double): Double = StrictFastMath.cosh(arg) public override fun cosh(arg: Double): Double = StrictFastMath.cosh(arg)
public override inline fun tanh(arg: Double): Double = StrictFastMath.tanh(arg) public override fun tanh(arg: Double): Double = StrictFastMath.tanh(arg)
public override inline fun asinh(arg: Double): Double = StrictFastMath.asinh(arg) public override fun asinh(arg: Double): Double = StrictFastMath.asinh(arg)
public override inline fun acosh(arg: Double): Double = StrictFastMath.acosh(arg) public override fun acosh(arg: Double): Double = StrictFastMath.acosh(arg)
public override inline fun atanh(arg: Double): Double = StrictFastMath.atanh(arg) public override fun atanh(arg: Double): Double = StrictFastMath.atanh(arg)
public override inline fun power(arg: Double, pow: Number): Double = StrictFastMath.pow(arg, pow.toDouble()) public override fun power(arg: Double, pow: Number): Double = StrictFastMath.pow(arg, pow.toDouble())
public override inline fun exp(arg: Double): Double = StrictFastMath.exp(arg) public override fun exp(arg: Double): Double = StrictFastMath.exp(arg)
public override inline fun ln(arg: Double): Double = StrictFastMath.log(arg) public override fun ln(arg: Double): Double = StrictFastMath.log(arg)
public override inline fun norm(arg: Double): Double = StrictFastMath.abs(arg) public override fun norm(arg: Double): Double = StrictFastMath.abs(arg)
public override inline fun Double.unaryMinus(): Double = -this public override fun Double.unaryMinus(): Double = -this
public override inline fun Double.plus(b: Double): Double = this + b public override fun Double.plus(b: Double): Double = this + b
public override inline fun Double.minus(b: Double): Double = this - b public override fun Double.minus(b: Double): Double = this - b
public override inline fun Double.times(b: Double): Double = this * b public override fun Double.times(b: Double): Double = this * b
public override inline fun Double.div(b: Double): Double = this / b public override fun Double.div(b: Double): Double = this / b
} }