diff options
author | Jakob Borg <jakob@nym.se> | 2016-06-27 10:26:43 +0200 |
---|---|---|
committer | Jakob Borg <jakob@nym.se> | 2016-06-27 10:26:59 +0200 |
commit | 9d16f4545df6c5221e964e92c31ebb7423c296d8 (patch) | |
tree | b8e6a1a4d25d0573aa7164d52102e948bfaa5bc3 | |
parent | d57e6808cc17535086f9b8110960ecab8481c37d (diff) |
lib/events: Add logging/receiving benchmark
-rw-r--r-- | lib/events/events_test.go | 50 |
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() } |