| // Go MySQL Driver - A MySQL-Driver for Go's database/sql package |
| // |
| // Copyright 2017 The Go-MySQL-Driver Authors. All rights reserved. |
| // |
| // This Source Code Form is subject to the terms of the Mozilla Public |
| // License, v. 2.0. If a copy of the MPL was not distributed with this file, |
| // You can obtain one at http://mozilla.org/MPL/2.0/. |
| |
| // +build go1.8 |
| |
| package mysql |
| |
| import ( |
| "context" |
| "database/sql" |
| "fmt" |
| "runtime" |
| "testing" |
| ) |
| |
| func benchmarkQueryContext(b *testing.B, db *sql.DB, p int) { |
| ctx, cancel := context.WithCancel(context.Background()) |
| defer cancel() |
| db.SetMaxIdleConns(p * runtime.GOMAXPROCS(0)) |
| |
| tb := (*TB)(b) |
| stmt := tb.checkStmt(db.PrepareContext(ctx, "SELECT val FROM foo WHERE id=?")) |
| defer stmt.Close() |
| |
| b.SetParallelism(p) |
| b.ReportAllocs() |
| b.ResetTimer() |
| b.RunParallel(func(pb *testing.PB) { |
| var got string |
| for pb.Next() { |
| tb.check(stmt.QueryRow(1).Scan(&got)) |
| if got != "one" { |
| b.Fatalf("query = %q; want one", got) |
| } |
| } |
| }) |
| } |
| |
| func BenchmarkQueryContext(b *testing.B) { |
| db := initDB(b, |
| "DROP TABLE IF EXISTS foo", |
| "CREATE TABLE foo (id INT PRIMARY KEY, val CHAR(50))", |
| `INSERT INTO foo VALUES (1, "one")`, |
| `INSERT INTO foo VALUES (2, "two")`, |
| ) |
| defer db.Close() |
| for _, p := range []int{1, 2, 3, 4} { |
| b.Run(fmt.Sprintf("%d", p), func(b *testing.B) { |
| benchmarkQueryContext(b, db, p) |
| }) |
| } |
| } |
| |
| func benchmarkExecContext(b *testing.B, db *sql.DB, p int) { |
| ctx, cancel := context.WithCancel(context.Background()) |
| defer cancel() |
| db.SetMaxIdleConns(p * runtime.GOMAXPROCS(0)) |
| |
| tb := (*TB)(b) |
| stmt := tb.checkStmt(db.PrepareContext(ctx, "DO 1")) |
| defer stmt.Close() |
| |
| b.SetParallelism(p) |
| b.ReportAllocs() |
| b.ResetTimer() |
| b.RunParallel(func(pb *testing.PB) { |
| for pb.Next() { |
| if _, err := stmt.ExecContext(ctx); err != nil { |
| b.Fatal(err) |
| } |
| } |
| }) |
| } |
| |
| func BenchmarkExecContext(b *testing.B) { |
| db := initDB(b, |
| "DROP TABLE IF EXISTS foo", |
| "CREATE TABLE foo (id INT PRIMARY KEY, val CHAR(50))", |
| `INSERT INTO foo VALUES (1, "one")`, |
| `INSERT INTO foo VALUES (2, "two")`, |
| ) |
| defer db.Close() |
| for _, p := range []int{1, 2, 3, 4} { |
| b.Run(fmt.Sprintf("%d", p), func(b *testing.B) { |
| benchmarkQueryContext(b, db, p) |
| }) |
| } |
| } |