qb: benchmark
This commit is contained in:
239
benchmark_test.go
Normal file
239
benchmark_test.go
Normal file
@@ -0,0 +1,239 @@
|
||||
// +build integration
|
||||
|
||||
package gocqlx_test
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"os"
|
||||
"testing"
|
||||
|
||||
"github.com/gocql/gocql"
|
||||
"github.com/scylladb/gocqlx"
|
||||
"github.com/scylladb/gocqlx/qb"
|
||||
)
|
||||
|
||||
type benchPerson struct {
|
||||
ID int `json:"id"`
|
||||
FirstName string `json:"first_name"`
|
||||
LastName string `json:"last_name"`
|
||||
Email []string `json:"email"`
|
||||
Gender string `json:"gender"`
|
||||
IPAddress string `json:"ip_address"`
|
||||
}
|
||||
|
||||
var benchPersonSchema = `
|
||||
CREATE TABLE IF NOT EXISTS gocqlx_test.bench_person (
|
||||
id int,
|
||||
first_name text,
|
||||
last_name text,
|
||||
email list<text>,
|
||||
gender text,
|
||||
ip_address text,
|
||||
PRIMARY KEY(id)
|
||||
)`
|
||||
|
||||
var benchPersonCols = []string{"id", "first_name", "last_name", "email", "gender", "ip_address"}
|
||||
|
||||
func loadFixtures() []*benchPerson {
|
||||
f, err := os.Open("test-fixtures/people.json")
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
defer func() {
|
||||
if err := f.Close(); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
}()
|
||||
|
||||
var v []*benchPerson
|
||||
if err := json.NewDecoder(f).Decode(&v); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
return v
|
||||
}
|
||||
|
||||
//
|
||||
// Insert
|
||||
//
|
||||
|
||||
// BenchmarkE2EGocqlInsert performs standard insert.
|
||||
func BenchmarkE2EGocqlInsert(b *testing.B) {
|
||||
people := loadFixtures()
|
||||
session := createSession(b)
|
||||
defer session.Close()
|
||||
|
||||
if err := createTable(session, benchPersonSchema); err != nil {
|
||||
b.Fatal(err)
|
||||
}
|
||||
|
||||
stmt, _ := qb.Insert("gocqlx_test.bench_person").Columns(benchPersonCols...).ToCql()
|
||||
q := session.Query(stmt)
|
||||
defer q.Release()
|
||||
|
||||
b.ResetTimer()
|
||||
for i := 0; i < b.N; i++ {
|
||||
// prepare
|
||||
p := people[i%len(people)]
|
||||
if err := q.Bind(p.ID, p.FirstName, p.LastName, p.Email, p.Gender, p.IPAddress).Exec(); err != nil {
|
||||
b.Fatal(err)
|
||||
}
|
||||
// insert
|
||||
if err := q.Exec(); err != nil {
|
||||
b.Fatal(err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// BenchmarkE2EGocqlInsert performs insert with struct binding.
|
||||
func BenchmarkE2EGocqlxInsert(b *testing.B) {
|
||||
people := loadFixtures()
|
||||
session := createSession(b)
|
||||
defer session.Close()
|
||||
|
||||
if err := createTable(session, benchPersonSchema); err != nil {
|
||||
b.Fatal(err)
|
||||
}
|
||||
|
||||
stmt, names := qb.Insert("gocqlx_test.bench_person").Columns(benchPersonCols...).ToCql()
|
||||
q := gocqlx.Query(session.Query(stmt), names)
|
||||
defer q.Release()
|
||||
|
||||
b.ResetTimer()
|
||||
|
||||
for i := 0; i < b.N; i++ {
|
||||
// prepare
|
||||
p := people[i%len(people)]
|
||||
if err := q.BindStruct(p); err != nil {
|
||||
b.Fatal("bind:", err)
|
||||
}
|
||||
// insert
|
||||
if err := q.Exec(); err != nil {
|
||||
b.Fatal(err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Get
|
||||
//
|
||||
|
||||
// BenchmarkE2EGocqlGet performs standard scan.
|
||||
func BenchmarkE2EGocqlGet(b *testing.B) {
|
||||
people := loadFixtures()
|
||||
session := createSession(b)
|
||||
defer session.Close()
|
||||
|
||||
initTable(b, session, people)
|
||||
|
||||
stmt, _ := qb.Select("gocqlx_test.bench_person").Columns(benchPersonCols...).Where(qb.Eq("id")).Limit(1).ToCql()
|
||||
var p benchPerson
|
||||
|
||||
b.ResetTimer()
|
||||
for i := 0; i < b.N; i++ {
|
||||
// prepare
|
||||
q := session.Query(stmt)
|
||||
q.Bind(people[i%len(people)].ID)
|
||||
// scan
|
||||
if err := q.Scan(&p.ID, &p.FirstName, &p.LastName, &p.Email, &p.Gender, &p.IPAddress); err != nil {
|
||||
b.Fatal(err)
|
||||
}
|
||||
// release
|
||||
q.Release()
|
||||
}
|
||||
}
|
||||
|
||||
// BenchmarkE2EGocqlxGet performs get.
|
||||
func BenchmarkE2EGocqlxGet(b *testing.B) {
|
||||
people := loadFixtures()
|
||||
session := createSession(b)
|
||||
defer session.Close()
|
||||
|
||||
initTable(b, session, people)
|
||||
|
||||
stmt, _ := qb.Select("gocqlx_test.bench_person").Columns(benchPersonCols...).Where(qb.Eq("id")).Limit(1).ToCql()
|
||||
var p benchPerson
|
||||
|
||||
b.ResetTimer()
|
||||
for i := 0; i < b.N; i++ {
|
||||
// prepare
|
||||
q := session.Query(stmt)
|
||||
q.Bind(people[i%len(people)].ID)
|
||||
// get
|
||||
gocqlx.Get(&p, q)
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Select
|
||||
//
|
||||
|
||||
// BenchmarkE2EGocqlSelect performs standard loop scan.
|
||||
func BenchmarkE2EGocqlSelect(b *testing.B) {
|
||||
people := loadFixtures()
|
||||
session := createSession(b)
|
||||
defer session.Close()
|
||||
|
||||
initTable(b, session, people)
|
||||
|
||||
stmt, _ := qb.Select("gocqlx_test.bench_person").Columns(benchPersonCols...).Limit(100).ToCql()
|
||||
|
||||
b.ResetTimer()
|
||||
for i := 0; i < b.N; i++ {
|
||||
// prepare
|
||||
v := make([]*benchPerson, 100)
|
||||
q := session.Query(stmt)
|
||||
i := q.Iter()
|
||||
// loop scan
|
||||
p := new(benchPerson)
|
||||
for i.Scan(&p.ID, &p.FirstName, &p.LastName, &p.Email, &p.Gender, &p.IPAddress) {
|
||||
v = append(v, p)
|
||||
p = new(benchPerson)
|
||||
}
|
||||
if err := i.Close(); err != nil {
|
||||
b.Fatal(err)
|
||||
}
|
||||
// release
|
||||
q.Release()
|
||||
}
|
||||
}
|
||||
|
||||
// BenchmarkE2EGocqlSelect performs select.
|
||||
func BenchmarkE2EGocqlxSelect(b *testing.B) {
|
||||
people := loadFixtures()
|
||||
session := createSession(b)
|
||||
defer session.Close()
|
||||
|
||||
initTable(b, session, people)
|
||||
|
||||
stmt, _ := qb.Select("gocqlx_test.bench_person").Columns(benchPersonCols...).Limit(100).ToCql()
|
||||
|
||||
b.ResetTimer()
|
||||
for i := 0; i < b.N; i++ {
|
||||
// prepare
|
||||
q := session.Query(stmt)
|
||||
var v []*benchPerson
|
||||
// select
|
||||
if err := gocqlx.Select(&v, q); err != nil {
|
||||
b.Fatal(err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func initTable(b *testing.B, session *gocql.Session, people []*benchPerson) {
|
||||
if err := createTable(session, benchPersonSchema); err != nil {
|
||||
b.Fatal(err)
|
||||
}
|
||||
|
||||
stmt, names := qb.Insert("gocqlx_test.bench_person").Columns(benchPersonCols...).ToCql()
|
||||
q := gocqlx.Query(session.Query(stmt), names)
|
||||
|
||||
for _, p := range people {
|
||||
if err := q.BindStruct(p); err != nil {
|
||||
b.Fatal(err)
|
||||
}
|
||||
if err := q.Exec(); err != nil {
|
||||
b.Fatal(err)
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user