Skip to content

Commit 97fa74f

Browse files
Merge pull request #205 from chrisxue815/master
Reduce RingBuffer heap allocation
2 parents f07cbe3 + 827210d commit 97fa74f

File tree

2 files changed

+10
-4
lines changed

2 files changed

+10
-4
lines changed

queue/ring.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ type node struct {
4141
data interface{}
4242
}
4343

44-
type nodes []*node
44+
type nodes []node
4545

4646
// RingBuffer is a MPMC buffer that achieves threadsafety with CAS operations
4747
// only. A put on full or get on empty call will block until an item
@@ -64,7 +64,7 @@ func (rb *RingBuffer) init(size uint64) {
6464
size = roundUp(size)
6565
rb.nodes = make(nodes, size)
6666
for i := uint64(0); i < size; i++ {
67-
rb.nodes[i] = &node{position: i}
67+
rb.nodes[i] = node{position: i}
6868
}
6969
rb.mask = size - 1 // so we don't have to do this with every put/get operation
7070
}
@@ -93,7 +93,7 @@ L:
9393
return false, ErrDisposed
9494
}
9595

96-
n = rb.nodes[pos&rb.mask]
96+
n = &rb.nodes[pos&rb.mask]
9797
seq := atomic.LoadUint64(&n.position)
9898
switch dif := seq - pos; {
9999
case dif == 0:
@@ -146,7 +146,7 @@ L:
146146
return nil, ErrDisposed
147147
}
148148

149-
n = rb.nodes[pos&rb.mask]
149+
n = &rb.nodes[pos&rb.mask]
150150
seq := atomic.LoadUint64(&n.position)
151151
switch dif := seq - (pos + 1); {
152152
case dif == 0:

queue/ring_test.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -396,3 +396,9 @@ func BenchmarkRBGet(b *testing.B) {
396396
rb.Get()
397397
}
398398
}
399+
400+
func BenchmarkRBAllocation(b *testing.B) {
401+
for i := 0; i < b.N; i++ {
402+
NewRingBuffer(1024)
403+
}
404+
}

0 commit comments

Comments
 (0)