github.com/andy2046/gopie@v0.7.0/pkg/spsc/spsc_test.go (about) 1 package spsc_test 2 3 import ( 4 . "github.com/andy2046/gopie/pkg/spsc" 5 "runtime" 6 "sync" 7 "testing" 8 "time" 9 ) 10 11 func BenchmarkSPSC_NonBlocking(b *testing.B) { 12 var sp = New(8192) 13 var wg sync.WaitGroup 14 wg.Add(2) 15 type T struct { 16 i int 17 } 18 var v = T{5} 19 b.ResetTimer() 20 go func(n int) { 21 runtime.LockOSThread() 22 for i := 0; i < n; i++ { 23 for !sp.Offer(&v) { 24 runtime.Gosched() 25 } 26 } 27 wg.Done() 28 }(b.N) 29 30 go func(n int) { 31 runtime.LockOSThread() 32 var v *T 33 for i := 0; i < n; i++ { 34 for !sp.Poll(&v) { 35 runtime.Gosched() 36 } 37 _ = *v 38 } 39 wg.Done() 40 }(b.N) 41 42 wg.Wait() 43 } 44 45 func BenchmarkSPSC_NonBlocking2(b *testing.B) { 46 var sp = New(8192) 47 var wg sync.WaitGroup 48 wg.Add(2) 49 type T struct { 50 i int 51 } 52 p := runtime.GOMAXPROCS(1) 53 var v = T{5} 54 b.ResetTimer() 55 go func(n int) { 56 for i := 0; i < n; i++ { 57 for !sp.Offer(&v) { 58 runtime.Gosched() 59 } 60 } 61 wg.Done() 62 }(b.N) 63 64 go func(n int) { 65 var v *T 66 for i := 0; i < n; i++ { 67 for !sp.Poll(&v) { 68 runtime.Gosched() 69 } 70 _ = *v 71 } 72 wg.Done() 73 }(b.N) 74 75 wg.Wait() 76 runtime.GOMAXPROCS(p) 77 } 78 79 func BenchmarkSPSC_Blocking(b *testing.B) { 80 var sp = New(8192) 81 var wg sync.WaitGroup 82 wg.Add(2) 83 type T struct { 84 i int 85 } 86 var v = T{5} 87 b.ResetTimer() 88 go func(n int) { 89 runtime.LockOSThread() 90 for i := 0; i < n; i++ { 91 sp.Put(&v) 92 } 93 sp.Close() 94 wg.Done() 95 }(b.N) 96 97 go func(n int) { 98 runtime.LockOSThread() 99 var v *T 100 for i := 0; sp.Get(&v); i++ { 101 _ = *v 102 } 103 wg.Done() 104 }(b.N) 105 106 wg.Wait() 107 } 108 109 func BenchmarkSPSC_Blocking2(b *testing.B) { 110 var sp = New(8192) 111 var wg sync.WaitGroup 112 wg.Add(2) 113 type T struct { 114 i int 115 } 116 p := runtime.GOMAXPROCS(1) 117 var v = T{5} 118 b.ResetTimer() 119 go func(n int) { 120 for i := 0; i < b.N; i++ { 121 sp.Put(&v) 122 } 123 sp.Close() 124 wg.Done() 125 }(b.N) 126 127 go func(n int) { 128 var v *T 129 for i := 0; sp.Get(&v); i++ { 130 _ = *v 131 } 132 wg.Done() 133 }(b.N) 134 135 wg.Wait() 136 runtime.GOMAXPROCS(p) 137 } 138 139 func TestSPSC_NonBlocking(t *testing.T) { 140 const N = 1000 141 var sp = New(4) 142 var wg sync.WaitGroup 143 wg.Add(2) 144 t1 := time.Now() 145 go func(n int) { 146 defer wg.Done() 147 for i := 0; i < n; i++ { 148 for !sp.Offer(int64(i)) { 149 runtime.Gosched() 150 } 151 time.Sleep(1 * time.Microsecond) 152 } 153 }(N) 154 go func(n int) { 155 defer wg.Done() 156 var v *int 157 for i := 0; i < n; i++ { 158 for !sp.Poll(&v) { 159 runtime.Gosched() 160 } 161 if i != *v { 162 t.Fatalf("Expected %d, but got %d", i, *v) 163 panic(i) 164 } 165 } 166 }(N) 167 wg.Wait() 168 t.Log(time.Since(t1)) 169 } 170 171 func TestSPSC_Blocking(t *testing.T) { 172 const N = 1000 173 var sp = New(4) 174 var wg sync.WaitGroup 175 wg.Add(2) 176 t1 := time.Now() 177 go func(n int) { 178 defer wg.Done() 179 for i := 0; i < n; i++ { 180 sp.Put(int64(i)) 181 time.Sleep(1 * time.Microsecond) 182 } 183 sp.Close() 184 }(N) 185 go func(n int) { 186 defer wg.Done() 187 var v *int 188 for i := 0; sp.Get(&v); i++ { 189 if i != *v { 190 t.Fatalf("Expected %d, but got %d", i, *v) 191 panic(i) 192 } 193 } 194 }(N) 195 wg.Wait() 196 t.Log(time.Since(t1)) 197 }