Skip to content

Benchmarks #83

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 21 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
69 changes: 66 additions & 3 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -44,9 +44,9 @@ test-sqlite: install
cd internal/integration && queryx db:migrate --schema sqlite.hcl
cd internal/integration && queryx db:migrate --schema sqlite.hcl
cd internal/integration && queryx generate --schema sqlite.hcl
cd internal/integration && yarn tsc
cd internal/integration && yarn test
# cd internal/integration && go test ./...
# cd internal/integration && yarn tsc
# cd internal/integration && yarn test
cd internal/integration && go test ./...

test: test-postgresql test-sqlite test-mysql

Expand All @@ -56,3 +56,66 @@ test-migrate: install
sleep 1
cd internal/migrate && queryx db:migrate --schema sqlite2.hcl
cd internal/migrate && sqlite3 test.sqlite3 "insert into users(name, email) values('test', '[email protected]')"


benchmarks-golang-postgresql: install
cd internal/benchmarks/go-queryx && rm -rf db
cd internal/benchmarks/go-queryx && queryx db:drop --schema postgresql.hcl
cd internal/benchmarks/go-queryx && queryx db:create --schema postgresql.hcl
cd internal/benchmarks/go-queryx && queryx db:migrate --schema postgresql.hcl
cd internal/benchmarks/go-queryx && queryx g --schema postgresql.hcl
cd internal/benchmarks && go build -o bin/queryxorm main.go
cd internal/benchmarks && install bin/queryxorm /usr/local/bin
queryxorm -adapter=postgresql

benchmarks-golang-mysql: install
cd internal/benchmarks/go-queryx && rm -rf db
cd internal/benchmarks/go-queryx && queryx db:drop --schema mysql.hcl
cd internal/benchmarks/go-queryx && queryx db:create --schema mysql.hcl
cd internal/benchmarks/go-queryx && queryx db:migrate --schema mysql.hcl
cd internal/benchmarks/go-queryx && queryx g --schema mysql.hcl
cd internal/benchmarks && go build -o bin/queryxorm main.go
cd internal/benchmarks && install bin/queryxorm /usr/local/bin
queryxorm -adapter=mysql

benchmarks-golang-sqlite: install
cd internal/benchmarks/go-queryx && rm -rf db
cd internal/benchmarks/go-queryx && queryx db:drop --schema sqlite.hcl
cd internal/benchmarks/go-queryx && queryx db:create --schema sqlite.hcl
cd internal/benchmarks/go-queryx && queryx db:migrate --schema sqlite.hcl
cd internal/benchmarks/go-queryx && queryx g --schema sqlite.hcl
cd internal/benchmarks && go build -o bin/queryxorm main.go
cd internal/benchmarks && install bin/queryxorm /usr/local/bin
queryxorm -adapter=sqlite

benchmarks-golang: install benchmarks-golang-mysql benchmarks-golang-sqlite benchmarks-golang-postgresql

benchmarks-typescript-postgresql: install
cd internal/benchmarks/ts-queryx && rm -rf db
cd internal/benchmarks/ts-queryx && queryx db:drop --schema postgresql.hcl
cd internal/benchmarks/ts-queryx && queryx db:create --schema postgresql.hcl
cd internal/benchmarks/ts-queryx && queryx db:migrate --schema postgresql.hcl
cd internal/benchmarks/ts-queryx && queryx g --schema postgresql.hcl
cd internal/benchmarks/ts-queryx && tsc benchmark.test.ts
cd internal/benchmarks/ts-queryx && node benchmark.test.js


benchmarks-typescript-mysql: install
cd internal/benchmarks/ts-queryx && rm -rf db
cd internal/benchmarks/ts-queryx && queryx db:drop --schema mysql.hcl
cd internal/benchmarks/ts-queryx && queryx db:create --schema mysql.hcl
cd internal/benchmarks/ts-queryx && queryx db:migrate --schema mysql.hcl
cd internal/benchmarks/ts-queryx && queryx g --schema mysql.hcl
cd internal/benchmarks/ts-queryx && yarn
cd internal/benchmarks/ts-queryx && tsc benchmark.test.ts
cd internal/benchmarks/ts-queryx && node benchmark.test.js


benchmarks-typescript-sqlite: install
cd internal/benchmarks/ts-queryx && rm -rf db
cd internal/benchmarks/ts-queryx && queryx db:drop --schema sqlite.hcl
cd internal/benchmarks/ts-queryx && queryx db:create --schema sqlite.hcl
cd internal/benchmarks/ts-queryx && queryx db:migrate --schema sqlite.hcl
cd internal/benchmarks/ts-queryx && queryx g --schema sqlite.hcl
cd internal/benchmarks/ts-queryx && tsc benchmark.test.ts
cd internal/benchmarks/ts-queryx && node benchmark.test.js
73 changes: 73 additions & 0 deletions benchmarks-results.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
# Results

- orm-benchmark
```
golang-mysql-Reports:
InsertAll
queryx: 24 68688983 ns/op 279390 B/op 3296 allocs/op

Create
queryx: 50 24818608 ns/op 16685 B/op 253 allocs/op

Update
queryx: 1215 968346 ns/op 7980 B/op 114 allocs/op

Read
queryx: 1201 976828 ns/op 9196 B/op 155 allocs/op

ReadSlice
queryx: 762 2458304 ns/op 386941 B/op 12405 allocs/op


golang-sqlite-Reports:
ReadSlice
queryx: 358 3447322 ns/op 398725 B/op 16991 allocs/op

InsertAll
queryx: 48 31670682 ns/op 246893 B/op 3898 allocs/op

Create
queryx: 72 18938976 ns/op 11278 B/op 238 allocs/op

Update
queryx: 499 3277440 ns/op 8052 B/op 127 allocs/op

Read
queryx: 903 1488458 ns/op 9252 B/op 208 allocs/op


golang-postgresql-Reports:
InsertAll
queryx: 134 8033703 ns/op 289751 B/op 3505 allocs/op

Create
queryx: 194 5316417 ns/op 10501 B/op 184 allocs/op

Update
queryx: 208 5298013 ns/op 7944 B/op 116 allocs/op

Read
queryx: 1186 1187729 ns/op 9278 B/op 157 allocs/op

ReadSlice
queryx: 1008 2237629 ns/op 348255 B/op 10661 allocs/op

typescript-mysql-Reports:
create: x 790 ops/sec ±191.34% (36 runs sampled)
insertAll: x 591 ops/sec ±60.50% (20 runs sampled)
find x 4,631 ops/sec ±24.66% (34 runs sampled)
update: x 760 ops/sec ±87.89% (10 runs sampled)

typescript-postgresql-Reports:
create: x 1,071 ops/sec ±86.40% (9 runs sampled)
insertAll: x 8,521 ops/sec ±21.30% (35 runs sampled)
find: x 4,269 ops/sec ±16.80% (52 runs sampled)
update: x 1,860 ops/sec ±46.43% (38 runs sampled)

typescript-sqlite-Reports:
create:x 25,930 ops/sec +18.77%(44 runs sampled)
insertAll:x14,361 ops/sec +66.85%(29 runs sampled)
find x 1.087 ops/sec +78.85%(13 runs sampled)
update:x 2,225 ops/sec +18.76%(36 runs sampled)

```
4 changes: 2 additions & 2 deletions generator/client/typescript/templates/queryx/adapter.mysql.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
// Code generated by queryx, DO NOT EDIT.

import mysql, { ResultSetHeader, RowDataPacket } from "mysql2/promise";
import mysql, { createPool, ResultSetHeader, RowDataPacket } from "mysql2/promise";
import { parse } from "date-fns";
import { Config } from "./config";

Expand All @@ -14,7 +14,7 @@ export class Adapter {
}

connect() {
const pool = mysql.createPool({
const pool = createPool({
uri: this.config.url,
});
this.pool = pool;
Expand Down
62 changes: 62 additions & 0 deletions internal/benchmarks/go-queryx/helper/sql.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
package helper

import (
"fmt"
"github.com/swiftcarrot/queryx/internal/benchmarks/go-queryx/db"
"log"
)

const (
sqlSqliteCreateTable = `CREATE TABLE models (
id integer NOT NULL PRIMARY KEY AUTOINCREMENT,
name varchar NULL,
title varchar NULL,
fax varchar NULL,
web varchar NULL,
age bigint NULL,
righ boolean NULL,
counter integer NULL
);`
sqlPostgresCreateTable = `CREATE TABLE "public"."models" (
"id" bigserial NOT NULL,
"name" character varying NULL,
"title" character varying NULL,
"fax" character varying NULL,
"web" character varying NULL,
"age" bigint NULL,
"righ" boolean NULL,
"counter" integer NULL,
PRIMARY KEY ("id"));`
sqlMysqlCreateTable = `CREATE TABLE test.models (
id bigint NOT NULL AUTO_INCREMENT,
name varchar(255) NULL, title varchar(255) NULL,
fax varchar(255) NULL, web varchar(255) NULL,
age bigint NULL,
righ bool NULL,
counter int NULL,
PRIMARY KEY (id));`
)

func CreateTables(client *db.QXClient, adapter string) error {
var sql string
switch adapter {
case "mysql":
sql = sqlMysqlCreateTable
case "postgresql":
sql = sqlPostgresCreateTable
case "sqlite":
sql = sqlSqliteCreateTable
default:
return fmt.Errorf("this type of adapter is not supported:%v", adapter)
}
_, err := client.Exec(`DROP TABLE IF EXISTS models;`)
if err != nil {
return err
}
_, err = client.Exec(sql)
if err != nil {
log.Fatal(err)
return err
}
return err
}
81 changes: 81 additions & 0 deletions internal/benchmarks/go-queryx/helper/suite.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
package helper

import (
"github.com/swiftcarrot/queryx/internal/benchmarks/go-queryx/db"
"testing"
)

type ORMInterface interface {
Name() string
Init() (*db.QXClient, error)
Create(b *testing.B)
InsertAll(b *testing.B)
Update(b *testing.B)
Read(b *testing.B)
ReadSlice(b *testing.B)
}

type BenchmarkResult struct {
ORM string
Results []Result
}

type Result struct {
Name string
Method string
ErrorMsg string

N int
NsPerOp int64
MemAllocs int64
MemBytes int64
}

type BenchmarkReport []*Result

func (s BenchmarkReport) Len() int { return len(s) }

func (s BenchmarkReport) Swap(i, j int) { s[i], s[j] = s[j], s[i] }

func (s BenchmarkReport) Less(i, j int) bool {
if s[i].ErrorMsg != "" {
return false
}
if s[j].ErrorMsg != "" {
return true
}
return s[i].NsPerOp < s[j].NsPerOp
}

func RunBenchmarks(adapter string, orm ORMInterface, reports map[string]BenchmarkReport) error {
c, err := orm.Init()
if err != nil {
return err
}

operations := []func(b *testing.B){orm.InsertAll, orm.Create, orm.Update, orm.Read, orm.ReadSlice}

for _, operation := range operations {
err = CreateTables(c, adapter)
if err != nil {
return err
}

br := testing.Benchmark(operation)
method := getFuncName(operation)

gotResult := &Result{
Name: orm.Name(),
Method: method,
ErrorMsg: GetError(orm.Name(), method),
N: br.N,
NsPerOp: br.NsPerOp(),
MemAllocs: br.AllocsPerOp(),
MemBytes: br.AllocedBytesPerOp(),
}

reports[method] = append(reports[method], gotResult)
}

return nil
}
33 changes: 33 additions & 0 deletions internal/benchmarks/go-queryx/helper/tools.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package helper

import (
"reflect"
"runtime"
"strings"
"sync"
"testing"
)

var Errors map[string]map[string]string

var mu sync.Mutex

func SetError(b *testing.B, orm, method, err string) {
b.Helper()

mu.Lock()
Errors[orm][method] = err
mu.Unlock()
b.Fail()
}

func GetError(orm, method string) string {
return Errors[orm][method]
}

func getFuncName(function interface{}) string {
name := strings.Split(runtime.FuncForPC(reflect.ValueOf(function).Pointer()).Name(), ".")
straightName := strings.Split(name[len(name)-1], "-")[0]

return straightName
}
26 changes: 26 additions & 0 deletions internal/benchmarks/go-queryx/models.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package go_queryx

// Model for go-queryx
type Model struct {
ID int `column:"id"`
Name string `column:"name"`
Title string `column:"title"`
Fax string `column:"fax"`
Web string `column:"web"`
Age int64 `column:"age"`
Righ bool `column:"righ"`
Counter int32 `column:"counter"`
}

func NewModel() *Model {
m := new(Model)
m.Name = "Orm Benchmark"
m.Title = "Just a Benchmark for fun"
m.Fax = "99909990"
m.Web = "http://blog.milkpod29.me"
m.Age = 100
m.Righ = true
m.Counter = 1000

return m
}
Loading
Loading