Split files; adding SharedWriter tests; updated readme benchmarks.
diff --git a/benchmark-disruptor/multi_writer_test.go b/benchmark-disruptor/multi_writer_test.go
new file mode 100644
index 0000000..a71a941
--- /dev/null
+++ b/benchmark-disruptor/multi_writer_test.go
@@ -0,0 +1,55 @@
+package benchmarks
+
+import (
+ "testing"
+
+ "github.com/smartystreets/go-disruptor"
+)
+
+func BenchmarkDisruptorSharedWriterReserveOne(b *testing.B) {
+ ringBuffer := [RingBufferSize]int64{}
+ written, read := disruptor.NewCursor(), disruptor.NewCursor()
+ shared := disruptor.NewSharedWriterBarrier(written, RingBufferSize)
+ reader := disruptor.NewReader(read, written, shared, SampleConsumer{&ringBuffer})
+ writer := disruptor.NewSharedWriter(shared, read)
+ reader.Start()
+
+ iterations := int64(b.N)
+ b.ReportAllocs()
+ b.ResetTimer()
+
+ sequence := disruptor.InitialSequenceValue
+ for sequence < iterations {
+ sequence = writer.Reserve(ReserveOne)
+ ringBuffer[sequence&RingBufferMask] = sequence
+ writer.Commit(sequence, sequence)
+ }
+
+ reader.Stop()
+}
+
+// func BenchmarkDisruptorSharedWriterReserveMany(b *testing.B) {
+// ringBuffer := [RingBufferSize]int64{}
+// written, read := disruptor.NewCursor(), disruptor.NewCursor()
+// shared := disruptor.NewSharedWriterBarrier(written, RingBufferSize)
+// reader := disruptor.NewReader(read, written, shared, SampleConsumer{&ringBuffer})
+// writer := disruptor.NewSharedWriter(shared, read)
+// reader.Start()
+
+// iterations := int64(b.N)
+// b.ReportAllocs()
+// b.ResetTimer()
+
+// sequence := disruptor.InitialSequenceValue
+// for sequence < iterations {
+// sequence = writer.Reserve(ReserveMany)
+
+// for i := sequence - ReserveManyDelta; i <= sequence; i++ {
+// ringBuffer[i&RingBufferMask] = i
+// }
+
+// writer.Commit(sequence-ReserveMany, sequence)
+// }
+
+// reader.Stop()
+// }
diff --git a/benchmark-disruptor/sample_consumer_test.go b/benchmark-disruptor/sample_consumer_test.go
new file mode 100644
index 0000000..15835b8
--- /dev/null
+++ b/benchmark-disruptor/sample_consumer_test.go
@@ -0,0 +1,17 @@
+package benchmarks
+
+import "fmt"
+
+type SampleConsumer struct {
+ ringBuffer *[RingBufferSize]int64
+}
+
+func (this SampleConsumer) Consume(lower, upper int64) {
+ for lower <= upper {
+ message := this.ringBuffer[lower&RingBufferMask]
+ if message != lower {
+ panic(fmt.Sprintf("\nRace condition %d %d\n", lower, message))
+ }
+ lower++
+ }
+}
diff --git a/benchmark-disruptor/single_writer_await_test.go b/benchmark-disruptor/single_writer_await_test.go
new file mode 100644
index 0000000..d73b194
--- /dev/null
+++ b/benchmark-disruptor/single_writer_await_test.go
@@ -0,0 +1,54 @@
+package benchmarks
+
+import (
+ "testing"
+
+ "github.com/smartystreets/go-disruptor"
+)
+
+func BenchmarkDisruptorWriterAwaitOne(b *testing.B) {
+ ringBuffer := [RingBufferSize]int64{}
+ written, read := disruptor.NewCursor(), disruptor.NewCursor()
+ reader := disruptor.NewReader(read, written, written, SampleConsumer{&ringBuffer})
+ writer := disruptor.NewWriter(written, read, RingBufferSize)
+ reader.Start()
+
+ iterations := int64(b.N)
+ b.ReportAllocs()
+ b.ResetTimer()
+
+ sequence := disruptor.InitialSequenceValue
+ for sequence < iterations {
+ sequence += ReserveOne
+ writer.Await(sequence)
+ ringBuffer[sequence&RingBufferMask] = sequence
+ writer.Commit(sequence, sequence)
+ }
+
+ reader.Stop()
+}
+func BenchmarkDisruptorWriterAwaitMany(b *testing.B) {
+ ringBuffer := [RingBufferSize]int64{}
+ written, read := disruptor.NewCursor(), disruptor.NewCursor()
+ reader := disruptor.NewReader(read, written, written, SampleConsumer{&ringBuffer})
+ writer := disruptor.NewWriter(written, read, RingBufferSize)
+ reader.Start()
+
+ iterations := int64(b.N)
+ b.ReportAllocs()
+ b.ResetTimer()
+
+ sequence := disruptor.InitialSequenceValue
+ for sequence < iterations {
+ sequence += ReserveMany
+ writer.Await(sequence)
+
+ for i := sequence - ReserveManyDelta; i <= sequence; i++ {
+ ringBuffer[i&RingBufferMask] = i
+ }
+
+ writer.Commit(sequence, sequence)
+ }
+
+ reader.Stop()
+}
diff --git a/benchmark-disruptor/single_writer_test.go b/benchmark-disruptor/single_writer_reservation_test.go
similarity index 64%
rename from benchmark-disruptor/single_writer_test.go
rename to benchmark-disruptor/single_writer_reservation_test.go
index 9213392..2f23cd7 100644
--- a/benchmark-disruptor/single_writer_test.go
+++ b/benchmark-disruptor/single_writer_reservation_test.go
@@ -1,16 +1,15 @@
package benchmarks
import (
- "fmt"
"testing"
"github.com/smartystreets/go-disruptor"
)
-func BenchmarkDisruptorWriterReserveSingle(b *testing.B) {
+func BenchmarkDisruptorWriterReserveOne(b *testing.B) {
ringBuffer := [RingBufferSize]int64{}
written, read := disruptor.NewCursor(), disruptor.NewCursor()
- reader := disruptor.NewReader(read, written, written, Consumer{&ringBuffer})
+ reader := disruptor.NewReader(read, written, written, SampleConsumer{&ringBuffer})
writer := disruptor.NewWriter(written, read, RingBufferSize)
reader.Start()
@@ -27,10 +26,10 @@
reader.Stop()
}
-func BenchmarkDisruptorWriterReserveMultiple(b *testing.B) {
+func BenchmarkDisruptorWriterReserveMany(b *testing.B) {
ringBuffer := [RingBufferSize]int64{}
written, read := disruptor.NewCursor(), disruptor.NewCursor()
- reader := disruptor.NewReader(read, written, written, Consumer{&ringBuffer})
+ reader := disruptor.NewReader(read, written, written, SampleConsumer{&ringBuffer})
writer := disruptor.NewWriter(written, read, RingBufferSize)
reader.Start()
@@ -51,17 +50,3 @@
reader.Stop()
}
-
-type Consumer struct {
- ringBuffer *[RingBufferSize]int64
-}
-
-func (this Consumer) Consume(lower, upper int64) {
- for lower <= upper {
- message := this.ringBuffer[lower&RingBufferMask]
- if message != lower {
- panic(fmt.Sprintf("\nRace condition %d %d\n", lower, message))
- }
- lower++
- }
-}
diff --git a/readme.md b/readme.md
index d4186fb..b8b7294 100644
--- a/readme.md
+++ b/readme.md
@@ -16,12 +16,17 @@
Scenario | Per Operation Time
-------- | ------------------
-Channel: Non-blocking | 681 ns/op
-Channel: Blocking | 86.6 ns/op|
-Disruptor: SharedWriter (single claim) | nn.n ns/op
-Disruptor: SharedWriter (multi claim) | nn.n ns/op
-Disruptor: Writer (single claim) | 4.3 ns/op
-Disruptor: Writer (multi claim) | 1.1 ns/op
+Channel (GOMAXPROCS=2): Non-blocking | 681 ns/op
+Channel (GOMAXPROCS=2): Blocking | 86.6 ns/op
+
+Disruptor: SharedWriter (Reserve One) | 15.4 ns/op
+Disruptor: SharedWriter (Reserve Many) | nn.n ns/op
+
+Disruptor: Writer (Reserve One) | 4.3 ns/op
+Disruptor: Writer (Reserve Many) | 1.1 ns/op
+
+Disruptor: Writer (Await One) | 3.5 ns/op
+Disruptor: Writer (Await Many) | 1.0 ns/op
When In Doubt, Use Channels