Skip to content

Commit a7242cb

Browse files
committed
add benchmark
1 parent f7964b6 commit a7242cb

File tree

2 files changed

+71
-111
lines changed

2 files changed

+71
-111
lines changed

tut/stat/stat.go

Lines changed: 22 additions & 109 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,7 @@
11
package main
22

33
import (
4-
"bufio"
5-
"fmt"
6-
"log"
74
"math"
8-
"os"
9-
"strconv"
105
)
116

127
type Stats struct {
@@ -18,19 +13,15 @@ func (s *Stats) Add(x ...float64) { //append
1813
}
1914

2015
func (s *Stats) Mean() float64 {
21-
var x float64
22-
x = 0
23-
var i int
24-
for i = 0; i < len(s.data); i++ {
25-
x = x + s.data[i]
16+
mean := 0.0
17+
for _, x := range s.data {
18+
mean += x
2619
}
27-
x = x / float64(len(s.data)) //has to divide float by float, not float by integer
28-
return x
20+
return mean / float64(len(s.data)) //has to divide float by float, not float by integer
2921
}
3022

3123
func (s *Stats) Min() float64 {
32-
var min float64
33-
min = 1e100
24+
min := math.MaxFloat64
3425
for _, x := range s.data {
3526
if x < min {
3627
min = x
@@ -39,102 +30,29 @@ func (s *Stats) Min() float64 {
3930
return min
4031
}
4132

42-
func (s *Stats) Add(x ...float64) {
43-
s.data = append(s.data, x...)
44-
}
45-
46-
func (s *Stats) Mean() float64 {
47-
var x float64
48-
x = 0
49-
var i int
50-
for i = 0; i < len(s.data); i++ {
51-
x = x + s.data[i]
52-
}
53-
x = x / float64(len(s.data))
54-
return x
55-
}
56-
5733
func (s *Stats) Max() float64 {
58-
var max float64
59-
max = 0
60-
var i int
61-
for i = 0; i < len(s.data); i++ {
62-
if s.data[i] > max {
63-
max = s.data[i]
34+
max := -math.MaxFloat64
35+
for _, x := range s.data {
36+
if x > max {
37+
max = x
6438
}
6539
}
66-
6740
return max
6841
}
6942

70-
func (s *Stats) Min() float64 {
71-
var max float64
72-
max = 0
73-
var i int
74-
for i = 0; i < len(s.data); i++ {
75-
if s.data[i] > max {
76-
max = s.data[i]
77-
}
43+
func (s *Stats) Stan() float64 {
44+
stdev := 0.0
45+
for _, x := range s.data {
46+
stdev += (x - s.Mean()) * (x - s.Mean())
7847
}
79-
80-
return max
48+
stdev = stdev / float64(len(s.data))
49+
stdev = math.Sqrt(stdev)
50+
return stdev
8151
}
82-
func main() {
83-
fin, err := os.Open("CFSB.csv") //reading in data set
84-
if err != nil {
85-
log.Fatal(err)
86-
}
87-
defer fin.Close()
88-
s := bufio.NewScanner(fin)
89-
var data []float64
90-
for s.Scan() {
91-
x, err := strconv.ParseFloat(s.Text(), 64)
92-
if err != nil {
93-
log.Fatal(err)
94-
}
95-
data = append(data, x)
96-
}
97-
98-
var mean float64 //calcs stats
99-
for _, x := range data {
100-
mean = mean + x
101-
}
102-
mean = mean / float64(len(data))
103-
fmt.Printf("Mean: %.3f\n", mean)
10452

105-
var max float64
106-
for _, x := range data {
107-
if x > max {
108-
max = x
109-
}
110-
}
111-
fmt.Printf("Max: %.3f\n", max)
112-
113-
var min float64
114-
min = max + 1
115-
for _, x := range data {
116-
if x < min {
117-
min = x
118-
}
119-
}
120-
fmt.Printf("Min: %.3f\n", min)
121-
122-
var hist = map[float64]int{}
123-
for _, x := range data {
124-
hist[x]++
125-
}
126-
var key float64
127-
var val int
128-
for k, v := range hist {
129-
if v > val {
130-
val = v
131-
key = k
132-
}
133-
}
134-
fmt.Printf("Mode: %.3f (%d)\n", key, val)
135-
136-
sorted := make([]float64, len(data))
137-
copy(sorted, data)
53+
func (s *Stats) Sort() []float64 {
54+
sorted := make([]float64, len(s.data))
55+
copy(sorted, s.data)
13856
// Insertion sort from https://en.wikipedia.org/wiki/Insertion_sort
13957
i := 1
14058
for i < len(sorted) {
@@ -145,13 +63,8 @@ func main() {
14563
}
14664
i++
14765
}
148-
fmt.Printf("Median: %.3f\n", sorted[len(sorted)/2])
66+
return sorted
67+
}
14968

150-
var stdev float64
151-
for _, x := range data {
152-
stdev += (x - mean) * (x - mean)
153-
}
154-
stdev /= float64(len(data) - 1)
155-
stdev = math.Sqrt(stdev)
156-
fmt.Printf("Std Dev: %.3f\n", stdev)
69+
func main() {
15770
}

tut/stat/stat_test.go

Lines changed: 49 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,31 @@
11
package main
22

3-
import "testing"
3+
import (
4+
"bufio"
5+
"math"
6+
"os"
7+
"strconv"
8+
"testing"
9+
)
10+
11+
// cfsbData loads the Chocolate Frosted Sugar Bomb data into a Stats struct
12+
func cfsbData(tb testing.TB) *Stats {
13+
fin, err := os.Open("CFSB.csv") //reading in data set
14+
if err != nil {
15+
tb.Fatal(err)
16+
}
17+
defer fin.Close()
18+
var st Stats
19+
s := bufio.NewScanner(fin)
20+
for s.Scan() {
21+
x, err := strconv.ParseFloat(s.Text(), 64)
22+
if err != nil {
23+
tb.Fatal(err)
24+
}
25+
st.Add(x)
26+
}
27+
return &st
28+
}
429

530
func TestMean(t *testing.T) {
631
var st Stats
@@ -24,6 +49,7 @@ func TestMax(t *testing.T) {
2449
if got != want {
2550
t.Errorf("got: %f, want: %f", got, want)
2651
}
52+
}
2753

2854
func TestMin(t *testing.T) {
2955
var st Stats
@@ -37,7 +63,19 @@ func TestMin(t *testing.T) {
3763
}
3864
}
3965

40-
func TestMax(t *testing.T) {
66+
func TestStan(t *testing.T) {
67+
var st Stats
68+
st.Add(4, 8, 10)
69+
var got float64
70+
var want float64
71+
got = st.Stan()
72+
want = 2.494438258
73+
if math.Abs(got-want) > 0.0001 {
74+
t.Errorf("got: %f, want: %f", got, want)
75+
}
76+
}
77+
78+
func TestSort(t *testing.T) {
4179
}
4280

4381
func TestMode(t *testing.T) {
@@ -46,7 +84,13 @@ func TestMode(t *testing.T) {
4684
func TestMedian(t *testing.T) {
4785
}
4886

87+
var sink float64
88+
4989
func BenchmarkMean(b *testing.B) {
90+
st := cfsbData(b)
91+
for i := 0; i < b.N; i++ {
92+
sink = st.Mean()
93+
}
5094
}
5195

5296
func BenchmarkMax(b *testing.B) {
@@ -60,3 +104,6 @@ func BenchmarkMode(b *testing.B) {
60104

61105
func BenchmarkMedian(b *testing.B) {
62106
}
107+
108+
func BenchmarkSort(b *testing.B) {
109+
}

0 commit comments

Comments
 (0)