| package benchmarks |
| |
| import ( |
| "math" |
| "runtime" |
| "testing" |
| |
| "github.com/smartystreets/go-disruptor" |
| ) |
| |
| const singleWriterRingBufferSize = 1024 * 16 |
| const singleWriterRingBufferMask = singleWriterRingBufferSize - 1 |
| |
| func BenchmarkDisruptorWriterClaimSingle(b *testing.B) { |
| benchmarkSingleWriter(b, 1) |
| } |
| func BenchmarkDisruptorWriterClaimMultiple(b *testing.B) { |
| benchmarkSingleWriter(b, 32) |
| } |
| |
| func benchmarkSingleWriter(b *testing.B, maxClaim int64) { |
| written, read := disruptor.NewCursor(), disruptor.NewCursor() |
| reader := disruptor.NewReader(read, written, written) |
| writer := disruptor.NewWriter(written, read, singleWriterRingBufferSize) |
| |
| iterations := int64(b.N) |
| ringBuffer := [singleWriterRingBufferSize]int64{} |
| claim := (int64(math.Log2(float64(iterations))) + 1) |
| if claim >= maxClaim { |
| claim = maxClaim |
| } |
| |
| b.ReportAllocs() |
| b.ResetTimer() |
| |
| go func() { |
| sequence := int64(0) |
| for sequence < iterations { |
| if lower, upper := writer.Reserve(claim); upper >= 0 { |
| for ; sequence <= upper; sequence++ { |
| ringBuffer[sequence&singleWriterRingBufferMask] = sequence |
| } |
| |
| writer.Commit(lower, upper) |
| sequence = upper |
| } |
| } |
| }() |
| |
| sequence := int64(0) |
| for sequence < iterations { |
| if _, upper := reader.Receive(); upper >= 0 { |
| for ; sequence <= upper; sequence++ { |
| if sequence != ringBuffer[sequence&singleWriterRingBufferMask] { |
| panic("Out of sequence") |
| } |
| } |
| |
| reader.Commit(upper) |
| sequence = upper |
| } |
| } |
| } |
| |
| func init() { |
| runtime.GOMAXPROCS(2) |
| } |