# README
For comparing with others
$ go test ./ringbuf/rb -v -race -run 'TestQueuePutGet'
=== RUN TestQueuePutGet
TestQueuePutGet: rb_test.go:237: Grp: 16, Times: 1360000, use: 13.239249853s, 9.734µs/op
TestQueuePutGet: rb_test.go:238: Put: 1360000, use: 5.040007349s, 3.705µs/op
TestQueuePutGet: rb_test.go:239: Get: 1360000, use: 3.274023288s, 2.407µs/op
--- PASS: TestQueuePutGet (13.24s)
A third-party go ring buffer has similar result:
=== RUN TestQueuePutGet
TestQueuePutGet: esQueue_test.go:54: Grp: 16, Times: 1360000, use: 11.388502861s, 8.373µs/op
TestQueuePutGet: esQueue_test.go:55: Put: 1360000, use: 5.659641221s, 4.161µs/op
TestQueuePutGet: esQueue_test.go:56: Get: 1360000, use: 3.660366563s, 2.691µs/op
--- PASS: TestQueuePutGet (11.39s)
Multiple Producers
$ go test ./ringbuf/rb -v -race -run 'TestRingBuf_MPut'
=== RUN TestRingBuf_MPut
TestRingBuf_MPut: rb_test.go:223: Grp: 16, Times: 1360000, use: 26.266041367s, 19.313µs/op
TestRingBuf_MPut: rb_test.go:224: Put: 1360000, use: 24.036637261s, 17.673µs/op | retry times: 0
TestRingBuf_MPut: rb_test.go:225: Get: 1360000, use: 2.229404106s, 1.639µs/op | retry times: 0
--- PASS: TestRingBuf_MPut (51.29s)
=== RUN TestRingBuf_MPut
TestRingBuf_MPut: rb_test.go:231: Grp: 16, Times: 1360000, use: 42.836537705s, 31.497µs/op
TestRingBuf_MPut: rb_test.go:232: Put: 1360000, use: 39.277276612s, 28.88µs/op | retry times: 0
TestRingBuf_MPut: rb_test.go:233: Get: 1360000, use: 3.559261093s, 2.617µs/op | retry times: 0
--- PASS: TestRingBuf_MPut (53.60s)
Average of put + get: 19.313µs/op .. 31.497µs/op
DEQUEUE: 1000*1000*1000/1.639 = 610,128,127
ENQUEUE: 1000*1000*1000/17.673 = 56,583,489
Bench
Bench A
$ go test ./ringbuf/rb -race -bench='BenchmarkRingBuf' -run=none
goos: darwin
goarch: amd64
pkg: github.com/hedzr/socketlib/ringbuf/rb
BenchmarkRingBuf_Put16384-4 1000000000 0.201 ns/op
--- BENCH: BenchmarkRingBuf_Put16384-4
rb_test.go:105: Ring Buffer created, size = 16384. maxN = 1, dbg: false
rb_test.go:188: Waits: get: 0, put: 0
rb_test.go:105: Ring Buffer created, size = 16384. maxN = 100, dbg: false
rb_test.go:188: Waits: get: 0, put: 0
rb_test.go:105: Ring Buffer created, size = 16384. maxN = 10000, dbg: false
rb_test.go:188: Waits: get: 0, put: 0
rb_test.go:105: Ring Buffer created, size = 16384. maxN = 596823, dbg: false
rb_test.go:188: Waits: get: 0, put: 0
rb_test.go:105: Ring Buffer created, size = 16384. maxN = 4861959, dbg: false
rb_test.go:188: Waits: get: 1, put: 0
... [output truncated]
BenchmarkRingBuf_Put1024-4 1000000000 0.0328 ns/op
--- BENCH: BenchmarkRingBuf_Put1024-4
rb_test.go:105: Ring Buffer created, size = 1024. maxN = 1, dbg: false
rb_test.go:188: Waits: get: 0, put: 0
rb_test.go:105: Ring Buffer created, size = 1024. maxN = 100, dbg: false
rb_test.go:188: Waits: get: 0, put: 0
rb_test.go:105: Ring Buffer created, size = 1024. maxN = 10000, dbg: false
rb_test.go:188: Waits: get: 1, put: 0
rb_test.go:105: Ring Buffer created, size = 1024. maxN = 822657, dbg: false
rb_test.go:188: Waits: get: 0, put: 0
rb_test.go:105: Ring Buffer created, size = 1024. maxN = 14712006, dbg: false
rb_test.go:188: Waits: get: 0, put: 0
... [output truncated]
BenchmarkRingBuf_Put128-4 1000000000 0.0578 ns/op
--- BENCH: BenchmarkRingBuf_Put128-4
rb_test.go:105: Ring Buffer created, size = 128. maxN = 1, dbg: false
rb_test.go:188: Waits: get: 0, put: 0
rb_test.go:105: Ring Buffer created, size = 128. maxN = 100, dbg: false
rb_test.go:188: Waits: get: 0, put: 0
rb_test.go:105: Ring Buffer created, size = 128. maxN = 10000, dbg: false
rb_test.go:188: Waits: get: 16, put: 0
rb_test.go:105: Ring Buffer created, size = 128. maxN = 479848, dbg: false
rb_test.go:188: Waits: get: 6, put: 0
rb_test.go:105: Ring Buffer created, size = 128. maxN = 7635192, dbg: false
rb_test.go:188: Waits: get: 1, put: 0
... [output truncated]
PASS
ok github.com/hedzr/socketlib/ringbuf/rb 1.718s
Bench B
$ go test ./ringbuf/rb -race -bench 'BenchmarkPutGet' -run=none -benchtime=10s -v
goos: darwin
goarch: amd64
pkg: github.com/hedzr/socketlib/ringbuf/rb
BenchmarkPutGet
BenchmarkPutGet: rb_test.go:257: Grp: 16, Times: 136, use: 2.279890383s, 16.763899ms/op | cnt = 1
BenchmarkPutGet: rb_test.go:258: Put: 136, use: 14.786715ms, 108.725µs/op
BenchmarkPutGet: rb_test.go:259: Get: 136, use: 11.828063ms, 86.971µs/op
BenchmarkPutGet: rb_test.go:257: Grp: 16, Times: 544, use: 2.286623579s, 4.203352ms/op | cnt = 4
BenchmarkPutGet: rb_test.go:258: Put: 544, use: 13.760842ms, 25.295µs/op
BenchmarkPutGet: rb_test.go:259: Get: 544, use: 11.326448ms, 20.82µs/op
BenchmarkPutGet: rb_test.go:257: Grp: 16, Times: 2720, use: 2.268485793s, 834.002µs/op | cnt = 20
BenchmarkPutGet: rb_test.go:258: Put: 2720, use: 34.898867ms, 12.83µs/op
BenchmarkPutGet: rb_test.go:259: Get: 2720, use: 16.811108ms, 6.18µs/op
BenchmarkPutGet: rb_test.go:257: Grp: 16, Times: 14280, use: 2.346420828s, 164.315µs/op | cnt = 105
BenchmarkPutGet: rb_test.go:258: Put: 14280, use: 119.552647ms, 8.372µs/op
BenchmarkPutGet: rb_test.go:259: Get: 14280, use: 43.536215ms, 3.048µs/op
BenchmarkPutGet: rb_test.go:257: Grp: 16, Times: 72896, use: 2.740715898s, 37.597µs/op | cnt = 536
BenchmarkPutGet: rb_test.go:258: Put: 72896, use: 372.948351ms, 5.116µs/op
BenchmarkPutGet: rb_test.go:259: Get: 72896, use: 201.965619ms, 2.77µs/op
BenchmarkPutGet: rb_test.go:257: Grp: 16, Times: 319056, use: 4.714743406s, 14.777µs/op | cnt = 2346
BenchmarkPutGet: rb_test.go:258: Put: 319056, use: 1.65687515s, 5.193µs/op
BenchmarkPutGet: rb_test.go:259: Get: 319056, use: 814.404547ms, 2.552µs/op
BenchmarkPutGet: rb_test.go:257: Grp: 16, Times: 811920, use: 8.80726798s, 10.847µs/op | cnt = 5970
BenchmarkPutGet: rb_test.go:258: Put: 811920, use: 4.321487768s, 5.322µs/op
BenchmarkPutGet: rb_test.go:259: Get: 811920, use: 2.112014177s, 2.601µs/op
BenchmarkPutGet: rb_test.go:257: Grp: 16, Times: 1106088, use: 11.32722686s, 10.24µs/op | cnt = 8133
BenchmarkPutGet: rb_test.go:258: Put: 1106088, use: 6.082846481s, 5.499µs/op
BenchmarkPutGet: rb_test.go:259: Get: 1106088, use: 2.785739397s, 2.518µs/op
BenchmarkPutGet-4 8133 1392783 ns/op
PASS
ok github.com/hedzr/socketlib/ringbuf/rb 37.138s
Note that the result of last group should be concerned:
BenchmarkPutGet: rb_test.go:257: Grp: 16, Times: 1106088, use: 11.32722686s, 10.24µs/op | cnt = 8133
BenchmarkPutGet: rb_test.go:258: Put: 1106088, use: 6.082846481s, 5.499µs/op
BenchmarkPutGet: rb_test.go:259: Get: 1106088, use: 2.785739397s, 2.518µs/op
END
# Functions
New returns the RingBuffer object.
WithDebugMode enables the internal debug mode for more logging output, and collect the metrics for debugging.
WithItemInitializer provides your custom initializer for each data item.
WithLogger setup a logger.
# Constants
CacheLinePadSize represents the CPU Cache Line Padding Size, compliant with the current running CPU Architect.
MaxUint32 represents the maximal uint32 value.
MaxUint32_64 represents the maximal uint32 value.
MaxUint64 represents the maximal uint64 value.
# Variables
ErrQueueEmpty queue empty when dequeueing.
ErrQueueFull queue full when enqueueing.
ErrQueueNotReady queue not ready for enqueue or dequeue.
ErrRaced the exception raised if data racing.
# Interfaces
Dbg exposes some internal fields for debugging.
Initializeable data item supports lighter-weight clone operations.
No description provided by the author
No description provided by the author
# Type aliases
Opt interface the functional options.