|
@@ -2,6 +2,8 @@ package errorx
|
|
|
|
|
|
import (
|
|
import (
|
|
"errors"
|
|
"errors"
|
|
|
|
+ "sync"
|
|
|
|
+ "sync/atomic"
|
|
"testing"
|
|
"testing"
|
|
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/assert"
|
|
@@ -19,3 +21,53 @@ func TestAtomicErrorNil(t *testing.T) {
|
|
var err AtomicError
|
|
var err AtomicError
|
|
assert.Nil(t, err.Load())
|
|
assert.Nil(t, err.Load())
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+func BenchmarkAtomicError(b *testing.B) {
|
|
|
|
+ var aerr AtomicError
|
|
|
|
+ wg := sync.WaitGroup{}
|
|
|
|
+
|
|
|
|
+ b.Run("Load", func(b *testing.B) {
|
|
|
|
+ var done uint32
|
|
|
|
+ go func() {
|
|
|
|
+ for {
|
|
|
|
+ if atomic.LoadUint32(&done) != 0 {
|
|
|
|
+ break
|
|
|
|
+ }
|
|
|
|
+ wg.Add(1)
|
|
|
|
+ go func() {
|
|
|
|
+ aerr.Set(errDummy)
|
|
|
|
+ wg.Done()
|
|
|
|
+ }()
|
|
|
|
+ }
|
|
|
|
+ }()
|
|
|
|
+ b.ResetTimer()
|
|
|
|
+ for i := 0; i < b.N; i++ {
|
|
|
|
+ _ = aerr.Load()
|
|
|
|
+ }
|
|
|
|
+ b.StopTimer()
|
|
|
|
+ atomic.StoreUint32(&done, 1)
|
|
|
|
+ wg.Wait()
|
|
|
|
+ })
|
|
|
|
+ b.Run("Set", func(b *testing.B) {
|
|
|
|
+ var done uint32
|
|
|
|
+ go func() {
|
|
|
|
+ for {
|
|
|
|
+ if atomic.LoadUint32(&done) != 0 {
|
|
|
|
+ break
|
|
|
|
+ }
|
|
|
|
+ wg.Add(1)
|
|
|
|
+ go func() {
|
|
|
|
+ _ = aerr.Load()
|
|
|
|
+ wg.Done()
|
|
|
|
+ }()
|
|
|
|
+ }
|
|
|
|
+ }()
|
|
|
|
+ b.ResetTimer()
|
|
|
|
+ for i := 0; i < b.N; i++ {
|
|
|
|
+ aerr.Set(errDummy)
|
|
|
|
+ }
|
|
|
|
+ b.StopTimer()
|
|
|
|
+ atomic.StoreUint32(&done, 1)
|
|
|
|
+ wg.Wait()
|
|
|
|
+ })
|
|
|
|
+}
|