aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bench_test.go127
-rw-r--r--stm_test.go122
2 files changed, 127 insertions, 122 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()
+ }
+}
diff --git a/stm_test.go b/stm_test.go
index 1b1b737..233dff8 100644
--- a/stm_test.go
+++ b/stm_test.go
@@ -1,7 +1,6 @@
package stm
import (
- "sync"
"testing"
"time"
)
@@ -217,124 +216,3 @@ func TestAtomicSetRetry(t *testing.T) {
t.Fatal("AtomicSet did not wake up a waiting transaction")
}
}
-
-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()
- }
-}