Benchmark refactoring
This commit is contained in:
parent
625e624cab
commit
89c0d863d2
@ -69,7 +69,7 @@ benchmark {
|
|||||||
// This one matches sourceSet name above
|
// This one matches sourceSet name above
|
||||||
|
|
||||||
configurations.register("fast") {
|
configurations.register("fast") {
|
||||||
warmups = 5 // number of warmup iterations
|
warmups = 1 // number of warmup iterations
|
||||||
iterations = 3 // number of iterations
|
iterations = 3 // number of iterations
|
||||||
iterationTime = 500 // time in seconds per iteration
|
iterationTime = 500 // time in seconds per iteration
|
||||||
iterationTimeUnit = "ms" // time unity for iterationTime, default is seconds
|
iterationTimeUnit = "ms" // time unity for iterationTime, default is seconds
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
package kscience.kmath.structures
|
package kscience.kmath.benchmarks
|
||||||
|
|
||||||
import org.openjdk.jmh.annotations.Benchmark
|
import org.openjdk.jmh.annotations.Benchmark
|
||||||
import org.openjdk.jmh.annotations.Scope
|
import org.openjdk.jmh.annotations.Scope
|
@ -1,7 +1,9 @@
|
|||||||
package kscience.kmath.structures
|
package kscience.kmath.benchmarks
|
||||||
|
|
||||||
import kscience.kmath.operations.Complex
|
import kscience.kmath.operations.Complex
|
||||||
import kscience.kmath.operations.complex
|
import kscience.kmath.operations.complex
|
||||||
|
import kscience.kmath.structures.MutableBuffer
|
||||||
|
import kscience.kmath.structures.RealBuffer
|
||||||
import org.openjdk.jmh.annotations.Benchmark
|
import org.openjdk.jmh.annotations.Benchmark
|
||||||
import org.openjdk.jmh.annotations.Scope
|
import org.openjdk.jmh.annotations.Scope
|
||||||
import org.openjdk.jmh.annotations.State
|
import org.openjdk.jmh.annotations.State
|
@ -0,0 +1,50 @@
|
|||||||
|
package kscience.kmath.linear
|
||||||
|
|
||||||
|
|
||||||
|
import kotlinx.benchmark.Benchmark
|
||||||
|
import kscience.kmath.commons.linear.CMMatrixContext
|
||||||
|
import kscience.kmath.commons.linear.CMMatrixContext.dot
|
||||||
|
import kscience.kmath.commons.linear.inverse
|
||||||
|
import kscience.kmath.commons.linear.toCM
|
||||||
|
import kscience.kmath.ejml.EjmlMatrixContext
|
||||||
|
import kscience.kmath.ejml.inverse
|
||||||
|
import kscience.kmath.ejml.toEjml
|
||||||
|
import kscience.kmath.operations.invoke
|
||||||
|
import kscience.kmath.structures.Matrix
|
||||||
|
import org.openjdk.jmh.annotations.Scope
|
||||||
|
import org.openjdk.jmh.annotations.State
|
||||||
|
import kotlin.random.Random
|
||||||
|
|
||||||
|
@State(Scope.Benchmark)
|
||||||
|
class LinearAlgebraBenchmark {
|
||||||
|
companion object {
|
||||||
|
val random = Random(1224)
|
||||||
|
val dim = 100
|
||||||
|
|
||||||
|
//creating invertible matrix
|
||||||
|
val u = Matrix.real(dim, dim) { i, j -> if (i <= j) random.nextDouble() else 0.0 }
|
||||||
|
val l = Matrix.real(dim, dim) { i, j -> if (i >= j) random.nextDouble() else 0.0 }
|
||||||
|
val matrix = l dot u
|
||||||
|
}
|
||||||
|
|
||||||
|
@Benchmark
|
||||||
|
fun kmathLUPInversion() {
|
||||||
|
MatrixContext.real.inverse(matrix)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Benchmark
|
||||||
|
fun cmLUPInversion() {
|
||||||
|
CMMatrixContext {
|
||||||
|
val cm = matrix.toCM() //avoid overhead on conversion
|
||||||
|
inverse(cm)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Benchmark
|
||||||
|
fun ejmlInverse() {
|
||||||
|
EjmlMatrixContext {
|
||||||
|
val km = matrix.toEjml() //avoid overhead on conversion
|
||||||
|
inverse(km)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -1,4 +1,4 @@
|
|||||||
package kscience.kmath.structures
|
package kscience.kmath.benchmarks
|
||||||
|
|
||||||
import kotlinx.benchmark.Benchmark
|
import kotlinx.benchmark.Benchmark
|
||||||
import kscience.kmath.commons.linear.CMMatrixContext
|
import kscience.kmath.commons.linear.CMMatrixContext
|
||||||
@ -7,8 +7,8 @@ import kscience.kmath.commons.linear.toCM
|
|||||||
import kscience.kmath.ejml.EjmlMatrixContext
|
import kscience.kmath.ejml.EjmlMatrixContext
|
||||||
import kscience.kmath.ejml.toEjml
|
import kscience.kmath.ejml.toEjml
|
||||||
import kscience.kmath.linear.real
|
import kscience.kmath.linear.real
|
||||||
import kscience.kmath.operations.RealField
|
|
||||||
import kscience.kmath.operations.invoke
|
import kscience.kmath.operations.invoke
|
||||||
|
import kscience.kmath.structures.Matrix
|
||||||
import org.openjdk.jmh.annotations.Scope
|
import org.openjdk.jmh.annotations.Scope
|
||||||
import org.openjdk.jmh.annotations.State
|
import org.openjdk.jmh.annotations.State
|
||||||
import kotlin.random.Random
|
import kotlin.random.Random
|
||||||
@ -44,6 +44,15 @@ class MultiplicationBenchmark {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Benchmark
|
||||||
|
fun ejmlMultiplicationwithConversion() {
|
||||||
|
val ejmlMatrix1 = matrix1.toEjml()
|
||||||
|
val ejmlMatrix2 = matrix2.toEjml()
|
||||||
|
EjmlMatrixContext.invoke {
|
||||||
|
ejmlMatrix1 dot ejmlMatrix2
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Benchmark
|
@Benchmark
|
||||||
fun bufferedMultiplication() {
|
fun bufferedMultiplication() {
|
||||||
matrix1 dot matrix2
|
matrix1 dot matrix2
|
@ -1,7 +1,8 @@
|
|||||||
package kscience.kmath.structures
|
package kscience.kmath.benchmarks
|
||||||
|
|
||||||
import kscience.kmath.operations.RealField
|
import kscience.kmath.operations.RealField
|
||||||
import kscience.kmath.operations.invoke
|
import kscience.kmath.operations.invoke
|
||||||
|
import kscience.kmath.structures.*
|
||||||
import org.openjdk.jmh.annotations.Benchmark
|
import org.openjdk.jmh.annotations.Benchmark
|
||||||
import org.openjdk.jmh.annotations.Scope
|
import org.openjdk.jmh.annotations.Scope
|
||||||
import org.openjdk.jmh.annotations.State
|
import org.openjdk.jmh.annotations.State
|
@ -1,7 +1,10 @@
|
|||||||
package kscience.kmath.structures
|
package kscience.kmath.benchmarks
|
||||||
|
|
||||||
import kscience.kmath.operations.RealField
|
import kscience.kmath.operations.RealField
|
||||||
import kscience.kmath.operations.invoke
|
import kscience.kmath.operations.invoke
|
||||||
|
import kscience.kmath.structures.BufferedNDField
|
||||||
|
import kscience.kmath.structures.NDField
|
||||||
|
import kscience.kmath.structures.RealNDField
|
||||||
import kscience.kmath.viktor.ViktorNDField
|
import kscience.kmath.viktor.ViktorNDField
|
||||||
import org.jetbrains.bio.viktor.F64Array
|
import org.jetbrains.bio.viktor.F64Array
|
||||||
import org.openjdk.jmh.annotations.Benchmark
|
import org.openjdk.jmh.annotations.Benchmark
|
||||||
@ -36,7 +39,7 @@ internal class ViktorBenchmark {
|
|||||||
|
|
||||||
@Benchmark
|
@Benchmark
|
||||||
fun rawViktor() {
|
fun rawViktor() {
|
||||||
val one = F64Array.full(init = 1.0, shape = *intArrayOf(dim, dim))
|
val one = F64Array.full(init = 1.0, shape = intArrayOf(dim, dim))
|
||||||
var res = one
|
var res = one
|
||||||
repeat(n) { res = res + one }
|
repeat(n) { res = res + one }
|
||||||
}
|
}
|
@ -1,11 +0,0 @@
|
|||||||
package kscience.kmath.utils
|
|
||||||
|
|
||||||
import kotlin.contracts.InvocationKind
|
|
||||||
import kotlin.contracts.contract
|
|
||||||
import kotlin.system.measureTimeMillis
|
|
||||||
|
|
||||||
internal inline fun measureAndPrint(title: String, block: () -> Unit) {
|
|
||||||
contract { callsInPlace(block, InvocationKind.EXACTLY_ONCE) }
|
|
||||||
val time = measureTimeMillis(block)
|
|
||||||
println("$title completed in $time millis")
|
|
||||||
}
|
|
@ -1,52 +0,0 @@
|
|||||||
package kscience.kmath.linear
|
|
||||||
|
|
||||||
import kscience.kmath.commons.linear.CMMatrixContext
|
|
||||||
import kscience.kmath.commons.linear.CMMatrixContext.dot
|
|
||||||
import kscience.kmath.commons.linear.inverse
|
|
||||||
import kscience.kmath.commons.linear.toCM
|
|
||||||
import kscience.kmath.ejml.EjmlMatrixContext
|
|
||||||
import kscience.kmath.ejml.inverse
|
|
||||||
import kscience.kmath.ejml.toEjml
|
|
||||||
import kscience.kmath.operations.RealField
|
|
||||||
import kscience.kmath.operations.invoke
|
|
||||||
import kscience.kmath.structures.Matrix
|
|
||||||
import kotlin.random.Random
|
|
||||||
import kotlin.system.measureTimeMillis
|
|
||||||
|
|
||||||
fun main() {
|
|
||||||
val random = Random(1224)
|
|
||||||
val dim = 100
|
|
||||||
//creating invertible matrix
|
|
||||||
val u = Matrix.real(dim, dim) { i, j -> if (i <= j) random.nextDouble() else 0.0 }
|
|
||||||
val l = Matrix.real(dim, dim) { i, j -> if (i >= j) random.nextDouble() else 0.0 }
|
|
||||||
val matrix = l dot u
|
|
||||||
|
|
||||||
val n = 5000 // iterations
|
|
||||||
|
|
||||||
MatrixContext.real {
|
|
||||||
repeat(50) { inverse(matrix) }
|
|
||||||
val inverseTime = measureTimeMillis { repeat(n) { inverse(matrix) } }
|
|
||||||
println("[kmath] Inversion of $n matrices $dim x $dim finished in $inverseTime millis")
|
|
||||||
}
|
|
||||||
|
|
||||||
//commons-math
|
|
||||||
|
|
||||||
val commonsTime = measureTimeMillis {
|
|
||||||
CMMatrixContext {
|
|
||||||
val cm = matrix.toCM() //avoid overhead on conversion
|
|
||||||
repeat(n) { inverse(cm) }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
println("[commons-math] Inversion of $n matrices $dim x $dim finished in $commonsTime millis")
|
|
||||||
|
|
||||||
val ejmlTime = measureTimeMillis {
|
|
||||||
EjmlMatrixContext {
|
|
||||||
val km = matrix.toEjml() //avoid overhead on conversion
|
|
||||||
repeat(n) { inverse(km) }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
println("[ejml] Inversion of $n matrices $dim x $dim finished in $ejmlTime millis")
|
|
||||||
}
|
|
@ -80,4 +80,4 @@ public fun <T : Any> Matrix<T>.transpose(): Matrix<T> {
|
|||||||
rowNum,
|
rowNum,
|
||||||
setOf(TransposedFeature(this))
|
setOf(TransposedFeature(this))
|
||||||
) { i, j -> get(j, i) }
|
) { i, j -> get(j, i) }
|
||||||
}
|
}
|
Loading…
Reference in New Issue
Block a user