1
2
3
4
5 package test
6
7 import (
8 "sync/atomic"
9 "testing"
10 )
11
12 func locals() {
13 var x int64
14 var y int32
15 var z int16
16 var w int8
17 sink64 = &x
18 sink32 = &y
19 sink16 = &z
20 sink8 = &w
21 }
22
23
24 func args(x int64, y int32, z int16, w int8) {
25 sink64 = &x
26 sink32 = &y
27 sink16 = &z
28 sink8 = &w
29
30 }
31
32
33 func half(x int64, y int16) {
34 var z int32
35 var w int8
36 sink64 = &x
37 sink16 = &y
38 sink32 = &z
39 sink8 = &w
40 }
41
42
43 func closure() func() {
44 var x int64
45 var y int32
46 var z int16
47 var w int8
48 _, _, _, _ = x, y, z, w
49 return func() {
50 x = 1
51 y = 2
52 z = 3
53 w = 4
54 }
55 }
56
57
58 func atomicFn() {
59 var x int32
60 var y int64
61 var z int16
62 var w int8
63 sink32 = &x
64 sink64 = &y
65 sink16 = &z
66 sink8 = &w
67 atomic.StoreInt64(&y, 7)
68 }
69
70 var sink64 *int64
71 var sink32 *int32
72 var sink16 *int16
73 var sink8 *int8
74
75 func TestLocalAllocations(t *testing.T) {
76 type test struct {
77 name string
78 f func()
79 want int
80 }
81 for _, tst := range []test{
82 {"locals", locals, 1},
83 {"args", func() { args(1, 2, 3, 4) }, 1},
84 {"half", func() { half(1, 2) }, 1},
85 {"closure", func() { _ = closure() }, 2},
86 {"atomic", atomicFn, 1},
87 } {
88 allocs := testing.AllocsPerRun(100, tst.f)
89 if allocs != float64(tst.want) {
90 t.Errorf("test %s uses %v allocs, want %d", tst.name, allocs, tst.want)
91 }
92 }
93 }
94
View as plain text