From dbc7c2cf4e79f413859bfdef8a7c9e84a681cf84 Mon Sep 17 00:00:00 2001 From: Nikita Vetoshkin Date: Thu, 23 Jun 2016 18:49:41 +0500 Subject: [PATCH] backend: reuse timer in run(). Benchmarks: ``` import ( "testing" "time" ) func BenchmarkTimeAfter(b *testing.B) { b.ReportAllocs() for n := 0; n < b.N; n++ { select { case <- time.After(1 * time.Millisecond): } } } func BenchmarkTimerReset(b *testing.B) { b.ReportAllocs() t := time.NewTimer(1 * time.Millisecond) for n := 0; n < b.N; n++ { select { case <- t.C: } t.Reset(1 * time.Millisecond) } } ``` Running reveals that each loop results in 3 allocs: ``` BenchmarkTimeAfter-4 2000 1112134 ns/op 192 B/op 3 allocs/op BenchmarkTimerReset-4 2000 1109774 ns/op 0 B/op 0 allocs/op ``` --- mvcc/backend/backend.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/mvcc/backend/backend.go b/mvcc/backend/backend.go index 2b48cd3e2..c9b41307b 100644 --- a/mvcc/backend/backend.go +++ b/mvcc/backend/backend.go @@ -179,15 +179,17 @@ func (b *backend) Size() int64 { func (b *backend) run() { defer close(b.donec) - + t := time.NewTimer(b.batchInterval) + defer t.Stop() for { select { - case <-time.After(b.batchInterval): + case <-t.C: case <-b.stopc: b.batchTx.CommitAndStop() return } b.batchTx.Commit() + t.Reset(b.batchInterval) } }