Skip to content

Commit

Permalink
messageID: optimize NewSafeID using atomic instead of mutex lock
Browse files Browse the repository at this point in the history
name                  old time/op    new time/op    delta
NewSafeID-20            13.9ns ± 2%     7.5ns ± 1%  -46.16%  (p=0.008 n=5+5)
NewSafeIDParallel-20    24.2ns ± 6%    22.1ns ± 1%   -9.06%  (p=0.008 n=5+5)

name                  old alloc/op   new alloc/op   delta
NewSafeID-20             0.00B          0.00B          ~     (all equal)
NewSafeIDParallel-20     8.00B ± 0%     8.00B ± 0%     ~     (all equal)

name                  old allocs/op  new allocs/op  delta
NewSafeID-20              0.00           0.00          ~     (all equal)
NewSafeIDParallel-20      1.00 ± 0%      1.00 ± 0%     ~     (all equal)

Signed-off-by: Koichi Shiraishi <zchee.io@gmail.com>
  • Loading branch information
zchee committed Feb 14, 2022
1 parent c01cb38 commit 45a9c48
Showing 1 changed file with 7 additions and 10 deletions.
17 changes: 7 additions & 10 deletions messageID.go
@@ -1,6 +1,6 @@
package slack

import "sync"
import "sync/atomic"

// IDGenerator provides an interface for generating integer ID values.
type IDGenerator interface {
Expand All @@ -11,20 +11,17 @@ type IDGenerator interface {
// concurrent use by multiple goroutines.
func NewSafeID(startID int) IDGenerator {
return &safeID{
nextID: startID,
mutex: &sync.Mutex{},
nextID: int64(startID),
}
}

type safeID struct {
nextID int
mutex *sync.Mutex
nextID int64
}

func (s *safeID) Next() int {
s.mutex.Lock()
defer s.mutex.Unlock()
id := s.nextID
s.nextID++
func (s *safeID) Next() (id int) {
id = int(s.nextID)
atomic.AddInt64(&s.nextID, 1)

return id
}

0 comments on commit 45a9c48

Please sign in to comment.