diff --git a/benchmarks/FsMath.Benchmarks/FsMath.Benchmarks.fsproj b/benchmarks/FsMath.Benchmarks/FsMath.Benchmarks.fsproj index b19f672..a59c7ca 100644 --- a/benchmarks/FsMath.Benchmarks/FsMath.Benchmarks.fsproj +++ b/benchmarks/FsMath.Benchmarks/FsMath.Benchmarks.fsproj @@ -7,6 +7,7 @@ + diff --git a/benchmarks/FsMath.Benchmarks/Matrix.fs b/benchmarks/FsMath.Benchmarks/Matrix.fs new file mode 100644 index 0000000..60d070e --- /dev/null +++ b/benchmarks/FsMath.Benchmarks/Matrix.fs @@ -0,0 +1,107 @@ +namespace FsMath.Benchmarks + +open System +open BenchmarkDotNet.Attributes +open FsMath + +[] +type MatrixBenchmarks() = + + let mutable matrixA = Unchecked.defaultof> + let mutable matrixB = Unchecked.defaultof> + let mutable vector = [||] + + // Parameterize matrix sizes: small, medium, large + [] + member val Size = 0 with get, set + + [] + member this.Setup() = + // Initialize square matrices with some values + matrixA <- Matrix.init this.Size this.Size (fun i j -> float (i + j)) + matrixB <- Matrix.init this.Size this.Size (fun i j -> float (i * 2 + j)) + vector <- Array.init this.Size (fun i -> float i) + + // Element-wise operations + + [] + member _.ElementWiseAdd() = + let result = Matrix.add matrixA matrixB + GC.KeepAlive(result) + + [] + member _.ElementWiseSubtract() = + let result = Matrix.subtract matrixA matrixB + GC.KeepAlive(result) + + [] + member _.ElementWiseMultiply() = + let result = Matrix.multiply matrixA matrixB + GC.KeepAlive(result) + + [] + member _.ElementWiseDivide() = + let result = Matrix.divide matrixA matrixB + GC.KeepAlive(result) + + // Scalar operations + + [] + member _.ScalarAdd() = + let result = Matrix.addScalar matrixA 5.0 + GC.KeepAlive(result) + + [] + member _.ScalarMultiply() = + let result = Matrix.multiplyScalar matrixA 2.5 + GC.KeepAlive(result) + + // Matrix multiplication + + [] + member _.MatrixMultiply() = + let result = Matrix.matmul matrixA matrixB + GC.KeepAlive(result) + + // Matrix-vector operations + + [] + member _.MatrixVectorMultiply() = + let result = Matrix.muliplyVector matrixA vector + GC.KeepAlive(result) + + [] + member _.VectorMatrixMultiply() = + let result = Matrix.multiplyRowVector vector matrixA + GC.KeepAlive(result) + + // Transpose + + [] + member _.Transpose() = + let result = matrixA.Transpose() + GC.KeepAlive(result) + + // Row/column access patterns + + [] + member this.GetRow() = + let result = Matrix.getRow (this.Size / 2) matrixA + GC.KeepAlive(result) + + [] + member this.GetCol() = + let result = Matrix.getCol (this.Size / 2) matrixA + GC.KeepAlive(result) + + // Broadcast operations + + [] + member _.AddRowVector() = + let result = Matrix.addRowVector matrixA vector + GC.KeepAlive(result) + + [] + member _.AddColVector() = + let result = Matrix.addColVector matrixA vector + GC.KeepAlive(result) diff --git a/benchmarks/FsMath.Benchmarks/Program.fs b/benchmarks/FsMath.Benchmarks/Program.fs index d915a74..06aa935 100644 --- a/benchmarks/FsMath.Benchmarks/Program.fs +++ b/benchmarks/FsMath.Benchmarks/Program.fs @@ -7,6 +7,7 @@ let Main args = // Register multiple benchmark classes let switcher = BenchmarkSwitcher [| typeof + typeof typeof |] switcher.Run args |> ignore