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
```
This commit is contained in:
Nikita Vetoshkin 2016-06-23 18:49:41 +05:00
parent b945a3fcc8
commit dbc7c2cf4e

View File

@ -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)
}
}