]> Cypherpunks repositories - gostls13.git/commit
expvar: Use sync/atomic to manipulate Int for better perf
authorEvan Phoenix <evan@phx.io>
Wed, 28 Jan 2015 17:16:44 +0000 (09:16 -0800)
committerDmitry Vyukov <dvyukov@google.com>
Thu, 29 Jan 2015 08:24:00 +0000 (08:24 +0000)
commitbd043d862962ec844994a658d8b4f8ab89b6d80e
tree95803d98c48c25f1948638a80c9788e261adfdbc
parentb49c3ac2d50c1aed28bc55b09415ad8d861237e9
expvar: Use sync/atomic to manipulate Int for better perf

Using a mutex to protect a single int operation is quite heavyweight.
Using sync/atomic provides much better performance. This change was
benchmarked as such:

BenchmarkSync   10000000       139 ns/op
BenchmarkAtomic 200000000      9.90 ns/op

package blah

import (
        "sync"
        "sync/atomic"
        "testing"
)

type Int struct {
        mu sync.RWMutex
        i  int64
}

func (v *Int) Add(delta int64) {
        v.mu.Lock()
        defer v.mu.Unlock()
        v.i += delta
}

type AtomicInt struct {
        i int64
}

func (v *AtomicInt) Add(delta int64) {
        atomic.AddInt64(&v.i, delta)
}

func BenchmarkSync(b *testing.B) {
        s := new(Int)

        for i := 0; i < b.N; i++ {
                s.Add(1)
        }
}

func BenchmarkAtomic(b *testing.B) {
        s := new(AtomicInt)

        for i := 0; i < b.N; i++ {
                s.Add(1)
        }
}

Change-Id: I6998239c785967647351bbfe8533c38e4894543b
Reviewed-on: https://go-review.googlesource.com/3430
Reviewed-by: Dmitry Vyukov <dvyukov@google.com>
src/expvar/expvar.go