| // Copyright ©2014 The Gonum Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| // a set of benchmarks to evaluate the performance of the various |
| // moment statistics: Mean, Variance, StdDev, MeanVariance, MeanStdDev, |
| // Covariance, Correlation, Skew, ExKurtosis, Moment, MomentAbout, ... |
| // |
| // It tests both weighted and unweighted versions by using a slice of |
| // all ones. |
| |
| package stat |
| |
| import ( |
| "testing" |
| |
| "golang.org/x/exp/rand" |
| ) |
| |
| const ( |
| small = 10 |
| medium = 1000 |
| large = 100000 |
| huge = 10000000 |
| ) |
| |
| // tests for unweighted versions |
| |
| func RandomSlice(l int) []float64 { |
| s := make([]float64, l) |
| for i := range s { |
| s[i] = rand.Float64() |
| } |
| return s |
| } |
| |
| func benchmarkMean(b *testing.B, s, wts []float64) { |
| b.ResetTimer() |
| for i := 0; i < b.N; i++ { |
| Mean(s, wts) |
| } |
| } |
| |
| func BenchmarkMeanSmall(b *testing.B) { |
| s := RandomSlice(small) |
| benchmarkMean(b, s, nil) |
| } |
| |
| func BenchmarkMeanMedium(b *testing.B) { |
| s := RandomSlice(medium) |
| benchmarkMean(b, s, nil) |
| } |
| |
| func BenchmarkMeanLarge(b *testing.B) { |
| s := RandomSlice(large) |
| benchmarkMean(b, s, nil) |
| } |
| |
| func BenchmarkMeanHuge(b *testing.B) { |
| s := RandomSlice(huge) |
| benchmarkMean(b, s, nil) |
| } |
| |
| func BenchmarkMeanSmallWeighted(b *testing.B) { |
| s := RandomSlice(small) |
| wts := RandomSlice(small) |
| benchmarkMean(b, s, wts) |
| } |
| |
| func BenchmarkMeanMediumWeighted(b *testing.B) { |
| s := RandomSlice(medium) |
| wts := RandomSlice(medium) |
| benchmarkMean(b, s, wts) |
| } |
| |
| func BenchmarkMeanLargeWeighted(b *testing.B) { |
| s := RandomSlice(large) |
| wts := RandomSlice(large) |
| benchmarkMean(b, s, wts) |
| } |
| |
| func BenchmarkMeanHugeWeighted(b *testing.B) { |
| s := RandomSlice(huge) |
| wts := RandomSlice(huge) |
| benchmarkMean(b, s, wts) |
| } |
| |
| func benchmarkVariance(b *testing.B, s, wts []float64) { |
| b.ResetTimer() |
| for i := 0; i < b.N; i++ { |
| Variance(s, wts) |
| } |
| } |
| |
| func BenchmarkVarianceSmall(b *testing.B) { |
| s := RandomSlice(small) |
| benchmarkVariance(b, s, nil) |
| } |
| |
| func BenchmarkVarianceMedium(b *testing.B) { |
| s := RandomSlice(medium) |
| benchmarkVariance(b, s, nil) |
| } |
| |
| func BenchmarkVarianceLarge(b *testing.B) { |
| s := RandomSlice(large) |
| benchmarkVariance(b, s, nil) |
| } |
| |
| func BenchmarkVarianceHuge(b *testing.B) { |
| s := RandomSlice(huge) |
| benchmarkVariance(b, s, nil) |
| } |
| |
| func BenchmarkVarianceSmallWeighted(b *testing.B) { |
| s := RandomSlice(small) |
| wts := RandomSlice(small) |
| benchmarkVariance(b, s, wts) |
| } |
| |
| func BenchmarkVarianceMediumWeighted(b *testing.B) { |
| s := RandomSlice(medium) |
| wts := RandomSlice(medium) |
| benchmarkVariance(b, s, wts) |
| } |
| |
| func BenchmarkVarianceLargeWeighted(b *testing.B) { |
| s := RandomSlice(large) |
| wts := RandomSlice(large) |
| benchmarkVariance(b, s, wts) |
| } |
| |
| func BenchmarkVarianceHugeWeighted(b *testing.B) { |
| s := RandomSlice(huge) |
| wts := RandomSlice(huge) |
| benchmarkVariance(b, s, wts) |
| } |
| |
| func benchmarkStdDev(b *testing.B, s, wts []float64) { |
| b.ResetTimer() |
| for i := 0; i < b.N; i++ { |
| StdDev(s, wts) |
| } |
| } |
| |
| func BenchmarkStdDevSmall(b *testing.B) { |
| s := RandomSlice(small) |
| benchmarkStdDev(b, s, nil) |
| } |
| |
| func BenchmarkStdDevMedium(b *testing.B) { |
| s := RandomSlice(medium) |
| benchmarkStdDev(b, s, nil) |
| } |
| |
| func BenchmarkStdDevLarge(b *testing.B) { |
| s := RandomSlice(large) |
| benchmarkStdDev(b, s, nil) |
| } |
| |
| func BenchmarkStdDevHuge(b *testing.B) { |
| s := RandomSlice(huge) |
| benchmarkStdDev(b, s, nil) |
| } |
| |
| func BenchmarkStdDevSmallWeighted(b *testing.B) { |
| s := RandomSlice(small) |
| wts := RandomSlice(small) |
| benchmarkStdDev(b, s, wts) |
| } |
| |
| func BenchmarkStdDevMediumWeighted(b *testing.B) { |
| s := RandomSlice(medium) |
| wts := RandomSlice(medium) |
| benchmarkStdDev(b, s, wts) |
| } |
| |
| func BenchmarkStdDevLargeWeighted(b *testing.B) { |
| s := RandomSlice(large) |
| wts := RandomSlice(large) |
| benchmarkStdDev(b, s, wts) |
| } |
| |
| func BenchmarkStdDevHugeWeighted(b *testing.B) { |
| s := RandomSlice(huge) |
| wts := RandomSlice(huge) |
| benchmarkStdDev(b, s, wts) |
| } |
| |
| func benchmarkMeanVariance(b *testing.B, s, wts []float64) { |
| b.ResetTimer() |
| for i := 0; i < b.N; i++ { |
| MeanVariance(s, wts) |
| } |
| } |
| |
| func BenchmarkMeanVarianceSmall(b *testing.B) { |
| s := RandomSlice(small) |
| benchmarkMeanVariance(b, s, nil) |
| } |
| |
| func BenchmarkMeanVarianceMedium(b *testing.B) { |
| s := RandomSlice(medium) |
| benchmarkMeanVariance(b, s, nil) |
| } |
| |
| func BenchmarkMeanVarianceLarge(b *testing.B) { |
| s := RandomSlice(large) |
| benchmarkMeanVariance(b, s, nil) |
| } |
| |
| func BenchmarkMeanVarianceHuge(b *testing.B) { |
| s := RandomSlice(huge) |
| benchmarkMeanVariance(b, s, nil) |
| } |
| |
| func BenchmarkMeanVarianceSmallWeighted(b *testing.B) { |
| s := RandomSlice(small) |
| wts := RandomSlice(small) |
| benchmarkMeanVariance(b, s, wts) |
| } |
| |
| func BenchmarkMeanVarianceMediumWeighted(b *testing.B) { |
| s := RandomSlice(medium) |
| wts := RandomSlice(medium) |
| benchmarkMeanVariance(b, s, wts) |
| } |
| |
| func BenchmarkMeanVarianceLargeWeighted(b *testing.B) { |
| s := RandomSlice(large) |
| wts := RandomSlice(large) |
| benchmarkMeanVariance(b, s, wts) |
| } |
| |
| func BenchmarkMeanVarianceHugeWeighted(b *testing.B) { |
| s := RandomSlice(huge) |
| wts := RandomSlice(huge) |
| benchmarkMeanVariance(b, s, wts) |
| } |
| |
| func benchmarkMeanStdDev(b *testing.B, s, wts []float64) { |
| b.ResetTimer() |
| for i := 0; i < b.N; i++ { |
| MeanStdDev(s, wts) |
| } |
| } |
| |
| func BenchmarkMeanStdDevSmall(b *testing.B) { |
| s := RandomSlice(small) |
| benchmarkMeanStdDev(b, s, nil) |
| } |
| |
| func BenchmarkMeanStdDevMedium(b *testing.B) { |
| s := RandomSlice(medium) |
| benchmarkMeanStdDev(b, s, nil) |
| } |
| |
| func BenchmarkMeanStdDevLarge(b *testing.B) { |
| s := RandomSlice(large) |
| benchmarkMeanStdDev(b, s, nil) |
| } |
| |
| func BenchmarkMeanStdDevHuge(b *testing.B) { |
| s := RandomSlice(huge) |
| benchmarkMeanStdDev(b, s, nil) |
| } |
| |
| func BenchmarkMeanStdDevSmallWeighted(b *testing.B) { |
| s := RandomSlice(small) |
| wts := RandomSlice(small) |
| benchmarkMeanStdDev(b, s, wts) |
| } |
| |
| func BenchmarkMeanStdDevMediumWeighted(b *testing.B) { |
| s := RandomSlice(medium) |
| wts := RandomSlice(medium) |
| benchmarkMeanStdDev(b, s, wts) |
| } |
| |
| func BenchmarkMeanStdDevLargeWeighted(b *testing.B) { |
| s := RandomSlice(large) |
| wts := RandomSlice(large) |
| benchmarkMeanStdDev(b, s, wts) |
| } |
| |
| func BenchmarkMeanStdDevHugeWeighted(b *testing.B) { |
| s := RandomSlice(huge) |
| wts := RandomSlice(huge) |
| benchmarkMeanStdDev(b, s, wts) |
| } |
| |
| func benchmarkCovariance(b *testing.B, s1, s2, wts []float64) { |
| b.ResetTimer() |
| for i := 0; i < b.N; i++ { |
| Covariance(s1, s2, wts) |
| } |
| } |
| |
| func BenchmarkCovarianceSmall(b *testing.B) { |
| s1 := RandomSlice(small) |
| s2 := RandomSlice(small) |
| benchmarkCovariance(b, s1, s2, nil) |
| } |
| |
| func BenchmarkCovarianceMedium(b *testing.B) { |
| s1 := RandomSlice(medium) |
| s2 := RandomSlice(medium) |
| benchmarkCovariance(b, s1, s2, nil) |
| } |
| |
| func BenchmarkCovarianceLarge(b *testing.B) { |
| s1 := RandomSlice(large) |
| s2 := RandomSlice(large) |
| benchmarkCovariance(b, s1, s2, nil) |
| } |
| |
| func BenchmarkCovarianceHuge(b *testing.B) { |
| s1 := RandomSlice(huge) |
| s2 := RandomSlice(huge) |
| benchmarkCovariance(b, s1, s2, nil) |
| } |
| |
| func BenchmarkCovarianceSmallWeighted(b *testing.B) { |
| s1 := RandomSlice(small) |
| s2 := RandomSlice(small) |
| wts := RandomSlice(small) |
| benchmarkCovariance(b, s1, s2, wts) |
| } |
| |
| func BenchmarkCovarianceMediumWeighted(b *testing.B) { |
| s1 := RandomSlice(medium) |
| s2 := RandomSlice(medium) |
| wts := RandomSlice(medium) |
| benchmarkCovariance(b, s1, s2, wts) |
| } |
| |
| func BenchmarkCovarianceLargeWeighted(b *testing.B) { |
| s1 := RandomSlice(large) |
| s2 := RandomSlice(large) |
| wts := RandomSlice(large) |
| benchmarkCovariance(b, s1, s2, wts) |
| } |
| |
| func BenchmarkCovarianceHugeWeighted(b *testing.B) { |
| s1 := RandomSlice(huge) |
| s2 := RandomSlice(huge) |
| wts := RandomSlice(huge) |
| benchmarkCovariance(b, s1, s2, wts) |
| } |
| |
| func benchmarkCorrelation(b *testing.B, s1, s2, wts []float64) { |
| b.ResetTimer() |
| for i := 0; i < b.N; i++ { |
| Correlation(s1, s2, wts) |
| } |
| } |
| |
| func BenchmarkCorrelationSmall(b *testing.B) { |
| s1 := RandomSlice(small) |
| s2 := RandomSlice(small) |
| benchmarkCorrelation(b, s1, s2, nil) |
| } |
| |
| func BenchmarkCorrelationMedium(b *testing.B) { |
| s1 := RandomSlice(medium) |
| s2 := RandomSlice(medium) |
| benchmarkCorrelation(b, s1, s2, nil) |
| } |
| |
| func BenchmarkCorrelationLarge(b *testing.B) { |
| s1 := RandomSlice(large) |
| s2 := RandomSlice(large) |
| benchmarkCorrelation(b, s1, s2, nil) |
| } |
| |
| func BenchmarkCorrelationHuge(b *testing.B) { |
| s1 := RandomSlice(huge) |
| s2 := RandomSlice(huge) |
| benchmarkCorrelation(b, s1, s2, nil) |
| } |
| |
| func BenchmarkCorrelationSmallWeighted(b *testing.B) { |
| s1 := RandomSlice(small) |
| s2 := RandomSlice(small) |
| wts := RandomSlice(small) |
| benchmarkCorrelation(b, s1, s2, wts) |
| } |
| |
| func BenchmarkCorrelationMediumWeighted(b *testing.B) { |
| s1 := RandomSlice(medium) |
| s2 := RandomSlice(medium) |
| wts := RandomSlice(medium) |
| benchmarkCorrelation(b, s1, s2, wts) |
| } |
| |
| func BenchmarkCorrelationLargeWeighted(b *testing.B) { |
| s1 := RandomSlice(large) |
| s2 := RandomSlice(large) |
| wts := RandomSlice(large) |
| benchmarkCorrelation(b, s1, s2, wts) |
| } |
| |
| func BenchmarkCorrelationHugeWeighted(b *testing.B) { |
| s1 := RandomSlice(huge) |
| s2 := RandomSlice(huge) |
| wts := RandomSlice(huge) |
| benchmarkCorrelation(b, s1, s2, wts) |
| } |
| |
| func benchmarkSkew(b *testing.B, s, wts []float64) { |
| b.ResetTimer() |
| for i := 0; i < b.N; i++ { |
| Skew(s, wts) |
| } |
| } |
| |
| func BenchmarkSkewSmall(b *testing.B) { |
| s := RandomSlice(small) |
| benchmarkSkew(b, s, nil) |
| } |
| |
| func BenchmarkSkewMedium(b *testing.B) { |
| s := RandomSlice(medium) |
| benchmarkSkew(b, s, nil) |
| } |
| |
| func BenchmarkSkewLarge(b *testing.B) { |
| s := RandomSlice(large) |
| benchmarkSkew(b, s, nil) |
| } |
| |
| func BenchmarkSkewHuge(b *testing.B) { |
| s := RandomSlice(huge) |
| benchmarkSkew(b, s, nil) |
| } |
| |
| func BenchmarkSkewSmallWeighted(b *testing.B) { |
| s := RandomSlice(small) |
| wts := RandomSlice(small) |
| benchmarkSkew(b, s, wts) |
| } |
| |
| func BenchmarkSkewMediumWeighted(b *testing.B) { |
| s := RandomSlice(medium) |
| wts := RandomSlice(medium) |
| benchmarkSkew(b, s, wts) |
| } |
| |
| func BenchmarkSkewLargeWeighted(b *testing.B) { |
| s := RandomSlice(large) |
| wts := RandomSlice(large) |
| benchmarkSkew(b, s, wts) |
| } |
| |
| func BenchmarkSkewHugeWeighted(b *testing.B) { |
| s := RandomSlice(huge) |
| wts := RandomSlice(huge) |
| benchmarkSkew(b, s, wts) |
| } |
| |
| func benchmarkExKurtosis(b *testing.B, s, wts []float64) { |
| b.ResetTimer() |
| for i := 0; i < b.N; i++ { |
| ExKurtosis(s, wts) |
| } |
| } |
| |
| func BenchmarkExKurtosisSmall(b *testing.B) { |
| s := RandomSlice(small) |
| benchmarkExKurtosis(b, s, nil) |
| } |
| |
| func BenchmarkExKurtosisMedium(b *testing.B) { |
| s := RandomSlice(medium) |
| benchmarkExKurtosis(b, s, nil) |
| } |
| |
| func BenchmarkExKurtosisLarge(b *testing.B) { |
| s := RandomSlice(large) |
| benchmarkExKurtosis(b, s, nil) |
| } |
| |
| func BenchmarkExKurtosisHuge(b *testing.B) { |
| s := RandomSlice(huge) |
| benchmarkExKurtosis(b, s, nil) |
| } |
| |
| func BenchmarkExKurtosisSmallWeighted(b *testing.B) { |
| s := RandomSlice(small) |
| wts := RandomSlice(small) |
| benchmarkExKurtosis(b, s, wts) |
| } |
| |
| func BenchmarkExKurtosisMediumWeighted(b *testing.B) { |
| s := RandomSlice(medium) |
| wts := RandomSlice(medium) |
| benchmarkExKurtosis(b, s, wts) |
| } |
| |
| func BenchmarkExKurtosisLargeWeighted(b *testing.B) { |
| s := RandomSlice(large) |
| wts := RandomSlice(large) |
| benchmarkExKurtosis(b, s, wts) |
| } |
| |
| func BenchmarkExKurtosisHugeWeighted(b *testing.B) { |
| s := RandomSlice(huge) |
| wts := RandomSlice(huge) |
| benchmarkExKurtosis(b, s, wts) |
| } |
| |
| func benchmarkMoment(b *testing.B, n float64, s, wts []float64) { |
| b.ResetTimer() |
| for i := 0; i < b.N; i++ { |
| Moment(n, s, wts) |
| } |
| } |
| |
| func BenchmarkMomentSmall(b *testing.B) { |
| s := RandomSlice(small) |
| benchmarkMoment(b, 5, s, nil) |
| } |
| |
| func BenchmarkMomentMedium(b *testing.B) { |
| s := RandomSlice(medium) |
| benchmarkMoment(b, 5, s, nil) |
| } |
| |
| func BenchmarkMomentLarge(b *testing.B) { |
| s := RandomSlice(large) |
| benchmarkMoment(b, 5, s, nil) |
| } |
| |
| func BenchmarkMomentHuge(b *testing.B) { |
| s := RandomSlice(huge) |
| benchmarkMoment(b, 5, s, nil) |
| } |
| |
| func BenchmarkMomentSmallWeighted(b *testing.B) { |
| s := RandomSlice(small) |
| wts := RandomSlice(small) |
| benchmarkMoment(b, 5, s, wts) |
| } |
| |
| func BenchmarkMomentMediumWeighted(b *testing.B) { |
| s := RandomSlice(medium) |
| wts := RandomSlice(medium) |
| benchmarkMoment(b, 5, s, wts) |
| } |
| |
| func BenchmarkMomentLargeWeighted(b *testing.B) { |
| s := RandomSlice(large) |
| wts := RandomSlice(large) |
| benchmarkMoment(b, 5, s, wts) |
| } |
| |
| func BenchmarkMomentHugeWeighted(b *testing.B) { |
| s := RandomSlice(huge) |
| wts := RandomSlice(huge) |
| benchmarkMoment(b, 5, s, wts) |
| } |
| |
| func benchmarkMomentAbout(b *testing.B, n float64, s []float64, mean float64, wts []float64) { |
| b.ResetTimer() |
| for i := 0; i < b.N; i++ { |
| MomentAbout(n, s, mean, wts) |
| } |
| } |
| |
| func BenchmarkMomentAboutSmall(b *testing.B) { |
| s := RandomSlice(small) |
| benchmarkMomentAbout(b, 5, s, 0, nil) |
| } |
| |
| func BenchmarkMomentAboutMedium(b *testing.B) { |
| s := RandomSlice(medium) |
| benchmarkMomentAbout(b, 5, s, 0, nil) |
| } |
| |
| func BenchmarkMomentAboutLarge(b *testing.B) { |
| s := RandomSlice(large) |
| benchmarkMomentAbout(b, 5, s, 0, nil) |
| } |
| |
| func BenchmarkMomentAboutHuge(b *testing.B) { |
| s := RandomSlice(huge) |
| benchmarkMomentAbout(b, 5, s, 0, nil) |
| } |
| |
| func BenchmarkMomentAboutSmallWeighted(b *testing.B) { |
| s := RandomSlice(small) |
| wts := RandomSlice(small) |
| benchmarkMomentAbout(b, 5, s, 0, wts) |
| } |
| |
| func BenchmarkMomentAboutMediumWeighted(b *testing.B) { |
| s := RandomSlice(medium) |
| wts := RandomSlice(medium) |
| benchmarkMomentAbout(b, 5, s, 0, wts) |
| } |
| |
| func BenchmarkMomentAboutLargeWeighted(b *testing.B) { |
| s := RandomSlice(large) |
| wts := RandomSlice(large) |
| benchmarkMomentAbout(b, 5, s, 0, wts) |
| } |
| |
| func BenchmarkMomentAboutHugeWeighted(b *testing.B) { |
| s := RandomSlice(huge) |
| wts := RandomSlice(huge) |
| benchmarkMomentAbout(b, 5, s, 0, wts) |
| } |