Use stress tests for benchmarks
diff --git a/stress_test.go b/stress_test.go
index 3628c3d..72a65bd 100644
--- a/stress_test.go
+++ b/stress_test.go
@@ -31,112 +31,124 @@
 	_iterations  = 1000
 )
 
-func runStress(f func()) {
-	defer runtime.GOMAXPROCS(runtime.GOMAXPROCS(_parallelism))
+var _stressTests = map[string]func(){
+	"i32":    stressInt32,
+	"i64":    stressInt64,
+	"u32":    stressUint32,
+	"u64":    stressUint64,
+	"f64":    stressFloat64,
+	"bool":   stressBool,
+	"string": stressString,
+}
 
-	var wg sync.WaitGroup
-	wg.Add(_parallelism)
-	for i := 0; i < _parallelism; i++ {
-		go func() {
-			defer wg.Done()
-			for j := 0; j < _iterations; j++ {
+func TestStress(t *testing.T) {
+	for name, f := range _stressTests {
+		t.Run(name, func(t *testing.T) {
+			defer runtime.GOMAXPROCS(runtime.GOMAXPROCS(_parallelism))
+
+			start := make(chan struct{})
+			var wg sync.WaitGroup
+			wg.Add(_parallelism)
+			for i := 0; i < _parallelism; i++ {
+				go func() {
+					defer wg.Done()
+					<-start
+					for j := 0; j < _iterations; j++ {
+						f()
+					}
+				}()
+			}
+			close(start)
+			wg.Wait()
+		})
+	}
+}
+
+func BenchmarkStress(b *testing.B) {
+	for name, f := range _stressTests {
+		b.Run(name, func(b *testing.B) {
+			for i := 0; i < b.N; i++ {
 				f()
 			}
-		}()
+		})
 	}
-
-	wg.Wait()
 }
 
-func TestStressInt32(t *testing.T) {
+func stressInt32() {
 	var atom Int32
-	runStress(func() {
-		atom.Load()
-		atom.Add(1)
-		atom.Sub(2)
-		atom.Inc()
-		atom.Dec()
-		atom.CAS(1, 0)
-		atom.Swap(5)
-		atom.Store(1)
-	})
+	atom.Load()
+	atom.Add(1)
+	atom.Sub(2)
+	atom.Inc()
+	atom.Dec()
+	atom.CAS(1, 0)
+	atom.Swap(5)
+	atom.Store(1)
 }
 
-func TestStressInt64(t *testing.T) {
+func stressInt64() {
 	var atom Int64
-	runStress(func() {
-		atom.Load()
-		atom.Add(1)
-		atom.Sub(2)
-		atom.Inc()
-		atom.Dec()
-		atom.CAS(1, 0)
-		atom.Swap(5)
-		atom.Store(1)
-
-	})
+	atom.Load()
+	atom.Add(1)
+	atom.Sub(2)
+	atom.Inc()
+	atom.Dec()
+	atom.CAS(1, 0)
+	atom.Swap(5)
+	atom.Store(1)
 }
 
-func TestStressUint32(t *testing.T) {
+func stressUint32() {
 	var atom Uint32
-	runStress(func() {
-		atom.Load()
-		atom.Add(1)
-		atom.Sub(2)
-		atom.Inc()
-		atom.Dec()
-		atom.CAS(1, 0)
-		atom.Swap(5)
-		atom.Store(1)
-	})
+	atom.Load()
+	atom.Add(1)
+	atom.Sub(2)
+	atom.Inc()
+	atom.Dec()
+	atom.CAS(1, 0)
+	atom.Swap(5)
+	atom.Store(1)
 }
 
-func TestStressUint64(t *testing.T) {
+func stressUint64() {
 	var atom Uint64
-	runStress(func() {
-		atom.Load()
-		atom.Add(1)
-		atom.Sub(2)
-		atom.Inc()
-		atom.Dec()
-		atom.CAS(1, 0)
-		atom.Swap(5)
-		atom.Store(1)
-	})
+	atom.Load()
+	atom.Add(1)
+	atom.Sub(2)
+	atom.Inc()
+	atom.Dec()
+	atom.CAS(1, 0)
+	atom.Swap(5)
+	atom.Store(1)
 }
 
-func TestStressFloat64(t *testing.T) {
+func stressFloat64() {
 	var atom Float64
-	runStress(func() {
-		atom.Load()
-		atom.CAS(1.0, 0.1)
-		atom.Add(1.1)
-		atom.Sub(0.2)
-		atom.Store(1.0)
-	})
+	atom.Load()
+	atom.CAS(1.0, 0.1)
+	atom.Add(1.1)
+	atom.Sub(0.2)
+	atom.Store(1.0)
 }
 
-func TestStressBool(t *testing.T) {
+func stressBool() {
 	var atom Bool
-	runStress(func() {
-		atom.Load()
-		atom.Store(false)
-		atom.Swap(true)
-		atom.CAS(true, false)
-		atom.CAS(true, false)
-		atom.Load()
-		atom.Toggle()
-		atom.Toggle()
-	})
+	atom.Load()
+	atom.Store(false)
+	atom.Swap(true)
+	atom.CAS(true, false)
+	atom.CAS(true, false)
+	atom.Load()
+	atom.Toggle()
+	atom.Toggle()
 }
 
-func TestStressString(t *testing.T) {
+func stressString() {
 	var atom String
-	runStress(func() {
-		atom.Load()
-		atom.Store("abc")
-		atom.Load()
-		atom.Store("def")
-
-	})
+	atom.Load()
+	atom.Store("abc")
+	atom.Load()
+	atom.Store("def")
+	atom.Load()
+	atom.Store("")
 }