Skip to content

Commit 12be04b

Browse files
committed
refactor
1 parent 7fa4e6c commit 12be04b

File tree

4 files changed

+157
-53
lines changed

4 files changed

+157
-53
lines changed

Diff for: README.md

+32-32
Original file line numberDiff line numberDiff line change
@@ -169,43 +169,43 @@ Computed from benchstat of 30 benchmarks each via go test -benchmem -bench=. ben
169169

170170
name time/op
171171
_Chan_NumWriters1_InputSize600-8 23.4µs ± 1%
172-
_ZenQ_NumWriters1_InputSize600-8 17.7µs ± 0%
173-
_Chan_NumWriters3_InputSize60000-8 5.54ms ± 5%
174-
_ZenQ_NumWriters3_InputSize60000-8 2.63ms ± 2%
175-
_Chan_NumWriters8_InputSize6000000-8 687ms ± 2%
176-
_ZenQ_NumWriters8_InputSize6000000-8 243ms ± 4%
177-
_Chan_NumWriters100_InputSize6000000-8 1.59s ± 4%
178-
_ZenQ_NumWriters100_InputSize6000000-8 296ms ± 2%
179-
_Chan_NumWriters1000_InputSize7000000-8 1.97s ± 0%
180-
_ZenQ_NumWriters1000_InputSize7000000-8 409ms ± 2%
181-
_Chan_Million_Blocking_Writers-8 10.4s ± 4%
182-
_ZenQ_Million_Blocking_Writers-8 1.83s ±10%
172+
_ZenQ_NumWriters1_InputSize600-8 18.0µs ± 1%
173+
_Chan_NumWriters3_InputSize60000-8 5.35ms ± 3%
174+
_ZenQ_NumWriters3_InputSize60000-8 2.39ms ± 5%
175+
_Chan_NumWriters8_InputSize6000000-8 674ms ± 2%
176+
_ZenQ_NumWriters8_InputSize6000000-8 236ms ± 2%
177+
_Chan_NumWriters100_InputSize6000000-8 1.58s ± 6%
178+
_ZenQ_NumWriters100_InputSize6000000-8 312ms ± 2%
179+
_Chan_NumWriters1000_InputSize7000000-8 1.97s ± 1%
180+
_ZenQ_NumWriters1000_InputSize7000000-8 397ms ± 4%
181+
_Chan_Million_Blocking_Writers-8 11.0s ± 2%
182+
_ZenQ_Million_Blocking_Writers-8 2.59s ±10%
183183

184184
name alloc/op
185-
_Chan_NumWriters1_InputSize600-8 0.00B
186-
_ZenQ_NumWriters1_InputSize600-8 0.00B
187-
_Chan_NumWriters3_InputSize60000-8 117B ±63%
188-
_ZenQ_NumWriters3_InputSize60000-8 22.1B ±122%
189-
_Chan_NumWriters8_InputSize6000000-8 1.01kB ±196%
190-
_ZenQ_NumWriters8_InputSize6000000-8 1.12kB ±89%
191-
_Chan_NumWriters100_InputSize6000000-8 42.6kB ±37%
192-
_ZenQ_NumWriters100_InputSize6000000-8 11.3kB ±28%
193-
_Chan_NumWriters1000_InputSize7000000-8 481kB ± 7%
194-
_ZenQ_NumWriters1000_InputSize7000000-8 90.5kB ± 6%
185+
_Chan_NumWriters1_InputSize600-8 0.00B
186+
_ZenQ_NumWriters1_InputSize600-8 0.00B
187+
_Chan_NumWriters3_InputSize60000-8 114B ±82%
188+
_ZenQ_NumWriters3_InputSize60000-8 23.6B ±112%
189+
_Chan_NumWriters8_InputSize6000000-8 733B ±260%
190+
_ZenQ_NumWriters8_InputSize6000000-8 1.02kB ±121%
191+
_Chan_NumWriters100_InputSize6000000-8 43.7kB ±40%
192+
_ZenQ_NumWriters100_InputSize6000000-8 11.2kB ±54%
193+
_Chan_NumWriters1000_InputSize7000000-8 474kB ± 7%
194+
_ZenQ_NumWriters1000_InputSize7000000-8 90.0kB ± 6%
195195
_Chan_Million_Blocking_Writers-8 553MB ± 0%
196-
_ZenQ_Million_Blocking_Writers-8 123MB ± 4%
196+
_ZenQ_Million_Blocking_Writers-8 121MB ± 4%
197197

198198
name allocs/op
199-
_Chan_NumWriters1_InputSize600-8 0.00
200-
_ZenQ_NumWriters1_InputSize600-8 0.00
201-
_Chan_NumWriters3_InputSize60000-8 0.00
202-
_ZenQ_NumWriters3_InputSize60000-8 0.00
203-
_Chan_NumWriters8_InputSize6000000-8 3.43 ±162%
204-
_ZenQ_NumWriters8_InputSize6000000-8 5.23 ±53%
205-
_Chan_NumWriters100_InputSize6000000-8 158 ±20%
206-
_ZenQ_NumWriters100_InputSize6000000-8 26.3 ±29%
207-
_Chan_NumWriters1000_InputSize7000000-8 1.76k ± 2%
208-
_ZenQ_NumWriters1000_InputSize7000000-8 48.3 ±28%
199+
_Chan_NumWriters1_InputSize600-8 0.00
200+
_ZenQ_NumWriters1_InputSize600-8 0.00
201+
_Chan_NumWriters3_InputSize60000-8 0.00
202+
_ZenQ_NumWriters3_InputSize60000-8 0.00
203+
_Chan_NumWriters8_InputSize6000000-8 2.18 ±175%
204+
_ZenQ_NumWriters8_InputSize6000000-8 5.13 ±56%
205+
_Chan_NumWriters100_InputSize6000000-8 157 ±30%
206+
_ZenQ_NumWriters100_InputSize6000000-8 26.3 ±56%
207+
_Chan_NumWriters1000_InputSize7000000-8 1.76k ± 4%
208+
_ZenQ_NumWriters1000_InputSize7000000-8 47.1 ±29%
209209
_Chan_Million_Blocking_Writers-8 2.00M ± 0%
210210
_ZenQ_Million_Blocking_Writers-8 1.00M ± 0%
211211
```

Diff for: bench_reports/darwin_arm64_m1/2.7.0.txt

+41
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
name time/op
2+
_Chan_NumWriters1_InputSize600-8 23.4µs ± 1%
3+
_ZenQ_NumWriters1_InputSize600-8 18.0µs ± 1%
4+
_Chan_NumWriters3_InputSize60000-8 5.35ms ± 3%
5+
_ZenQ_NumWriters3_InputSize60000-8 2.39ms ± 5%
6+
_Chan_NumWriters8_InputSize6000000-8 674ms ± 2%
7+
_ZenQ_NumWriters8_InputSize6000000-8 236ms ± 2%
8+
_Chan_NumWriters100_InputSize6000000-8 1.58s ± 6%
9+
_ZenQ_NumWriters100_InputSize6000000-8 312ms ± 2%
10+
_Chan_NumWriters1000_InputSize7000000-8 1.97s ± 1%
11+
_ZenQ_NumWriters1000_InputSize7000000-8 397ms ± 4%
12+
_Chan_Million_Blocking_Writers-8 11.0s ± 2%
13+
_ZenQ_Million_Blocking_Writers-8 2.59s ±10%
14+
15+
name alloc/op
16+
_Chan_NumWriters1_InputSize600-8 0.00B
17+
_ZenQ_NumWriters1_InputSize600-8 0.00B
18+
_Chan_NumWriters3_InputSize60000-8 114B ±82%
19+
_ZenQ_NumWriters3_InputSize60000-8 23.6B ±112%
20+
_Chan_NumWriters8_InputSize6000000-8 733B ±260%
21+
_ZenQ_NumWriters8_InputSize6000000-8 1.02kB ±121%
22+
_Chan_NumWriters100_InputSize6000000-8 43.7kB ±40%
23+
_ZenQ_NumWriters100_InputSize6000000-8 11.2kB ±54%
24+
_Chan_NumWriters1000_InputSize7000000-8 474kB ± 7%
25+
_ZenQ_NumWriters1000_InputSize7000000-8 90.0kB ± 6%
26+
_Chan_Million_Blocking_Writers-8 553MB ± 0%
27+
_ZenQ_Million_Blocking_Writers-8 121MB ± 4%
28+
29+
name allocs/op
30+
_Chan_NumWriters1_InputSize600-8 0.00
31+
_ZenQ_NumWriters1_InputSize600-8 0.00
32+
_Chan_NumWriters3_InputSize60000-8 0.00
33+
_ZenQ_NumWriters3_InputSize60000-8 0.00
34+
_Chan_NumWriters8_InputSize6000000-8 2.18 ±175%
35+
_ZenQ_NumWriters8_InputSize6000000-8 5.13 ±56%
36+
_Chan_NumWriters100_InputSize6000000-8 157 ±30%
37+
_ZenQ_NumWriters100_InputSize6000000-8 26.3 ±56%
38+
_Chan_NumWriters1000_InputSize7000000-8 1.76k ± 4%
39+
_ZenQ_NumWriters1000_InputSize7000000-8 47.1 ±29%
40+
_Chan_Million_Blocking_Writers-8 2.00M ± 0%
41+
_ZenQ_Million_Blocking_Writers-8 1.00M ± 0%

Diff for: bench_reports/ubuntu_intel_xeon.txt

+62
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
.-/+oossssoo+/-. manas@dell-Precision-Tower-5810
2+
`:+ssssssssssssssssss+:` -------------------------------
3+
-+ssssssssssssssssssyyssss+- OS: Ubuntu 20.04.3 LTS x86_64
4+
.ossssssssssssssssssdMMMNysssso. Host: Precision Tower 5810
5+
/ssssssssssshdmmNNmmyNMMMMhssssss/ Kernel: 5.11.0-27-generic
6+
+ssssssssshmydMMMMMMMNddddyssssssss+ Uptime: 2 hours, 49 mins
7+
/sssssssshNMMMyhhyyyyhmNMMMNhssssssss/ Packages: 3061 (dpkg), 9 (snap)
8+
.ssssssssdMMMNhsssssssssshNMMMdssssssss. Shell: zsh 5.8
9+
+sssshhhyNMMNyssssssssssssyNMMMysssssss+ Resolution: 1920x1080
10+
ossyNMMMNyMMhsssssssssssssshmmmhssssssso DE: Plasma
11+
ossyNMMMNyMMhsssssssssssssshmmmhssssssso WM: KWin
12+
+sssshhhyNMMNyssssssssssssyNMMMysssssss+ Theme: Breeze [Plasma], Breeze [GTK2/3]
13+
.ssssssssdMMMNhsssssssssshNMMMdssssssss. Icons: breeze [Plasma], breeze [GTK2/3]
14+
/sssssssshNMMMyhhyyyyhdNMMMNhssssssss/ Terminal: terminator
15+
+sssssssssdmydMMMMMMMMddddyssssssss+ CPU: Intel Xeon E5-1620 v4 (8) @ 3.800GHz
16+
/ssssssssssshdmNNNNmyNMMMMhssssss/ GPU: NVIDIA GeForce GTX 1080
17+
.ossssssssssssssssssdMMMNysssso. Memory: 2875MiB / 64244MiB
18+
-+sssssssssssssssssyyyssss+-
19+
`:+ssssssssssssssssss+:`
20+
.-/+oossssoo+/-.
21+
22+
name time/op
23+
_Chan_NumWriters1_InputSize600-8 90.8µs ± 7%
24+
_ZenQ_NumWriters1_InputSize600-8 52.8µs ±15%
25+
_Chan_NumWriters3_InputSize60000-8 12.2ms ± 5%
26+
_ZenQ_NumWriters3_InputSize60000-8 5.14ms ± 3%
27+
_Chan_NumWriters8_InputSize6000000-8 1.48s ± 9%
28+
_ZenQ_NumWriters8_InputSize6000000-8 429ms ± 3%
29+
_Chan_NumWriters100_InputSize6000000-8 1.78s ± 7%
30+
_ZenQ_NumWriters100_InputSize6000000-8 453ms ± 4%
31+
_Chan_NumWriters1000_InputSize7000000-8 3.95s ± 5%
32+
_ZenQ_NumWriters1000_InputSize7000000-8 545ms ± 4%
33+
_Chan_Million_Blocking_Writers-8 7.49s ± 1%
34+
_ZenQ_Million_Blocking_Writers-8 2.04s ± 5%
35+
36+
name alloc/op
37+
_Chan_NumWriters1_InputSize600-8 0.00B
38+
_ZenQ_NumWriters1_InputSize600-8 0.00B
39+
_Chan_NumWriters3_InputSize60000-8 202B ±81%
40+
_ZenQ_NumWriters3_InputSize60000-8 94.4B ±64%
41+
_Chan_NumWriters8_InputSize6000000-8 333B ±104%
42+
_ZenQ_NumWriters8_InputSize6000000-8 1.62kB ±124%
43+
_Chan_NumWriters100_InputSize6000000-8 41.6kB ±28%
44+
_ZenQ_NumWriters100_InputSize6000000-8 15.4kB ±46%
45+
_Chan_NumWriters1000_InputSize7000000-8 485kB ± 8%
46+
_ZenQ_NumWriters1000_InputSize7000000-8 136kB ± 8%
47+
_Chan_Million_Blocking_Writers-8 553MB ± 0%
48+
_ZenQ_Million_Blocking_Writers-8 123MB ± 3%
49+
50+
name allocs/op
51+
_Chan_NumWriters1_InputSize600-8 0.00
52+
_ZenQ_NumWriters1_InputSize600-8 0.00
53+
_Chan_NumWriters3_InputSize60000-8 0.00
54+
_ZenQ_NumWriters3_InputSize60000-8 0.00
55+
_Chan_NumWriters8_InputSize6000000-8 3.59 ±123%
56+
_ZenQ_NumWriters8_InputSize6000000-8 8.24 ±46%
57+
_Chan_NumWriters100_InputSize6000000-8 156 ±19%
58+
_ZenQ_NumWriters100_InputSize6000000-8 36.2 ±46%
59+
_Chan_NumWriters1000_InputSize7000000-8 1.80k ± 4%
60+
_ZenQ_NumWriters1000_InputSize7000000-8 76.4 ±31%
61+
_Chan_Million_Blocking_Writers-8 2.00M ± 0%
62+
_ZenQ_Million_Blocking_Writers-8 1.00M ± 0%

Diff for: zenq.go

+22-21
Original file line numberDiff line numberDiff line change
@@ -52,9 +52,9 @@ const (
5252

5353
type (
5454
slot[T any] struct {
55-
State uint32
56-
WriteParker *ThreadParker[T]
57-
Item T
55+
state uint32
56+
writeParker *ThreadParker[T]
57+
item T
5858
}
5959

6060
selectFactory struct {
@@ -101,7 +101,7 @@ func New[T any](size uint32) *ZenQ[T] {
101101
for idx := uint32(0); idx < queueSize; idx++ {
102102
n := parkPool.Get().(*parkSpot[T])
103103
n.threadPtr, n.next = nil, nil
104-
contents[idx].WriteParker = NewThreadParker[T](unsafe.Pointer(n))
104+
contents[idx].writeParker = NewThreadParker[T](unsafe.Pointer(n))
105105
}
106106
zenq := &ZenQ[T]{
107107
strideLength: unsafe.Sizeof(slot[T]{}),
@@ -153,14 +153,14 @@ direct_send:
153153
slot := (*slot[T])(unsafe.Pointer(uintptr(atomic.AddUint32(&self.writerIndex, 1)&self.indexMask)*self.strideLength + uintptr(self.contents)))
154154

155155
// CAS -> change slot_state to busy if slot_state == empty
156-
for !atomic.CompareAndSwapUint32(&slot.State, SlotEmpty, SlotBusy) {
157-
switch atomic.LoadUint32(&slot.State) {
156+
for !atomic.CompareAndSwapUint32(&slot.state, SlotEmpty, SlotBusy) {
157+
switch atomic.LoadUint32(&slot.state) {
158158
case SlotBusy:
159159
wait()
160160
case SlotCommitted:
161161
n := self.alloc().(*parkSpot[T])
162162
n.threadPtr, n.next, n.value = GetG(), nil, value
163-
slot.WriteParker.Park(unsafe.Pointer(n))
163+
slot.writeParker.Park(unsafe.Pointer(n))
164164
mcall(fast_park)
165165
return
166166
case SlotEmpty:
@@ -169,8 +169,8 @@ direct_send:
169169
return
170170
}
171171
}
172-
slot.Item = value
173-
atomic.StoreUint32(&slot.State, SlotCommitted)
172+
slot.item = value
173+
atomic.StoreUint32(&slot.state, SlotCommitted)
174174
return
175175
}
176176

@@ -179,13 +179,13 @@ func (self *ZenQ[T]) Read() (data T, queueOpen bool) {
179179
slot := (*slot[T])(unsafe.Pointer(uintptr(atomic.AddUint32(&self.readerIndex, 1)&self.indexMask)*self.strideLength + uintptr(self.contents)))
180180

181181
// CAS -> change slot_state to busy if slot_state == committed
182-
for !atomic.CompareAndSwapUint32(&slot.State, SlotCommitted, SlotBusy) {
183-
switch atomic.LoadUint32(&slot.State) {
182+
for !atomic.CompareAndSwapUint32(&slot.state, SlotCommitted, SlotBusy) {
183+
switch atomic.LoadUint32(&slot.state) {
184184
case SlotBusy:
185185
wait()
186186
case SlotEmpty:
187187
var freeable *parkSpot[T]
188-
if data, queueOpen, freeable = slot.WriteParker.Ready(); queueOpen {
188+
if data, queueOpen, freeable = slot.writeParker.Ready(); queueOpen {
189189
if freeable != nil {
190190
self.free(freeable)
191191
}
@@ -199,7 +199,7 @@ func (self *ZenQ[T]) Read() (data T, queueOpen bool) {
199199
return
200200
}
201201
case SlotClosed:
202-
if atomic.CompareAndSwapUint32(&slot.State, SlotClosed, SlotEmpty) {
202+
if atomic.CompareAndSwapUint32(&slot.state, SlotClosed, SlotEmpty) {
203203
atomic.StoreUint32(&self.globalState, StateFullyClosed)
204204
}
205205
queueOpen = false
@@ -208,8 +208,8 @@ func (self *ZenQ[T]) Read() (data T, queueOpen bool) {
208208
continue
209209
}
210210
}
211-
data, queueOpen = slot.Item, true
212-
atomic.StoreUint32(&slot.State, SlotEmpty)
211+
data, queueOpen = slot.item, true
212+
atomic.StoreUint32(&slot.state, SlotEmpty)
213213
return
214214
}
215215

@@ -228,8 +228,8 @@ func (self *ZenQ[T]) Close() (alreadyClosedForWrites bool) {
228228
slot := (*slot[T])(unsafe.Pointer(uintptr(atomic.AddUint32(&self.writerIndex, 1)&self.indexMask)*self.strideLength + uintptr(self.contents)))
229229

230230
// CAS -> change slot_state to busy if slot_state == empty
231-
for !atomic.CompareAndSwapUint32(&slot.State, SlotEmpty, SlotBusy) {
232-
switch atomic.LoadUint32(&slot.State) {
231+
for !atomic.CompareAndSwapUint32(&slot.state, SlotEmpty, SlotBusy) {
232+
switch atomic.LoadUint32(&slot.state) {
233233
case SlotBusy, SlotCommitted:
234234
mcall(gosched_m)
235235
case SlotEmpty:
@@ -239,7 +239,7 @@ func (self *ZenQ[T]) Close() (alreadyClosedForWrites bool) {
239239
}
240240
}
241241
// Closing commit
242-
atomic.StoreUint32(&slot.State, SlotClosed)
242+
atomic.StoreUint32(&slot.state, SlotClosed)
243243
return
244244
}
245245

@@ -293,9 +293,10 @@ func (self *ZenQ[T]) Reset() {
293293
// Unsafe to be called from multiple goroutines
294294
func (self *ZenQ[T]) Dump() {
295295
fmt.Printf("writerIndex: %3d, readerIndex: %3d\n contents:-\n\n", self.writerIndex, self.readerIndex)
296-
// for idx := range self.contents {
297-
// fmt.Printf("%5v : State -> %5v, Item -> %5v\n", idx, self.contents[idx].State, self.contents[idx].Item)
298-
// }
296+
for idx := uintptr(0); idx <= uintptr(self.indexMask); idx++ {
297+
slot := (*slot[T])(unsafe.Pointer(uintptr(self.contents) + idx*unsafe.Sizeof(slot[T]{})))
298+
fmt.Printf("Slot -> %#v\n", *slot)
299+
}
299300
}
300301

301302
// selectSender is an auxillary thread which remains parked by default

0 commit comments

Comments
 (0)