Add gorm to benchmarks

pull/13/head
Vinícius Garcia 2021-11-14 01:10:57 -03:00
parent e2899617f4
commit 23692d13d4
3 changed files with 131 additions and 44 deletions

View File

@ -11,6 +11,8 @@ import (
_ "github.com/lib/pq"
"github.com/vingarcia/ksql"
"github.com/vingarcia/ksql/kpgx"
"gorm.io/driver/postgres"
"gorm.io/gorm"
)
var UsersTable = ksql.NewTable("users")
@ -21,13 +23,6 @@ func BenchmarkInsert(b *testing.B) {
driver := "postgres"
connStr := "host=localhost port=5432 user=postgres password=postgres dbname=ksql sslmode=disable"
ksqlDB, err := ksql.New(driver, connStr, ksql.Config{
MaxOpenConns: 1,
})
if err != nil {
b.FailNow()
}
type User struct {
ID int `ksql:"id" db:"id"`
Name string `ksql:"name" db:"name"`
@ -35,7 +30,14 @@ func BenchmarkInsert(b *testing.B) {
}
b.Run("ksql-setup", func(b *testing.B) {
err := recreateTable(connStr)
ksqlDB, err := ksql.New(driver, connStr, ksql.Config{
MaxOpenConns: 1,
})
if err != nil {
b.Fatalf("error creating ksql client: %s", err)
}
err = recreateTable(connStr)
if err != nil {
b.Fatalf("error creating table: %s", err.Error())
}
@ -53,22 +55,22 @@ func BenchmarkInsert(b *testing.B) {
})
})
pgxDB, err := kpgx.New(ctx, connStr, ksql.Config{
MaxOpenConns: 1,
})
if err != nil {
b.Fatalf("error creating pgx client: %s", err)
}
b.Run("kpgx-adapter-setup", func(b *testing.B) {
kpgxDB, err := kpgx.New(ctx, connStr, ksql.Config{
MaxOpenConns: 1,
})
if err != nil {
b.Fatalf("error creating kpgx client: %s", err)
}
b.Run("pgx-adapter-setup", func(b *testing.B) {
err := recreateTable(connStr)
err = recreateTable(connStr)
if err != nil {
b.Fatalf("error creating table: %s", err.Error())
}
b.Run("insert-one", func(b *testing.B) {
for i := 0; i < b.N; i++ {
err := pgxDB.Insert(ctx, UsersTable, &User{
err := kpgxDB.Insert(ctx, UsersTable, &User{
Name: strconv.Itoa(i),
Age: i,
})
@ -79,11 +81,14 @@ func BenchmarkInsert(b *testing.B) {
})
})
sqlxDB, err := sqlx.Open(driver, connStr)
sqlxDB.SetMaxOpenConns(1)
b.Run("sqlx-setup", func(b *testing.B) {
err := recreateTable(connStr)
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())
}
@ -110,6 +115,30 @@ func BenchmarkInsert(b *testing.B) {
}
})
})
b.Run("gorm-adapter-setup", func(b *testing.B) {
gormDB, err := gorm.Open(postgres.Open(connStr), &gorm.Config{})
if err != nil {
b.Fatalf("error creating gorm client: %s", err)
}
err = recreateTable(connStr)
if err != nil {
b.Fatalf("error creating table: %s", err)
}
b.Run("insert-one", func(b *testing.B) {
for i := 0; i < b.N; i++ {
err := gormDB.Table("users").Create(&User{
Name: strconv.Itoa(i),
Age: i,
}).Error
if err != nil {
b.Fatalf("insert error: %s", err)
}
}
})
})
}
func BenchmarkQuery(b *testing.B) {
@ -118,13 +147,6 @@ func BenchmarkQuery(b *testing.B) {
driver := "postgres"
connStr := "host=localhost port=5432 user=postgres password=postgres dbname=ksql sslmode=disable"
ksqlDB, err := ksql.New(driver, connStr, ksql.Config{
MaxOpenConns: 1,
})
if err != nil {
b.FailNow()
}
type User struct {
ID int `ksql:"id" db:"id"`
Name string `ksql:"name" db:"name"`
@ -132,7 +154,14 @@ func BenchmarkQuery(b *testing.B) {
}
b.Run("ksql-setup", func(b *testing.B) {
err := recreateTable(connStr)
ksqlDB, err := ksql.New(driver, connStr, ksql.Config{
MaxOpenConns: 1,
})
if err != nil {
b.Fatalf("error creating ksql client: %s", err)
}
err = recreateTable(connStr)
if err != nil {
b.Fatalf("error creating table: %s", err.Error())
}
@ -166,15 +195,15 @@ func BenchmarkQuery(b *testing.B) {
})
})
pgxDB, err := ksql.NewWithPGX(ctx, connStr, ksql.Config{
MaxOpenConns: 1,
})
if err != nil {
b.Fatalf("error creating pgx client: %s", err)
}
b.Run("kpgx-adapter-setup", func(b *testing.B) {
kpgxDB, err := kpgx.New(ctx, connStr, ksql.Config{
MaxOpenConns: 1,
})
if err != nil {
b.Fatalf("error creating kpgx client: %s", err)
}
b.Run("pgx-adapter-setup", func(b *testing.B) {
err := recreateTable(connStr)
err = recreateTable(connStr)
if err != nil {
b.Fatalf("error creating table: %s", err.Error())
}
@ -187,7 +216,7 @@ func BenchmarkQuery(b *testing.B) {
b.Run("single-row", func(b *testing.B) {
for i := 0; i < b.N; i++ {
var user User
err := pgxDB.QueryOne(ctx, &user, `SELECT * FROM users OFFSET $1 LIMIT 1`, i%100)
err := kpgxDB.QueryOne(ctx, &user, `SELECT * FROM users OFFSET $1 LIMIT 1`, i%100)
if err != nil {
b.Fatalf("query error: %s", err.Error())
}
@ -197,7 +226,7 @@ func BenchmarkQuery(b *testing.B) {
b.Run("multiple-rows", func(b *testing.B) {
for i := 0; i < b.N; i++ {
var users []User
err := pgxDB.Query(ctx, &users, `SELECT * FROM users OFFSET $1 LIMIT 10`, i%90)
err := kpgxDB.Query(ctx, &users, `SELECT * FROM users OFFSET $1 LIMIT 10`, i%90)
if err != nil {
b.Fatalf("query error: %s", err.Error())
}
@ -208,11 +237,14 @@ func BenchmarkQuery(b *testing.B) {
})
})
sqlxDB, err := sqlx.Open(driver, connStr)
sqlxDB.SetMaxOpenConns(1)
b.Run("sqlx-setup", func(b *testing.B) {
err := recreateTable(connStr)
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())
}
@ -249,7 +281,7 @@ func BenchmarkQuery(b *testing.B) {
}
for j := 0; j < 10; j++ {
if !rows.Next() {
b.Fatalf("missing user from inserted record, offset: %d", i%100)
b.Fatalf("missing user from inserted record, offset: %d", i%90)
}
var user User
rows.StructScan(&user)
@ -266,6 +298,46 @@ func BenchmarkQuery(b *testing.B) {
}
})
})
b.Run("gorm-setup", func(b *testing.B) {
gormDB, err := gorm.Open(postgres.Open(connStr), &gorm.Config{})
if err != nil {
b.Fatalf("error creating gorm client: %s", err)
}
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())
}
b.Run("single-row", func(b *testing.B) {
for i := 0; i < b.N; i++ {
var user User
err := gormDB.Table("users").Offset(i % 100).Take(&user).Error
if err != nil {
b.Fatalf("query error: %s", err)
}
}
})
b.Run("multiple-rows", func(b *testing.B) {
for i := 0; i < b.N; i++ {
var users []User
err := gormDB.Table("users").Offset(i % 90).Limit(10).Find(&users).Error
if err != nil {
b.Fatalf("query error: %s", err.Error())
}
if len(users) < 10 {
b.Fatalf("expected 10 scanned users, but got: %d", len(users))
}
}
})
})
}
func recreateTable(connStr string) error {

View File

@ -6,6 +6,8 @@ require (
github.com/jmoiron/sqlx v1.3.4
github.com/lib/pq v1.10.4
github.com/vingarcia/ksql v1.1.0
gorm.io/driver/postgres v1.2.2 // indirect
gorm.io/gorm v1.22.3 // indirect
)
replace github.com/vingarcia/ksql => ../

View File

@ -74,6 +74,10 @@ github.com/jackc/puddle v0.0.0-20190413234325-e4ced69a3a2b/go.mod h1:m4B5Dj62Y0f
github.com/jackc/puddle v0.0.0-20190608224051-11cab39313c9/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk=
github.com/jackc/puddle v1.1.3 h1:JnPg/5Q9xVJGfjsO5CPUOjnJps1JaRUm8I9FXVCFK94=
github.com/jackc/puddle v1.1.3/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk=
github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=
github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=
github.com/jinzhu/now v1.1.2 h1:eVKgfIdy9b6zbWBMgFpfDPoAMifwSZagU9HmEU6zgiI=
github.com/jinzhu/now v1.1.2/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=
github.com/jmoiron/sqlx v1.2.0/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks=
github.com/jmoiron/sqlx v1.3.4 h1:wv+0IJZfL5z0uZoUjlpKgHkgaFSYD+r9CfrXjEXsO7w=
github.com/jmoiron/sqlx v1.3.4/go.mod h1:2BljVx/86SuTyjE+aPYlHCTNvZrnJXghYGpNiXLBMCQ=
@ -149,6 +153,8 @@ golang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c/go.mod h1:jdWPYTVW3xRLrWP
golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97 h1:/UOmuWzQfxxo9UtlXMwuQU8CMgg1eZXqTRwkSQJWKOI=
golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519 h1:7I4JAnoQBe7ZtJcBaYHi5UtiO8tQHbUSXxL+pnGRANg=
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
@ -180,6 +186,8 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M=
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk=
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
golang.org/x/tools v0.0.0-20190425163242-31fd60d6bfdc/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
@ -203,4 +211,9 @@ gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.0-20200605160147-a5ece683394c h1:grhR+C34yXImVGp7EzNk+DTIk+323eIUWOmEevy6bDo=
gopkg.in/yaml.v3 v3.0.0-20200605160147-a5ece683394c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gorm.io/driver/postgres v1.2.2 h1:Ka9W6feOU+rPM9m007eYLMD4QoZuYGBnQ3Jp0faGSwg=
gorm.io/driver/postgres v1.2.2/go.mod h1:Ik3tK+a3FMp8ORZl29v4b3M0RsgXsaeMXh9s9eVMXco=
gorm.io/gorm v1.22.2/go.mod h1:F+OptMscr0P2F2qU97WT1WimdH9GaQPoDW7AYd5i2Y0=
gorm.io/gorm v1.22.3 h1:/JS6z+GStEQvJNW3t1FTwJwG/gZ+A7crFdRqtvG5ehA=
gorm.io/gorm v1.22.3/go.mod h1:F+OptMscr0P2F2qU97WT1WimdH9GaQPoDW7AYd5i2Y0=
honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=