From 253c47c88fbc1a65acaf05dd4b33c4fbe918b20c Mon Sep 17 00:00:00 2001 From: Inada Naoki Date: Wed, 3 Apr 2019 21:33:13 +0900 Subject: [PATCH 1/2] add benchmark for sql.RawBytes --- benchmark_test.go | 49 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/benchmark_test.go b/benchmark_test.go index 5828d40f9..869784c7a 100644 --- a/benchmark_test.go +++ b/benchmark_test.go @@ -317,3 +317,52 @@ func BenchmarkExecContext(b *testing.B) { }) } } + +// BenchmarkQueryRawBytes benchmarks fetching 100 blobs using sql.RawBytes. +// "size=" means size of each blobs. +func BenchmarkQueryRawBytes(b *testing.B) { + var sizes []int = []int{100, 1000, 2000, 4000, 8000, 12000, 16000, 32000, 64000, 256000} + db := initDB(b, + "DROP TABLE IF EXISTS bench_rawbytes", + "CREATE TABLE bench_rawbytes (id INT PRIMARY KEY, val LONGBLOB)", + ) + defer db.Close() + + blob := make([]byte, sizes[len(sizes)-1]) + for i := range blob { + blob[i] = 42 + } + for i := 0; i < 100; i++ { + _, err := db.Exec("INSERT INTO bench_rawbytes VALUES (?, ?)", i, blob) + if err != nil { + b.Fatal(err) + } + } + for _, s := range sizes { + b.Run(fmt.Sprintf("size=%v", s), func(b *testing.B) { + b.ReportAllocs() + for j := 0; j < b.N; j++ { + rows, err := db.Query("SELECT LEFT(val, ?) as v FROM bench_rawbytes", s) + if err != nil { + b.Fatal(err) + } + nrows := 0 + for rows.Next() { + var buf sql.RawBytes + err := rows.Scan(&buf) + if err != nil { + b.Fatal(err) + } + if len(buf) != s { + b.Fatalf("size mismatch: expected %v, got %v", s, len(buf)) + } + nrows++ + } + rows.Close() + if nrows != 100 { + b.Fatalf("numbers of rows mismatch: expected %v, got %v", 100, nrows) + } + } + }) + } +} From 5d1faf2480f507d2e4ba48f01c7733f2284f0651 Mon Sep 17 00:00:00 2001 From: Inada Naoki Date: Thu, 4 Apr 2019 11:49:51 +0900 Subject: [PATCH 2/2] don't reuse connection over subbenchs --- benchmark_test.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/benchmark_test.go b/benchmark_test.go index 869784c7a..3e25a3bf2 100644 --- a/benchmark_test.go +++ b/benchmark_test.go @@ -338,9 +338,14 @@ func BenchmarkQueryRawBytes(b *testing.B) { b.Fatal(err) } } + for _, s := range sizes { b.Run(fmt.Sprintf("size=%v", s), func(b *testing.B) { + db.SetMaxIdleConns(0) + db.SetMaxIdleConns(1) b.ReportAllocs() + b.ResetTimer() + for j := 0; j < b.N; j++ { rows, err := db.Query("SELECT LEFT(val, ?) as v FROM bench_rawbytes", s) if err != nil {