blob: 46355a800080cde53037a06844e09fc01a81129f [file] [log] [blame]
package benchmarks
import (
"math"
"runtime"
"testing"
"github.com/smartystreets/go-disruptor"
)
const multiWriterRingBufferSize = 1024 * 16
const multiWriterRingBufferMask = multiWriterRingBufferSize - 1
func BenchmarkDisruptorSharedWriterClaimSingle(b *testing.B) {
benchmarkMultiWriter(b, 1)
}
func BenchmarkDisruptorSharedWriterClaimMultiple(b *testing.B) {
benchmarkMultiWriter(b, 32)
}
func benchmarkMultiWriter(b *testing.B, maxClaim int64) {
written, read := disruptor.NewCursor(), disruptor.NewCursor()
shared := disruptor.NewSharedWriterBarrier(written, multiWriterRingBufferSize)
reader := disruptor.NewReader(read, written, shared)
writer := disruptor.NewSharedWriter(shared, read)
iterations := int64(b.N)
ringBuffer := [multiWriterRingBufferSize]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&multiWriterRingBufferMask] = 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&multiWriterRingBufferMask] {
panic("Out of sequence")
}
}
reader.Commit(upper)
sequence = upper
}
}
}
func init() {
runtime.GOMAXPROCS(2)
}