Kaynağa Gözat

Merge pull request #133 from go-sql-driver/exec-bench

Add an Exec Benchmark
Julien Schmidt 12 yıl önce
ebeveyn
işleme
e29272ae0b
1 değiştirilmiş dosya ile 33 ekleme ve 1 silme
  1. 33 1
      benchmark_test.go

+ 33 - 1
benchmark_test.go

@@ -51,7 +51,6 @@ func initDB(b *testing.B, queries ...string) *sql.DB {
 	return db
 }
 
-// by Brad Fitzpatrick
 const concurrencyLevel = 10
 
 func BenchmarkQuery(b *testing.B) {
@@ -93,6 +92,39 @@ func BenchmarkQuery(b *testing.B) {
 	}
 }
 
+func BenchmarkExec(b *testing.B) {
+	tb := (*TB)(b)
+	b.StopTimer()
+	b.ReportAllocs()
+	db := tb.checkDB(sql.Open("mysql", dsn))
+	db.SetMaxIdleConns(concurrencyLevel)
+	defer db.Close()
+
+	stmt := tb.checkStmt(db.Prepare("DO 1"))
+	defer stmt.Close()
+
+	remain := int64(b.N)
+	var wg sync.WaitGroup
+	wg.Add(concurrencyLevel)
+	defer wg.Wait()
+	b.StartTimer()
+
+	for i := 0; i < concurrencyLevel; i++ {
+		go func() {
+			for {
+				if atomic.AddInt64(&remain, -1) < 0 {
+					wg.Done()
+					return
+				}
+
+				if _, err := stmt.Exec(); err != nil {
+					b.Fatal(err.Error())
+				}
+			}
+		}()
+	}
+}
+
 // data, but no db writes
 var roundtripSample []byte