pkg/idutil: use count field as atomic variable

Use atomic.AddUint64 instead of mutex lock to inc count field.

Bench result:
benchmark           old ns/op     new ns/op     delta
BenchmarkNext-4     163           26.3          -83.87%
release-3.4
lorneli 2018-04-27 00:16:58 +08:00
parent afef4a594a
commit 54827d47ee
2 changed files with 12 additions and 6 deletions

View File

@ -18,7 +18,7 @@ package idutil
import (
"math"
"sync"
"sync/atomic"
"time"
)
@ -47,7 +47,6 @@ const (
// id generated after restart is unique because etcd throughput is <<
// 256req/ms(250k reqs/second).
type Generator struct {
mu sync.Mutex
// high order 2 bytes
prefix uint64
// low order 6 bytes
@ -66,10 +65,8 @@ func NewGenerator(memberID uint16, now time.Time) *Generator {
// Next generates a id that is unique.
func (g *Generator) Next() uint64 {
g.mu.Lock()
defer g.mu.Unlock()
g.suffix++
id := g.prefix | lowbit(g.suffix, suffixLen)
suffix := atomic.AddUint64(&g.suffix, 1)
id := g.prefix | lowbit(suffix, suffixLen)
return id
}

View File

@ -53,3 +53,12 @@ func TestNext(t *testing.T) {
}
}
}
func BenchmarkNext(b *testing.B) {
g := NewGenerator(0x12, time.Now())
b.ResetTimer()
for i := 0; i < b.N; i++ {
g.Next()
}
}