-
Notifications
You must be signed in to change notification settings - Fork 36
/
Copy pathload_bench_test.go
127 lines (105 loc) · 2.88 KB
/
load_bench_test.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
package dbr_test
import (
"fmt"
"testing"
"github.com/DATA-DOG/go-sqlmock"
"github.com/mailru/dbr"
"github.com/mailru/dbr/dialect"
)
var rawData = getDataSlice(10000)
func Benchmark_SQLScan(b *testing.B) {
for i := 0; i < b.N; i++ {
benchRawSQL(b, rawData, []benchItem{})
}
}
func Benchmark_SQLScanWithCap(b *testing.B) {
for i := 0; i < b.N; i++ {
benchRawSQL(b, rawData, make([]benchItem, 0, len(rawData)))
}
}
func Benchmark_DBRLoad(b *testing.B) {
for i := 0; i < b.N; i++ {
benchDBR(b, rawData, []benchItem{})
}
}
func Benchmark_DBRLoadPtrs(b *testing.B) {
for i := 0; i < b.N; i++ {
benchDBRPtrs(b, rawData, []*benchItem{})
}
}
func Benchmark_DBRLoadWithCap(b *testing.B) {
for i := 0; i < b.N; i++ {
benchDBR(b, rawData, make([]benchItem, 0, len(rawData)))
}
}
func Benchmark_DBRLoadPtrsWithCap(b *testing.B) {
for i := 0; i < b.N; i++ {
benchDBR(b, rawData, make([]benchItem, 0, len(rawData)))
}
}
type benchItem struct {
Field1 string
Field2 int
}
func getDataSlice(itemsCnt int) []benchItem {
res := make([]benchItem, 0, itemsCnt)
for num := 0; len(res) < cap(res); num++ {
res = append(res, benchItem{Field1: "str" + fmt.Sprint(num), Field2: num})
}
return res
}
func getRowsMocked(b *testing.B, data []benchItem) *sqlmock.Rows {
rows := sqlmock.NewRows([]string{"field1", "field2"})
for _, item := range data {
rows.AddRow(item.Field1, item.Field2)
}
return rows
}
func benchRawSQL(b *testing.B, data []benchItem, res []benchItem) {
b.StopTimer()
db, mock, err := sqlmock.New()
if err != nil {
b.Error(err)
}
mock.ExpectQuery("select").WillReturnRows(getRowsMocked(b, data))
b.StartTimer()
rows, err := db.Query("select")
if err != nil {
b.Error(err)
}
var item benchItem
for rows.Next() {
if err := rows.Scan(&item.Field1, &item.Field2); err != nil {
b.Error(err)
}
res = append(res, item)
}
}
func benchDBR(b *testing.B, data []benchItem, res []benchItem) {
b.StopTimer()
sess, dbmock := getDBRMock(b, dialect.MySQL)
dbmock.ExpectQuery("SELECT field1, field2 FROM sometable").WillReturnRows(getRowsMocked(b, data))
rows := sess.Select("field1", "field2").From("sometable")
b.StartTimer()
if _, err := rows.LoadStructs(&res); err != nil {
b.Error(err)
}
}
func benchDBRPtrs(b *testing.B, data []benchItem, res []*benchItem) {
b.StopTimer()
sess, dbmock := getDBRMock(b, dialect.MySQL)
dbmock.ExpectQuery("SELECT field1, field2 FROM sometable").WillReturnRows(getRowsMocked(b, data))
rows := sess.Select("field1", "field2").From("sometable")
b.StartTimer()
if _, err := rows.LoadStructs(&res); err != nil {
b.Error(err)
}
}
func getDBRMock(b *testing.B, dialect dbr.Dialect) (*dbr.Session, sqlmock.Sqlmock) {
db, dbmock, err := sqlmock.New()
if err != nil {
b.Error(err)
}
conn := dbr.Connection{DBConn: db, Dialect: dialect, EventReceiver: &dbr.NullEventReceiver{}}
return conn.NewSession(conn.EventReceiver), dbmock
}