mirror of https://github.com/VinGarcia/ksql.git
Add sqlx/prep-stmt benchmark
parent
fc2b32d919
commit
60233e04a8
69
README.md
69
README.md
|
@ -370,40 +370,43 @@ goos: linux
|
||||||
goarch: amd64
|
goarch: amd64
|
||||||
pkg: github.com/vingarcia/ksql/benchmarks
|
pkg: github.com/vingarcia/ksql/benchmarks
|
||||||
cpu: Intel(R) Core(TM) i7-10750H CPU @ 2.60GHz
|
cpu: Intel(R) Core(TM) i7-10750H CPU @ 2.60GHz
|
||||||
BenchmarkInsert/ksql/sql-adapter/insert-one-12 9513 625637 ns/op
|
BenchmarkInsert/ksql/sql-adapter/insert-one-12 9358 630699 ns/op
|
||||||
BenchmarkInsert/ksql/pgx-adapter/insert-one-12 10000 541374 ns/op
|
BenchmarkInsert/ksql/pgx-adapter/insert-one-12 10000 548489 ns/op
|
||||||
BenchmarkInsert/sql/insert-one-12 9369 618969 ns/op
|
BenchmarkInsert/sql/insert-one-12 9601 631485 ns/op
|
||||||
BenchmarkInsert/sql/prep-stmt/insert-one-12 10000 551131 ns/op
|
BenchmarkInsert/sql/prep-stmt/insert-one-12 10000 558009 ns/op
|
||||||
BenchmarkInsert/sqlx/insert-one-12 9328 629889 ns/op
|
BenchmarkInsert/sqlx/insert-one-12 9688 637395 ns/op
|
||||||
BenchmarkInsert/pgxpool/insert-one-12 10000 542283 ns/op
|
BenchmarkInsert/sqlx/prep-stmt/insert-one-12 10000 555805 ns/op
|
||||||
BenchmarkInsert/gorm/insert-one-12 8716 675421 ns/op
|
BenchmarkInsert/pgxpool/insert-one-12 10000 558187 ns/op
|
||||||
BenchmarkInsert/sqlc/insert-one-12 9446 629378 ns/op
|
BenchmarkInsert/gorm/insert-one-12 8671 690290 ns/op
|
||||||
BenchmarkInsert/sqlc/prep-stmt/insert-one-12 10000 553632 ns/op
|
BenchmarkInsert/sqlc/insert-one-12 9710 636395 ns/op
|
||||||
BenchmarkInsert/sqlboiler/insert-one-12 9595 633391 ns/op
|
BenchmarkInsert/sqlc/prep-stmt/insert-one-12 10000 572243 ns/op
|
||||||
BenchmarkQuery/ksql/sql-adapter/single-row-12 40746 146739 ns/op
|
BenchmarkInsert/sqlboiler/insert-one-12 9693 645475 ns/op
|
||||||
BenchmarkQuery/ksql/sql-adapter/multiple-rows-12 37886 156191 ns/op
|
BenchmarkQuery/ksql/sql-adapter/single-row-12 42440 139913 ns/op
|
||||||
BenchmarkQuery/ksql/pgx-adapter/single-row-12 79155 71939 ns/op
|
BenchmarkQuery/ksql/sql-adapter/multiple-rows-12 39391 152663 ns/op
|
||||||
BenchmarkQuery/ksql/pgx-adapter/multiple-rows-12 73729 83560 ns/op
|
BenchmarkQuery/ksql/pgx-adapter/single-row-12 81457 70102 ns/op
|
||||||
BenchmarkQuery/sql/single-row-12 42253 143241 ns/op
|
BenchmarkQuery/ksql/pgx-adapter/multiple-rows-12 74710 81578 ns/op
|
||||||
BenchmarkQuery/sql/multiple-rows-12 40456 149423 ns/op
|
BenchmarkQuery/sql/single-row-12 43040 139945 ns/op
|
||||||
BenchmarkQuery/sql/prep-stmt/single-row-12 83389 72348 ns/op
|
BenchmarkQuery/sql/multiple-rows-12 41533 143923 ns/op
|
||||||
BenchmarkQuery/sql/prep-stmt/multiple-rows-12 77712 76644 ns/op
|
BenchmarkQuery/sql/prep-stmt/single-row-12 89296 69676 ns/op
|
||||||
BenchmarkQuery/sqlx/single-row-12 41792 145506 ns/op
|
BenchmarkQuery/sql/prep-stmt/multiple-rows-12 78828 75760 ns/op
|
||||||
BenchmarkQuery/sqlx/multiple-rows-12 39500 151435 ns/op
|
BenchmarkQuery/sqlx/single-row-12 41727 141424 ns/op
|
||||||
BenchmarkQuery/pgxpool/single-row-12 85870 69418 ns/op
|
BenchmarkQuery/sqlx/multiple-rows-12 41360 148159 ns/op
|
||||||
BenchmarkQuery/pgxpool/multiple-rows-12 79922 73978 ns/op
|
BenchmarkQuery/sqlx/prep-stmt/single-row-12 81553 68347 ns/op
|
||||||
BenchmarkQuery/gorm/single-row-12 77432 78407 ns/op
|
BenchmarkQuery/sqlx/prep-stmt/multiple-rows-12 77161 77070 ns/op
|
||||||
BenchmarkQuery/gorm/multiple-rows-12 61074 96030 ns/op
|
BenchmarkQuery/pgxpool/single-row-12 85140 68628 ns/op
|
||||||
BenchmarkQuery/sqlc/single-row-12 42672 145121 ns/op
|
BenchmarkQuery/pgxpool/multiple-rows-12 76016 73659 ns/op
|
||||||
BenchmarkQuery/sqlc/multiple-rows-12 40122 149068 ns/op
|
BenchmarkQuery/gorm/single-row-12 79791 74779 ns/op
|
||||||
BenchmarkQuery/sqlc/prep-stmt/single-row-12 81829 73210 ns/op
|
BenchmarkQuery/gorm/multiple-rows-12 63621 94351 ns/op
|
||||||
BenchmarkQuery/sqlc/prep-stmt/multiple-rows-12 74799 78834 ns/op
|
BenchmarkQuery/sqlc/single-row-12 41904 142480 ns/op
|
||||||
BenchmarkQuery/sqlboiler/single-row-12 64158 93305 ns/op
|
BenchmarkQuery/sqlc/multiple-rows-12 39877 147798 ns/op
|
||||||
BenchmarkQuery/sqlboiler/multiple-rows-12 64686 92270 ns/op
|
BenchmarkQuery/sqlc/prep-stmt/single-row-12 84484 68351 ns/op
|
||||||
|
BenchmarkQuery/sqlc/prep-stmt/multiple-rows-12 81837 76040 ns/op
|
||||||
|
BenchmarkQuery/sqlboiler/single-row-12 67383 90907 ns/op
|
||||||
|
BenchmarkQuery/sqlboiler/multiple-rows-12 64791 91555 ns/op
|
||||||
PASS
|
PASS
|
||||||
ok github.com/vingarcia/ksql/benchmarks 200.547s
|
ok github.com/vingarcia/ksql/benchmarks 228.871s
|
||||||
Benchmark executed at: 2022-07-26
|
Benchmark executed at: 2022-09-29
|
||||||
Benchmark executed on commit: 3d34bae47e90ff84d87ba47a2fad81d21390c5ec
|
Benchmark executed on commit: fc2b32d91965404c2479aa3d1be904b5a4c217f4
|
||||||
```
|
```
|
||||||
|
|
||||||
## Running the KSQL tests (for contributors)
|
## Running the KSQL tests (for contributors)
|
||||||
|
|
|
@ -213,6 +213,48 @@ func BenchmarkInsert(b *testing.B) {
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
b.Run("sqlx/prep-stmt", func(b *testing.B) {
|
||||||
|
sqlxDB, err := sqlx.Open(driver, connStr)
|
||||||
|
if err != nil {
|
||||||
|
b.Fatalf("error creating sqlx client: %s", err)
|
||||||
|
}
|
||||||
|
sqlxDB.SetMaxOpenConns(1)
|
||||||
|
|
||||||
|
err = recreateTable(connStr)
|
||||||
|
if err != nil {
|
||||||
|
b.Fatalf("error creating table: %s", err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
insertOne, err := sqlxDB.Prepare(`INSERT INTO users(name, age) VALUES ($1, $2) RETURNING id`)
|
||||||
|
if err != nil {
|
||||||
|
b.Fatalf("could not prepare sql insert query: %s", err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
b.Run("insert-one", func(b *testing.B) {
|
||||||
|
for i := 0; i < b.N; i++ {
|
||||||
|
user := User{
|
||||||
|
Name: strconv.Itoa(i),
|
||||||
|
Age: i,
|
||||||
|
}
|
||||||
|
rows, err := insertOne.QueryContext(ctx, user.Name, user.Age)
|
||||||
|
if err != nil {
|
||||||
|
b.Fatalf("insert error: %s", err.Error())
|
||||||
|
}
|
||||||
|
if !rows.Next() {
|
||||||
|
b.Fatalf("missing id from inserted record")
|
||||||
|
}
|
||||||
|
err = rows.Scan(&user.ID)
|
||||||
|
if err != nil {
|
||||||
|
b.Fatalf("error scanning rows")
|
||||||
|
}
|
||||||
|
err = rows.Close()
|
||||||
|
if err != nil {
|
||||||
|
b.Fatalf("error closing rows")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
b.Run("pgxpool", func(b *testing.B) {
|
b.Run("pgxpool", func(b *testing.B) {
|
||||||
pgxConf, err := pgxpool.ParseConfig(connStr)
|
pgxConf, err := pgxpool.ParseConfig(connStr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -678,6 +720,84 @@ func BenchmarkQuery(b *testing.B) {
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
b.Run("sqlx/prep-stmt", func(b *testing.B) {
|
||||||
|
sqlxDB, err := sqlx.Open(driver, connStr)
|
||||||
|
if err != nil {
|
||||||
|
b.Fatalf("error creating sqlx client: %s", err)
|
||||||
|
}
|
||||||
|
sqlxDB.SetMaxOpenConns(1)
|
||||||
|
|
||||||
|
err = recreateTable(connStr)
|
||||||
|
if err != nil {
|
||||||
|
b.Fatalf("error creating table: %s", err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
err = insertUsers(connStr, 100)
|
||||||
|
if err != nil {
|
||||||
|
b.Fatalf("error inserting users: %s", err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
singleRow, err := sqlxDB.Preparex(`SELECT id, name, age FROM users OFFSET $1 LIMIT 1`)
|
||||||
|
if err != nil {
|
||||||
|
b.Fatalf("error preparing sql statement for single row: %s", err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
multipleRows, err := sqlxDB.Preparex(`SELECT id, name, age FROM users OFFSET $1 LIMIT 10`)
|
||||||
|
if err != nil {
|
||||||
|
b.Fatalf("error preparing sql statement for multiple rows: %s", err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
b.Run("single-row", func(b *testing.B) {
|
||||||
|
for i := 0; i < b.N; i++ {
|
||||||
|
var user User
|
||||||
|
rows, err := singleRow.QueryxContext(ctx, i%100)
|
||||||
|
if err != nil {
|
||||||
|
b.Fatalf("query error: %s", err.Error())
|
||||||
|
}
|
||||||
|
if !rows.Next() {
|
||||||
|
b.Fatalf("missing user from inserted record, offset: %d", i%100)
|
||||||
|
}
|
||||||
|
err = rows.StructScan(&user)
|
||||||
|
if err != nil {
|
||||||
|
b.Fatalf("error scanning rows")
|
||||||
|
}
|
||||||
|
err = rows.Close()
|
||||||
|
if err != nil {
|
||||||
|
b.Fatalf("error closing rows")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
b.Run("multiple-rows", func(b *testing.B) {
|
||||||
|
for i := 0; i < b.N; i++ {
|
||||||
|
var users []User
|
||||||
|
rows, err := multipleRows.QueryxContext(ctx, i%90)
|
||||||
|
if err != nil {
|
||||||
|
b.Fatalf("query error: %s", err.Error())
|
||||||
|
}
|
||||||
|
for j := 0; j < 10; j++ {
|
||||||
|
if !rows.Next() {
|
||||||
|
b.Fatalf("missing user from inserted record, offset: %d", i%90)
|
||||||
|
}
|
||||||
|
var user User
|
||||||
|
rows.StructScan(&user)
|
||||||
|
if err != nil {
|
||||||
|
b.Fatalf("error scanning rows")
|
||||||
|
}
|
||||||
|
users = append(users, user)
|
||||||
|
}
|
||||||
|
if len(users) < 10 {
|
||||||
|
b.Fatalf("expected 10 scanned users, but got: %d", len(users))
|
||||||
|
}
|
||||||
|
|
||||||
|
err = rows.Close()
|
||||||
|
if err != nil {
|
||||||
|
b.Fatalf("error closing rows")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
b.Run("pgxpool", func(b *testing.B) {
|
b.Run("pgxpool", func(b *testing.B) {
|
||||||
pgxConf, err := pgxpool.ParseConfig(connStr)
|
pgxConf, err := pgxpool.ParseConfig(connStr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
Loading…
Reference in New Issue