mat: add benchmarks for trimul

This commit is contained in:
jonreiter@gmail.com
2019-04-16 17:18:27 +08:00
committed by Dan Kortschak
parent 0fa7915c50
commit 480f85c83e
2 changed files with 66 additions and 9 deletions

View File

@@ -9,6 +9,8 @@ import (
"reflect" "reflect"
"testing" "testing"
"golang.org/x/exp/rand"
"gonum.org/v1/gonum/blas/blas64" "gonum.org/v1/gonum/blas/blas64"
) )
@@ -458,3 +460,11 @@ func TestDiagonalAtSet(t *testing.T) {
} }
} }
} }
func randDiagDense(size int, rnd *rand.Rand) *DiagDense {
t := NewDiagDense(size, nil)
for i := 0; i < size; i++ {
t.SetDiag(i, rnd.Float64())
}
return t
}

View File

@@ -5,6 +5,7 @@
package mat package mat
import ( import (
"fmt"
"math" "math"
"reflect" "reflect"
"testing" "testing"
@@ -513,23 +514,69 @@ func TestCopySymIntoTriangle(t *testing.T) {
} }
} }
func BenchmarkTriSum1000(b *testing.B) { triSumBench(b, 1000) }
var triSumForBench float64 var triSumForBench float64
func triSumBench(b *testing.B, size int) { func BenchmarkTriSum(b *testing.B) {
a := randTriDense(size) rnd := rand.New(rand.NewSource(1))
b.ResetTimer() for n := 100; n <= 1600; n *= 2 {
for i := 0; i < b.N; i++ { a := randTriDense(n, rnd)
triSumForBench = Sum(a) b.Run(fmt.Sprintf("BenchmarkTriSum%d", n), func(b *testing.B) {
for i := 0; i < b.N; i++ {
triSumForBench = Sum(a)
}
})
} }
} }
func randTriDense(size int) *TriDense { var triProductForBench *TriDense
func BenchmarkTriMul(b *testing.B) {
rnd := rand.New(rand.NewSource(1))
for n := 100; n <= 1600; n *= 2 {
triProductForBench = NewTriDense(n, Upper, nil)
a := randTriDense(n, rnd)
c := randTriDense(n, rnd)
b.Run(fmt.Sprintf("BenchmarkTriMul%d", n), func(b *testing.B) {
for i := 0; i < b.N; i++ {
triProductForBench.MulTri(a, c)
}
})
}
}
func BenchmarkTriMulDiag(b *testing.B) {
rnd := rand.New(rand.NewSource(1))
for n := 100; n <= 1600; n *= 2 {
triProductForBench = NewTriDense(n, Upper, nil)
a := randTriDense(n, rnd)
c := randDiagDense(n, rnd)
b.Run(fmt.Sprintf("BenchmarkTriMulDiag%d", n), func(b *testing.B) {
for i := 0; i < b.N; i++ {
triProductForBench.MulTri(a, c)
}
})
}
}
func BenchmarkTriMul2Diag(b *testing.B) {
rnd := rand.New(rand.NewSource(1))
for n := 100; n <= 1600; n *= 2 {
triProductForBench = NewTriDense(n, Upper, nil)
a := randDiagDense(n, rnd)
c := randDiagDense(n, rnd)
b.Run(fmt.Sprintf("BenchmarkTriMul2Diag%d", n), func(b *testing.B) {
for i := 0; i < b.N; i++ {
triProductForBench.MulTri(a, c)
}
})
}
}
func randTriDense(size int, rnd *rand.Rand) *TriDense {
t := NewTriDense(size, Upper, nil) t := NewTriDense(size, Upper, nil)
for i := 0; i < size; i++ { for i := 0; i < size; i++ {
for j := i; j < size; j++ { for j := i; j < size; j++ {
t.SetTri(i, j, rand.Float64()) t.SetTri(i, j, rnd.Float64())
} }
} }
return t return t