diff --git a/benchmarks/blocking_channel_test.go b/benchmark-channels/blocking_channel_test.go
similarity index 100%
rename from benchmarks/blocking_channel_test.go
rename to benchmark-channels/blocking_channel_test.go
diff --git a/benchmarks/non_blocking_channel_test.go b/benchmark-channels/non_blocking_channel_test.go
similarity index 100%
rename from benchmarks/non_blocking_channel_test.go
rename to benchmark-channels/non_blocking_channel_test.go
diff --git a/benchmark-disruptor/init_test.go b/benchmark-disruptor/init_test.go
new file mode 100644
index 0000000..8d4945b
--- /dev/null
+++ b/benchmark-disruptor/init_test.go
@@ -0,0 +1,15 @@
+package benchmarks
+
+import "runtime"
+
+const (
+	RingBufferSize   = 1024 * 64
+	RingBufferMask   = RingBufferSize - 1
+	ReserveOne       = 1
+	ReserveMany      = 16
+	ReserveManyDelta = ReserveMany - 1
+)
+
+func init() {
+	runtime.GOMAXPROCS(2)
+}
diff --git a/benchmark-disruptor/single_writer_test.go b/benchmark-disruptor/single_writer_test.go
new file mode 100644
index 0000000..9213392
--- /dev/null
+++ b/benchmark-disruptor/single_writer_test.go
@@ -0,0 +1,67 @@
+package benchmarks
+
+import (
+	"fmt"
+	"testing"
+
+	"github.com/smartystreets/go-disruptor"
+)
+
+func BenchmarkDisruptorWriterReserveSingle(b *testing.B) {
+	ringBuffer := [RingBufferSize]int64{}
+	written, read := disruptor.NewCursor(), disruptor.NewCursor()
+	reader := disruptor.NewReader(read, written, written, Consumer{&ringBuffer})
+	writer := disruptor.NewWriter(written, read, RingBufferSize)
+	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 BenchmarkDisruptorWriterReserveMultiple(b *testing.B) {
+	ringBuffer := [RingBufferSize]int64{}
+	written, read := disruptor.NewCursor(), disruptor.NewCursor()
+	reader := disruptor.NewReader(read, written, written, Consumer{&ringBuffer})
+	writer := disruptor.NewWriter(written, read, RingBufferSize)
+	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, sequence)
+	}
+
+	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/benchmarks/single_writer_test.go b/benchmarks/single_writer_test.go
deleted file mode 100644
index 9e5eb42..0000000
--- a/benchmarks/single_writer_test.go
+++ /dev/null
@@ -1,80 +0,0 @@
-package benchmarks
-
-import (
-	"fmt"
-	"runtime"
-	"testing"
-
-	"github.com/smartystreets/go-disruptor"
-)
-
-const (
-	singleWriterRingBufferSize = 1024 * 64
-	singleWriterRingBufferMask = singleWriterRingBufferSize - 1
-	reserveOne                 = 1
-	reserveMany                = 16
-	reserveManyDelta           = reserveMany - 1
-)
-
-func BenchmarkDisruptorWriterReserveSingle(b *testing.B) {
-	ringBuffer := [singleWriterRingBufferSize]int64{}
-	written, read := disruptor.NewCursor(), disruptor.NewCursor()
-	reader := disruptor.NewReader(read, written, written, singleWriterConsumer{&ringBuffer})
-	writer := disruptor.NewWriter(written, read, singleWriterRingBufferSize)
-	reader.Start()
-
-	iterations := int64(b.N)
-	b.ReportAllocs()
-	b.ResetTimer()
-
-	sequence := disruptor.InitialSequenceValue
-	for sequence < iterations {
-		sequence = writer.Reserve(reserveOne)
-		ringBuffer[sequence&singleWriterRingBufferMask] = sequence
-		writer.Commit(sequence, sequence)
-	}
-
-	reader.Stop()
-}
-func BenchmarkDisruptorWriterReserveMultiple(b *testing.B) {
-	ringBuffer := [singleWriterRingBufferSize]int64{}
-	written, read := disruptor.NewCursor(), disruptor.NewCursor()
-	reader := disruptor.NewReader(read, written, written, singleWriterConsumer{&ringBuffer})
-	writer := disruptor.NewWriter(written, read, singleWriterRingBufferSize)
-	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&singleWriterRingBufferMask] = i
-		}
-
-		writer.Commit(sequence, sequence)
-	}
-
-	reader.Stop()
-}
-
-type singleWriterConsumer struct {
-	ringBuffer *[singleWriterRingBufferSize]int64
-}
-
-func (this singleWriterConsumer) Consume(lower, upper int64) {
-	for lower <= upper {
-		message := this.ringBuffer[lower&singleWriterRingBufferMask]
-		if message != lower {
-			panic(fmt.Sprintf("\nRace condition %d %d\n", lower, message))
-		}
-		lower++
-	}
-}
-
-func init() {
-	runtime.GOMAXPROCS(2)
-}
