summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJakob Borg <jakob@nym.se>2016-06-27 10:26:43 +0200
committerJakob Borg <jakob@nym.se>2016-06-27 10:26:59 +0200
commit9d16f4545df6c5221e964e92c31ebb7423c296d8 (patch)
treeb8e6a1a4d25d0573aa7164d52102e948bfaa5bc3
parentd57e6808cc17535086f9b8110960ecab8481c37d (diff)
lib/events: Add logging/receiving benchmark
-rw-r--r--lib/events/events_test.go50
1 files changed, 50 insertions, 0 deletions
diff --git a/lib/events/events_test.go b/lib/events/events_test.go
index 8b194b746..e67e0df5e 100644
--- a/lib/events/events_test.go
+++ b/lib/events/events_test.go
@@ -185,5 +185,55 @@ func TestBufferedSub(t *testing.T) {
recv = ev.ID
}
}
+}
+
+func BenchmarkBufferedSub(b *testing.B) {
+ l := events.NewLogger()
+
+ s := l.Subscribe(events.AllEvents)
+ defer l.Unsubscribe(s)
+ bufferSize := events.BufferSize
+ bs := events.NewBufferedSubscription(s, bufferSize)
+
+ // The coord channel paces the sender according to the receiver,
+ // ensuring that no events are dropped. The benchmark measures sending +
+ // receiving + synchronization overhead.
+
+ coord := make(chan struct{}, bufferSize)
+ for i := 0; i < bufferSize-1; i++ {
+ coord <- struct{}{}
+ }
+
+ // Receive the events
+ done := make(chan struct{})
+ go func() {
+ defer close(done)
+ recv := 0
+ var evs []events.Event
+ for i := 0; i < b.N; {
+ evs = bs.Since(recv, evs[:0])
+ for _, ev := range evs {
+ if ev.ID != recv+1 {
+ b.Fatal("skipped event", ev.ID, recv)
+ }
+ recv = ev.ID
+ coord <- struct{}{}
+ }
+ i += len(evs)
+ }
+ }()
+
+ // Send the events
+ eventData := map[string]string{
+ "foo": "bar",
+ "other": "data",
+ "and": "something else",
+ }
+ for i := 0; i < b.N; i++ {
+ l.Log(events.DeviceConnected, eventData)
+ <-coord
+ }
+ <-done
+ b.ReportAllocs()
}