-
Notifications
You must be signed in to change notification settings - Fork 0
/
median_test.go
61 lines (50 loc) · 1.42 KB
/
median_test.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
package median
import "testing"
import "math/rand"
import "strconv"
import "github.com/montanaflynn/stats"
type testCase struct {
length int
data []float64
expect float64
}
var testCases = []testCase{{1024 + 1, []float64{}, 1.0}, {2048 + 1, []float64{}, 3.0}, {4096 + 1, []float64{}, 5.0}, {16777216 + 1, []float64{}, 5.0}}
func init() {
for i := 0; i < len(testCases); i++ {
testCases[i].data = generateRandom(testCases[i].length)
testCases[i].expect, _ = stats.Median(testCases[i].data)
}
}
func generateRandom(length int) []float64 {
r := make([]float64, length, length)
for i := 0; i < length; i++ {
r[i] = rand.Float64()
}
return r
}
func TestMedian(t *testing.T) {
for i := 0; i < len(testCases)-1; i++ {
m := ParallelMedian(Float64Slice(testCases[i].data), 0.0, 1.0)
if m != testCases[i].expect {
t.Errorf("Median was incorrect, got: %v, want: %v.", m, testCases[i].expect)
}
}
}
func BenchmarkParallelMedian(b *testing.B) {
for i := 2; i < testCases[len(testCases)-1].length; i *= 2 {
b.Run(strconv.Itoa(i), func(b *testing.B) {
for n := 0; n < b.N; n++ {
ParallelMedian(Float64Slice(testCases[len(testCases)-1].data[0:i]), 0.0, 1.0)
}
})
}
}
func BenchmarkMedianSorting(b *testing.B) {
for i := 2; i < testCases[len(testCases)-1].length; i *= 2 {
b.Run(strconv.Itoa(i), func(b *testing.B) {
for n := 0; n < b.N; n++ {
stats.Median(testCases[len(testCases)-1].data[0:i])
}
})
}
}