github.com/influx6/npkg@v0.8.8/natomic/natomic_test.go (about) 1 package natomic 2 3 import ( 4 "sync" 5 "sync/atomic" 6 "testing" 7 ) 8 9 func TestAtomicCounter(t *testing.T) { 10 var ws IntCounter 11 var waiter sync.WaitGroup 12 for i := 0; i < 100; i++ { 13 waiter.Add(1) 14 go func() { 15 defer waiter.Done() 16 for i := 0; i < 1000; i++ { 17 ws.Add(i) 18 } 19 }() 20 21 waiter.Add(1) 22 go func() { 23 defer waiter.Done() 24 for i := 0; i < 1000; i++ { 25 ws.Read() 26 } 27 }() 28 } 29 30 for i := 0; i < 1000; i++ { 31 ws.Read() 32 } 33 34 waiter.Wait() 35 } 36 37 func BenchmarkIntSwitchWrite(b *testing.B) { 38 b.ResetTimer() 39 b.ReportAllocs() 40 41 var ws IntSwitch 42 for i := 0; i < b.N; i++ { 43 ws.Flip(i) 44 } 45 } 46 47 func BenchmarkAtomicCounter(b *testing.B) { 48 b.ResetTimer() 49 b.ReportAllocs() 50 51 var ws IntCounter 52 var waiter sync.WaitGroup 53 for i := 0; i < 100; i++ { 54 waiter.Add(1) 55 go func() { 56 defer waiter.Done() 57 for i := 0; i < 1000; i++ { 58 ws.Add(i) 59 } 60 }() 61 62 waiter.Add(1) 63 go func() { 64 defer waiter.Done() 65 for i := 0; i < 1000; i++ { 66 ws.Read() 67 } 68 }() 69 } 70 71 for i := 0; i < 1000; i++ { 72 ws.Read() 73 } 74 75 waiter.Wait() 76 } 77 78 func BenchmarkAtomicInt(b *testing.B) { 79 b.ResetTimer() 80 b.ReportAllocs() 81 82 var ws int64 83 var waiter sync.WaitGroup 84 for i := 0; i < 100; i++ { 85 waiter.Add(1) 86 go func() { 87 defer waiter.Done() 88 for i := 0; i < 1000; i++ { 89 atomic.AddInt64(&ws, 1) 90 } 91 }() 92 } 93 94 for i := 0; i < 100; i++ { 95 waiter.Add(1) 96 go func() { 97 defer waiter.Done() 98 for i := 0; i < 1000; i++ { 99 atomic.LoadInt64(&ws) 100 } 101 }() 102 } 103 104 for i := 0; i < 1000; i++ { 105 atomic.LoadInt64(&ws) 106 } 107 108 waiter.Wait() 109 } 110 111 func BenchmarkUintSwitchWrite(b *testing.B) { 112 b.ResetTimer() 113 b.ReportAllocs() 114 115 var ws UintSwitch 116 for i := 0; i < b.N; i++ { 117 ws.Flip(uint(i)) 118 } 119 } 120 121 func BenchmarkBoolSwitchWrite(b *testing.B) { 122 b.ResetTimer() 123 b.ReportAllocs() 124 125 var ws BoolSwitch 126 for i := 0; i < b.N; i++ { 127 ws.Flip(true) 128 } 129 } 130 131 func BenchmarkIntSwitchRead(b *testing.B) { 132 b.ResetTimer() 133 b.ReportAllocs() 134 135 var ws IntSwitch 136 ws.Flip(1) 137 for i := 0; i < b.N; i++ { 138 ws.Read() 139 } 140 } 141 142 func BenchmarkUintSwitchRead(b *testing.B) { 143 b.ResetTimer() 144 b.ReportAllocs() 145 146 var ws UintSwitch 147 ws.Flip(1) 148 for i := 0; i < b.N; i++ { 149 ws.Read() 150 } 151 } 152 153 func BenchmarkBoolSwitchRead(b *testing.B) { 154 b.ResetTimer() 155 b.ReportAllocs() 156 157 var ws BoolSwitch 158 ws.Flip(true) 159 for i := 0; i < b.N; i++ { 160 ws.Read() 161 } 162 } 163 164 func BenchmarkAtomWrite(b *testing.B) { 165 b.ResetTimer() 166 b.ReportAllocs() 167 168 var ws = NewAtom(nil) 169 ws.Set(1) 170 171 for i := 0; i < b.N; i++ { 172 ws.Set(i) 173 } 174 } 175 176 func BenchmarkAtomRead(b *testing.B) { 177 b.ResetTimer() 178 b.ReportAllocs() 179 180 var ws = NewAtom(nil) 181 ws.Set(1) 182 for i := 0; i < b.N; i++ { 183 ws.Read() 184 } 185 }