From 3d2c78e8c96e0ede16b8f9c1336c84a97b53fd06 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Carlos=20Nieto?= <jose.carlos@menteslibres.net> Date: Sat, 19 Mar 2016 08:08:06 -0600 Subject: [PATCH] Adding dbr test. --- postgresql/Makefile | 2 +- postgresql/benchmark_test.go | 221 +++++++++++++++++++++++++++++++++-- 2 files changed, 210 insertions(+), 13 deletions(-) diff --git a/postgresql/Makefile b/postgresql/Makefile index 66a685c6..443844c5 100644 --- a/postgresql/Makefile +++ b/postgresql/Makefile @@ -1,5 +1,5 @@ TEST_HOST ?= 127.0.0.1 -BENCHTIME ?= 10s +BENCHTIME ?= 2s build: go build && go install diff --git a/postgresql/benchmark_test.go b/postgresql/benchmark_test.go index 67cf1888..d1fcab85 100644 --- a/postgresql/benchmark_test.go +++ b/postgresql/benchmark_test.go @@ -6,6 +6,7 @@ import ( "testing" "database/sql" + "github.com/gocraft/dbr" // They're pretty good at optimization, so we want to benchmark against them. "upper.io/db.v2" ) @@ -14,6 +15,15 @@ const ( testRows = 1000 ) +func tearUp() error { + sess, err := connectAndAddFakeRows() + if err != nil { + return err + } + sess.Close() + return nil +} + func updatedArtistN(i int) string { return fmt.Sprintf("Updated Artist %d", i%testRows) } @@ -45,9 +55,9 @@ func connectAndAddFakeRows() (db.Database, error) { return sess, nil } -// BenchmarkSQLAppend benchmarks raw INSERT SQL queries without using prepared +// BenchmarkSQLInsert benchmarks raw INSERT SQL queries without using prepared // statements nor arguments. -func BenchmarkSQLAppend(b *testing.B) { +func BenchmarkSQLInsert(b *testing.B) { var err error var sess db.Database @@ -71,10 +81,36 @@ func BenchmarkSQLAppend(b *testing.B) { } } -// BenchmarkSQLAppendWithArgs benchmarks raw SQL queries with arguments but +// BenchmarkDBRInsert benchmarks raw INSERT SQL queries without using prepared +// statements nor arguments. +func BenchmarkDBRInsert(b *testing.B) { + var err error + + conn, err := dbr.Open("postgres", settings.String(), nil) + if err != nil { + b.Fatal(err) + } + + sess := conn.NewSession(nil) + + defer sess.Close() + + if _, err = sess.Exec(`TRUNCATE TABLE "artist" RESTART IDENTITY`); err != nil { + b.Fatal(err) + } + + b.ResetTimer() + for i := 0; i < b.N; i++ { + if _, err = sess.Exec(`INSERT INTO "artist" ("name") VALUES('Hayao Miyazaki')`); err != nil { + b.Fatal(err) + } + } +} + +// BenchmarkSQLInsertWithArgs benchmarks raw SQL queries with arguments but // without using prepared statements. The SQL query looks like the one that is // generated by upper.io/db.v2. -func BenchmarkSQLAppendWithArgs(b *testing.B) { +func BenchmarkSQLInsertWithArgs(b *testing.B) { var err error var sess db.Database @@ -105,9 +141,40 @@ func BenchmarkSQLAppendWithArgs(b *testing.B) { } } -// BenchmarkSQLPreparedAppend benchmarks raw INSERT SQL queries using prepared +func BenchmarkDBRInsertWithArgs(b *testing.B) { + var err error + + conn, err := dbr.Open("postgres", settings.String(), nil) + if err != nil { + b.Fatal(err) + } + + sess := conn.NewSession(nil) + + defer sess.Close() + + if _, err = sess.Exec(`TRUNCATE TABLE "artist" RESTART IDENTITY`); err != nil { + b.Fatal(err) + } + + args := []interface{}{ + "Hayao Miyazaki", + } + + var rows *sql.Rows + + b.ResetTimer() + for i := 0; i < b.N; i++ { + if rows, err = sess.Query(`INSERT INTO "artist" ("name") VALUES($1) RETURNING "id"`, args...); err != nil { + b.Fatal(err) + } + rows.Close() + } +} + +// BenchmarkSQLPreparedInsert benchmarks raw INSERT SQL queries using prepared // statements but no arguments. -func BenchmarkSQLPreparedAppend(b *testing.B) { +func BenchmarkSQLPreparedInsert(b *testing.B) { var err error var sess db.Database @@ -136,10 +203,10 @@ func BenchmarkSQLPreparedAppend(b *testing.B) { } } -// BenchmarkSQLAppendWithArgs benchmarks raw INSERT SQL queries with arguments +// BenchmarkSQLInsertWithArgs benchmarks raw INSERT SQL queries with arguments // using prepared statements. The SQL query looks like the one that is // generated by upper.io/db.v2. -func BenchmarkSQLPreparedAppendWithArgs(b *testing.B) { +func BenchmarkSQLPreparedInsertWithArgs(b *testing.B) { var err error var sess db.Database @@ -176,10 +243,47 @@ func BenchmarkSQLPreparedAppendWithArgs(b *testing.B) { } } -// BenchmarkSQLAppendWithVariableArgs benchmarks raw INSERT SQL queries with +func BenchmarkDBRPreparedInsertWithArgs(b *testing.B) { + var err error + + conn, err := dbr.Open("postgres", settings.String(), nil) + if err != nil { + b.Fatal(err) + } + + sess := conn.NewSession(nil) + + defer sess.Close() + + if _, err = sess.Exec(`TRUNCATE TABLE "artist"`); err != nil { + b.Fatal(err) + } + + stmt, err := sess.Prepare(`INSERT INTO "artist" ("name") VALUES($1) RETURNING "id"`) + + if err != nil { + b.Fatal(err) + } + + args := []interface{}{ + "Hayao Miyazaki", + } + + var rows *sql.Rows + + b.ResetTimer() + for i := 0; i < b.N; i++ { + if rows, err = stmt.Query(args...); err != nil { + b.Fatal(err) + } + rows.Close() + } +} + +// BenchmarkSQLInsertWithVariableArgs benchmarks raw INSERT SQL queries with // arguments using prepared statements. The SQL query looks like the one that // is generated by upper.io/db.v2. -func BenchmarkSQLPreparedAppendWithVariableArgs(b *testing.B) { +func BenchmarkSQLPreparedInsertWithVariableArgs(b *testing.B) { var err error var sess db.Database @@ -215,10 +319,46 @@ func BenchmarkSQLPreparedAppendWithVariableArgs(b *testing.B) { } } -// BenchmarkSQLPreparedAppendTransactionWithArgs benchmarks raw INSERT queries +func BenchmarkDBRPreparedInsertWithVariableArgs(b *testing.B) { + var err error + + conn, err := dbr.Open("postgres", settings.String(), nil) + if err != nil { + b.Fatal(err) + } + + sess := conn.NewSession(nil) + + defer sess.Close() + + if _, err = sess.Exec(`TRUNCATE TABLE "artist"`); err != nil { + b.Fatal(err) + } + + stmt, err := sess.Prepare(`INSERT INTO "artist" ("name") VALUES($1) RETURNING "id"`) + + if err != nil { + b.Fatal(err) + } + + var rows *sql.Rows + + b.ResetTimer() + for i := 0; i < b.N; i++ { + args := []interface{}{ + fmt.Sprintf("Hayao Miyazaki %d", rand.Int()), + } + if rows, err = stmt.Query(args...); err != nil { + b.Fatal(err) + } + rows.Close() + } +} + +// BenchmarkSQLPreparedInsertTransactionWithArgs benchmarks raw INSERT queries // within a transaction block with arguments and prepared statements. SQL // queries look like those generated by upper.io/db.v2. -func BenchmarkSQLPreparedAppendTransactionWithArgs(b *testing.B) { +func BenchmarkSQLPreparedInsertTransactionWithArgs(b *testing.B) { var err error var sess db.Database var tx *sql.Tx @@ -431,6 +571,33 @@ func BenchmarkSQLSelect(b *testing.B) { } } +func BenchmarkDBRSelect(b *testing.B) { + var err error + + if err := tearUp(); err != nil { + b.Fatal(err) + } + + conn, err := dbr.Open("postgres", settings.String(), nil) + if err != nil { + b.Fatal(err) + } + + sess := conn.NewSession(nil) + + defer sess.Close() + + var res *sql.Rows + + b.ResetTimer() + for i := 0; i < b.N; i++ { + if res, err = sess.Query(`SELECT * FROM "artist" WHERE "name" = $1`, artistN(i)); err != nil { + b.Fatal(err) + } + res.Close() + } +} + // BenchmarkSQLPreparedSelect benchmarks SQL select queries using prepared // statements. func BenchmarkSQLPreparedSelect(b *testing.B) { @@ -460,6 +627,36 @@ func BenchmarkSQLPreparedSelect(b *testing.B) { } } +func BenchmarkDBRPreparedSelect(b *testing.B) { + var err error + + if err := tearUp(); err != nil { + b.Fatal(err) + } + + conn, err := dbr.Open("postgres", settings.String(), nil) + if err != nil { + b.Fatal(err) + } + + sess := conn.NewSession(nil) + + stmt, err := sess.Prepare(`SELECT * FROM "artist" WHERE "name" = $1`) + if err != nil { + b.Fatal(err) + } + + var res *sql.Rows + + b.ResetTimer() + for i := 0; i < b.N; i++ { + if res, err = stmt.Query(artistN(i)); err != nil { + b.Fatal(err) + } + res.Close() + } +} + // BenchmarkUpperFind benchmarks upper.io/db.v2's One method. func BenchmarkUpperFind(b *testing.B) { var err error -- GitLab