-
Notifications
You must be signed in to change notification settings - Fork 0
/
fibber.go
93 lines (77 loc) · 1.42 KB
/
fibber.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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
package main
import (
"flag"
"fmt"
"sync"
"unsafe"
)
const fibberCount = 32
var fibbers [fibberCount]fibber
type fibber struct {
last int
val int
sync.Mutex
pad [PadSize]int
}
func (f *fibber) fibon() {
f.Lock()
defer f.Unlock()
if f.val == 0 {
f.val = 1
} else if f.last == 0 {
f.last = 1
} else {
last := f.val
f.val = f.val + f.last
f.last = last
}
}
func (f *fibber) String() string {
return fmt.Sprintf("%v", f.val)
}
func describe() {
fmt.Printf("Addresses of our fibbers (%d bytes):\n", unsafe.Sizeof(fibber{}))
var plast unsafe.Pointer
for i := range fibbers {
p := unsafe.Pointer(&fibbers[i])
if plast != nil {
fmt.Printf("+ %d", uintptr(p)-uintptr(plast))
} else {
fmt.Printf("+ 0")
}
plast = p
fmt.Printf("\t0x%x\n", p)
}
}
func fibberize(fib *fibber, runs int, w *sync.WaitGroup) {
for i := 0; i < runs; i++ {
fib.fibon()
// fmt.Printf("%s\n", fib)
}
w.Done()
}
// Run is the main entry for a test run
func Run(gof int, runs int, overlap int) {
var w sync.WaitGroup
o := 0
for i := 0; i < gof; i++ {
w.Add(1)
go fibberize(&fibbers[o], runs, &w)
o++
if o == overlap {
o = 0
}
}
w.Wait()
}
func main() {
funcs := flag.Int("f", 0, "num gofunc")
runs := flag.Int("r", 0, "num runs per")
overlap := flag.Int("o", 0, "overlap count")
descr := flag.Int("d", 1, "describe")
flag.Parse()
if *descr != 0 {
describe()
}
Run(*funcs, *runs, *overlap)
}