aboutsummaryrefslogtreecommitdiff
path: root/bench_test.go
diff options
context:
space:
mode:
authorMatt Joiner <anacrolix@gmail.com>2019-10-23 15:33:39 +1100
committerMatt Joiner <anacrolix@gmail.com>2019-10-23 15:33:39 +1100
commit2ed906ee34bd63a42148ead1f7c5023be920e627 (patch)
tree1fea77fe7ce056ed36eef4bbb4e1c0bc3ab28693 /bench_test.go
parentMake the santa example a cmd (diff)
downloadstm-2ed906ee34bd63a42148ead1f7c5023be920e627.tar.gz
stm-2ed906ee34bd63a42148ead1f7c5023be920e627.tar.xz
Put benchmarks in their own file
Diffstat (limited to 'bench_test.go')
-rw-r--r--bench_test.go127
1 files changed, 127 insertions, 0 deletions
diff --git a/bench_test.go b/bench_test.go
new file mode 100644
index 0000000..f87477e
--- /dev/null
+++ b/bench_test.go
@@ -0,0 +1,127 @@
+package stm
+
+import (
+ "sync"
+ "testing"
+)
+
+func BenchmarkAtomicGet(b *testing.B) {
+ x := NewVar(0)
+ for i := 0; i < b.N; i++ {
+ AtomicGet(x)
+ }
+}
+
+func BenchmarkAtomicSet(b *testing.B) {
+ x := NewVar(0)
+ for i := 0; i < b.N; i++ {
+ AtomicSet(x, 0)
+ }
+}
+
+func BenchmarkIncrementSTM(b *testing.B) {
+ for i := 0; i < b.N; i++ {
+ // spawn 1000 goroutines that each increment x by 1
+ x := NewVar(0)
+ for i := 0; i < 1000; i++ {
+ go Atomically(func(tx *Tx) {
+ cur := tx.Get(x).(int)
+ tx.Set(x, cur+1)
+ })
+ }
+ // wait for x to reach 1000
+ Atomically(func(tx *Tx) {
+ tx.Assert(tx.Get(x).(int) == 1000)
+ })
+ }
+}
+
+func BenchmarkIncrementMutex(b *testing.B) {
+ for i := 0; i < b.N; i++ {
+ var mu sync.Mutex
+ x := 0
+ for i := 0; i < 1000; i++ {
+ go func() {
+ mu.Lock()
+ x++
+ mu.Unlock()
+ }()
+ }
+ for {
+ mu.Lock()
+ read := x
+ mu.Unlock()
+ if read == 1000 {
+ break
+ }
+ }
+ }
+}
+
+func BenchmarkIncrementChannel(b *testing.B) {
+ for i := 0; i < b.N; i++ {
+ c := make(chan int, 1)
+ c <- 0
+ for i := 0; i < 1000; i++ {
+ go func() {
+ c <- 1 + <-c
+ }()
+ }
+ for {
+ read := <-c
+ if read == 1000 {
+ break
+ }
+ c <- read
+ }
+ }
+}
+
+func BenchmarkReadVarSTM(b *testing.B) {
+ for i := 0; i < b.N; i++ {
+ var wg sync.WaitGroup
+ wg.Add(1000)
+ x := NewVar(0)
+ for i := 0; i < 1000; i++ {
+ go func() {
+ AtomicGet(x)
+ wg.Done()
+ }()
+ }
+ wg.Wait()
+ }
+}
+
+func BenchmarkReadVarMutex(b *testing.B) {
+ for i := 0; i < b.N; i++ {
+ var mu sync.Mutex
+ var wg sync.WaitGroup
+ wg.Add(1000)
+ x := 0
+ for i := 0; i < 1000; i++ {
+ go func() {
+ mu.Lock()
+ _ = x
+ mu.Unlock()
+ wg.Done()
+ }()
+ }
+ wg.Wait()
+ }
+}
+
+func BenchmarkReadVarChannel(b *testing.B) {
+ for i := 0; i < b.N; i++ {
+ var wg sync.WaitGroup
+ wg.Add(1000)
+ c := make(chan int)
+ close(c)
+ for i := 0; i < 1000; i++ {
+ go func() {
+ <-c
+ wg.Done()
+ }()
+ }
+ wg.Wait()
+ }
+}