From b5c2b349d070f9bbb703bc1e3e6bd6aa31c8779b Mon Sep 17 00:00:00 2001 From: Simon Parten Date: Thu, 26 Sep 2024 14:12:56 +0200 Subject: [PATCH] bench --- benchmark/src/variance.scala | 75 ++++++++++++++++++++++++++++++++++++ justfile | 2 +- 2 files changed, 76 insertions(+), 1 deletion(-) create mode 100644 benchmark/src/variance.scala diff --git a/benchmark/src/variance.scala b/benchmark/src/variance.scala new file mode 100644 index 0000000..3f029e9 --- /dev/null +++ b/benchmark/src/variance.scala @@ -0,0 +1,75 @@ +/* + * Copyright 2020, 2021, Ludovic Henry + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Please contact git@ludovic.dev or visit ludovic.dev if you need additional + * information or have any questions. + */ + +package vecxt.benchmark + +import org.openjdk.jmh.annotations.* +import org.openjdk.jmh.infra.Blackhole +// import vecxt.Matrix.* +import vecxt.BoundsCheck +import scala.compiletime.uninitialized +import vecxt.* +import jdk.incubator.vector.VectorSpecies +import jdk.incubator.vector.VectorOperators +import jdk.incubator.vector.DoubleVector + +@State(Scope.Thread) +class VarianceBenchmark extends BLASBenchmark: + + @Param(Array("3", "128", "100000")) + var len: String = uninitialized; + + var arr: Array[Double] = uninitialized + + // format: off + @Setup(Level.Trial) + def setup: Unit = + arr = randomDoubleArray(len.toInt); + () + end setup + + extension (vec: Array[Double]) + inline def variance2: Double = + // https://www.cuemath.com/sample-variance-formula/ + val μ = vec.mean + vec.map(i => (i - μ) * (i - μ)).sum / (vec.length - 1) + + + + @Benchmark + def var_loop(bh: Blackhole) = + val r = arr.variance2 + bh.consume(r); + end var_loop + + + @Benchmark + def var_vec(bh: Blackhole) = + val r = arr.variance + bh.consume(r); + end var_vec +end VarianceBenchmark + + diff --git a/justfile b/justfile index 1d65b3f..2a7548f 100644 --- a/justfile +++ b/justfile @@ -7,7 +7,7 @@ benchmark: mill benchmark.runJmh -jvmArgs --add-modules=jdk.incubator.vector -rf json benchmarkOnly: - mill benchmark.runJmh -jvmArgs --add-modules=jdk.incubator.vector -rf json vecxt.benchmark.LogicalBenchmark + mill benchmark.runJmh -jvmArgs --add-modules=jdk.incubator.vector -rf json vecxt.benchmark.VarianceBenchmark setJvm: eval "$(cs java --jvm 21 --env)" \ No newline at end of file