forked from mirror/abool
95 lines
1.3 KiB
Go
95 lines
1.3 KiB
Go
|
package abool
|
||
|
|
||
|
import (
|
||
|
"sync"
|
||
|
"sync/atomic"
|
||
|
"testing"
|
||
|
)
|
||
|
|
||
|
func TestBool(t *testing.T) {
|
||
|
v := New()
|
||
|
if v.IsSet() {
|
||
|
t.Fatal("Empty value of AtomicBool should be false")
|
||
|
}
|
||
|
|
||
|
v.Set()
|
||
|
if !v.IsSet() {
|
||
|
t.Fatal("AtomicBool.Set() failed")
|
||
|
}
|
||
|
|
||
|
v.UnSet()
|
||
|
if v.IsSet() {
|
||
|
t.Fatal("AtomicBool.UnSet() failed")
|
||
|
}
|
||
|
|
||
|
v.SetTo(true)
|
||
|
if !v.IsSet() {
|
||
|
t.Fatal("AtomicBool.SetTo(true) failed")
|
||
|
}
|
||
|
|
||
|
v.SetTo(false)
|
||
|
if v.IsSet() {
|
||
|
t.Fatal("AtomicBool.SetTo(false) failed")
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Benchmark Read
|
||
|
|
||
|
func BenchmarkMutexRead(b *testing.B) {
|
||
|
var m sync.RWMutex
|
||
|
var v bool
|
||
|
b.ResetTimer()
|
||
|
for i := 0; i < b.N; i++ {
|
||
|
m.RLock()
|
||
|
_ = v
|
||
|
m.RUnlock()
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func BenchmarkAtomicValueRead(b *testing.B) {
|
||
|
var v atomic.Value
|
||
|
b.ResetTimer()
|
||
|
for i := 0; i < b.N; i++ {
|
||
|
_ = v.Load() != nil
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func BenchmarkAtomicBoolRead(b *testing.B) {
|
||
|
v := New()
|
||
|
b.ResetTimer()
|
||
|
for i := 0; i < b.N; i++ {
|
||
|
_ = v.IsSet()
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Benchmark Write
|
||
|
|
||
|
func BenchmarkMutexWrite(b *testing.B) {
|
||
|
var m sync.RWMutex
|
||
|
var v bool
|
||
|
b.ResetTimer()
|
||
|
for i := 0; i < b.N; i++ {
|
||
|
m.RLock()
|
||
|
v = true
|
||
|
m.RUnlock()
|
||
|
}
|
||
|
b.StopTimer()
|
||
|
_ = v
|
||
|
}
|
||
|
|
||
|
func BenchmarkAtomicValueWrite(b *testing.B) {
|
||
|
var v atomic.Value
|
||
|
b.ResetTimer()
|
||
|
for i := 0; i < b.N; i++ {
|
||
|
v.Store(true)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func BenchmarkAtomicBoolWrite(b *testing.B) {
|
||
|
v := New()
|
||
|
b.ResetTimer()
|
||
|
for i := 0; i < b.N; i++ {
|
||
|
v.Set()
|
||
|
}
|
||
|
}
|