From 8c856954069ebf711a54b96647e7be6ff9fae7c1 Mon Sep 17 00:00:00 2001 From: Arne Hormann Date: Wed, 24 Apr 2013 18:33:21 +0200 Subject: [PATCH 1/4] add simple benchmarks for speed testing --- benchmark_test.go | 76 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 benchmark_test.go diff --git a/benchmark_test.go b/benchmark_test.go new file mode 100644 index 000000000..440f75c0e --- /dev/null +++ b/benchmark_test.go @@ -0,0 +1,76 @@ +package mysql + +import ( + "database/sql" + "strings" + "testing" +) + +var ( + // dsn from driver_test.go + sample = []byte(strings.Repeat("0123456789abcdef", 1024*1024)) +) + +func BenchmarkRoundtripText(b *testing.B) { + db, err := sql.Open("mysql", dsn) + if err != nil { + b.Fatalf("crashed") + } + var result string + for i := 0; i < b.N; i++ { + length := 16 + i%(4*b.N) + test := string(sample[0:length]) + rows, err := db.Query("SELECT \"" + test + "\"") + if err != nil { + b.Fatalf("crashed") + } + if !rows.Next() { + rows.Close() + b.Fatalf("crashed") + } + err = rows.Scan(&result) + if err != nil { + rows.Close() + b.Fatalf("crashed") + } + if result != test { + rows.Close() + b.Errorf("mismatch") + } + rows.Close() + } +} + +func BenchmarkRoundtripPrepared(b *testing.B) { + db, err := sql.Open("mysql", dsn) + if err != nil { + b.Fatalf("crashed") + } + var result string + stmt, err := db.Prepare("SELECT ?") + if err != nil { + b.Fatalf("crashed") + } + for i := 0; i < b.N; i++ { + length := 16 + i%(4*b.N) + test := string(sample[0:length]) + rows, err := stmt.Query(test) + if err != nil { + b.Fatalf("crashed") + } + if !rows.Next() { + rows.Close() + b.Fatalf("crashed") + } + err = rows.Scan(&result) + if err != nil { + rows.Close() + b.Fatalf("crashed") + } + if result != test { + rows.Close() + b.Errorf("mismatch") + } + rows.Close() + } +} From 014e34c949588fc2ad713d2e84d872cf51b37b56 Mon Sep 17 00:00:00 2001 From: Arne Hormann Date: Thu, 25 Apr 2013 14:01:23 +0200 Subject: [PATCH 2/4] close connection --- benchmark_test.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/benchmark_test.go b/benchmark_test.go index 440f75c0e..3a328fd66 100644 --- a/benchmark_test.go +++ b/benchmark_test.go @@ -16,6 +16,7 @@ func BenchmarkRoundtripText(b *testing.B) { if err != nil { b.Fatalf("crashed") } + defer db.Close() var result string for i := 0; i < b.N; i++ { length := 16 + i%(4*b.N) @@ -46,6 +47,7 @@ func BenchmarkRoundtripPrepared(b *testing.B) { if err != nil { b.Fatalf("crashed") } + defer db.Close() var result string stmt, err := db.Prepare("SELECT ?") if err != nil { From 3cf796c5759dc664f698b256f7a0ee0f78917378 Mon Sep 17 00:00:00 2001 From: Arne Hormann Date: Fri, 26 Apr 2013 10:16:47 +0200 Subject: [PATCH 3/4] use sane value for length of string selected; merged with current master --- benchmark_test.go | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/benchmark_test.go b/benchmark_test.go index 3a328fd66..1510c9435 100644 --- a/benchmark_test.go +++ b/benchmark_test.go @@ -8,7 +8,8 @@ import ( var ( // dsn from driver_test.go - sample = []byte(strings.Repeat("0123456789abcdef", 1024*1024)) + sample = []byte(strings.Repeat("0123456789abcdef", 1024*1024)) + min, max = 16, len(sample) ) func BenchmarkRoundtripText(b *testing.B) { @@ -19,7 +20,10 @@ func BenchmarkRoundtripText(b *testing.B) { defer db.Close() var result string for i := 0; i < b.N; i++ { - length := 16 + i%(4*b.N) + length := min + i + if length > max { + length = max + } test := string(sample[0:length]) rows, err := db.Query("SELECT \"" + test + "\"") if err != nil { @@ -54,7 +58,10 @@ func BenchmarkRoundtripPrepared(b *testing.B) { b.Fatalf("crashed") } for i := 0; i < b.N; i++ { - length := 16 + i%(4*b.N) + length := min + i + if length > max { + length = max + } test := string(sample[0:length]) rows, err := stmt.Query(test) if err != nil { From 515e1e230c9b77e58b46622b0b02a1695c171902 Mon Sep 17 00:00:00 2001 From: Arne Hormann Date: Mon, 13 May 2013 16:09:11 +0200 Subject: [PATCH 4/4] moved benchmarks to driver_test.go, lazy initialization --- benchmark_test.go | 85 ----------------------------------------------- driver_test.go | 84 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 84 insertions(+), 85 deletions(-) delete mode 100644 benchmark_test.go diff --git a/benchmark_test.go b/benchmark_test.go deleted file mode 100644 index 1510c9435..000000000 --- a/benchmark_test.go +++ /dev/null @@ -1,85 +0,0 @@ -package mysql - -import ( - "database/sql" - "strings" - "testing" -) - -var ( - // dsn from driver_test.go - sample = []byte(strings.Repeat("0123456789abcdef", 1024*1024)) - min, max = 16, len(sample) -) - -func BenchmarkRoundtripText(b *testing.B) { - db, err := sql.Open("mysql", dsn) - if err != nil { - b.Fatalf("crashed") - } - defer db.Close() - var result string - for i := 0; i < b.N; i++ { - length := min + i - if length > max { - length = max - } - test := string(sample[0:length]) - rows, err := db.Query("SELECT \"" + test + "\"") - if err != nil { - b.Fatalf("crashed") - } - if !rows.Next() { - rows.Close() - b.Fatalf("crashed") - } - err = rows.Scan(&result) - if err != nil { - rows.Close() - b.Fatalf("crashed") - } - if result != test { - rows.Close() - b.Errorf("mismatch") - } - rows.Close() - } -} - -func BenchmarkRoundtripPrepared(b *testing.B) { - db, err := sql.Open("mysql", dsn) - if err != nil { - b.Fatalf("crashed") - } - defer db.Close() - var result string - stmt, err := db.Prepare("SELECT ?") - if err != nil { - b.Fatalf("crashed") - } - for i := 0; i < b.N; i++ { - length := min + i - if length > max { - length = max - } - test := string(sample[0:length]) - rows, err := stmt.Query(test) - if err != nil { - b.Fatalf("crashed") - } - if !rows.Next() { - rows.Close() - b.Fatalf("crashed") - } - err = rows.Scan(&result) - if err != nil { - rows.Close() - b.Fatalf("crashed") - } - if result != test { - rows.Close() - b.Errorf("mismatch") - } - rows.Close() - } -} diff --git a/driver_test.go b/driver_test.go index 09823331f..f4a930eae 100644 --- a/driver_test.go +++ b/driver_test.go @@ -1032,3 +1032,87 @@ func TestConcurrent(t *testing.T) { dbt.Logf("Reached %d concurrent connections \r\n", max) }) } + +// BENCHMARKS +var sample []byte + +func initBenchmarks() ([]byte, int, int) { + if sample == nil { + sample = []byte(strings.Repeat("0123456789abcdef", 1024*1024)) + } + return sample, 16, len(sample) +} + +func BenchmarkRoundtripText(b *testing.B) { + sample, min, max := initBenchmarks() + db, err := sql.Open("mysql", dsn) + if err != nil { + b.Fatalf("crashed") + } + defer db.Close() + var result string + for i := 0; i < b.N; i++ { + length := min + i + if length > max { + length = max + } + test := string(sample[0:length]) + rows, err := db.Query("SELECT \"" + test + "\"") + if err != nil { + b.Fatalf("crashed") + } + if !rows.Next() { + rows.Close() + b.Fatalf("crashed") + } + err = rows.Scan(&result) + if err != nil { + rows.Close() + b.Fatalf("crashed") + } + if result != test { + rows.Close() + b.Errorf("mismatch") + } + rows.Close() + } +} + +func BenchmarkRoundtripPrepared(b *testing.B) { + sample, min, max := initBenchmarks() + db, err := sql.Open("mysql", dsn) + if err != nil { + b.Fatalf("crashed") + } + defer db.Close() + var result string + stmt, err := db.Prepare("SELECT ?") + if err != nil { + b.Fatalf("crashed") + } + for i := 0; i < b.N; i++ { + length := min + i + if length > max { + length = max + } + test := string(sample[0:length]) + rows, err := stmt.Query(test) + if err != nil { + b.Fatalf("crashed") + } + if !rows.Next() { + rows.Close() + b.Fatalf("crashed") + } + err = rows.Scan(&result) + if err != nil { + rows.Close() + b.Fatalf("crashed") + } + if result != test { + rows.Close() + b.Errorf("mismatch") + } + rows.Close() + } +}