Skip to content

Commit d58c87c

Browse files
authored
Merge pull request #1721 from ydb-platform/bench
added benchmarks for Scan, ScanNamed, ScanStruct
2 parents 66af126 + 76e62d9 commit d58c87c

File tree

3 files changed

+119
-24
lines changed

3 files changed

+119
-24
lines changed

internal/query/row_test.go

+115-3
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,12 @@ package query
22

33
import (
44
"errors"
5+
"strconv"
56
"testing"
7+
"time"
68

79
"github.com/stretchr/testify/require"
10+
"github.com/ydb-platform/ydb-go-genproto/protos/Ydb"
811

912
"github.com/ydb-platform/ydb-go-sdk/v3/internal/query/scanner"
1013
)
@@ -42,21 +45,21 @@ func TestRowScan(t *testing.T) {
4245
scan: func() error {
4346
return row.Scan()
4447
},
45-
expErrStr: "test error at `github.com/ydb-platform/ydb-go-sdk/v3/internal/query.Row.Scan(row.go:39)` at `github.com/ydb-platform/ydb-go-sdk/v3/internal/query.TestRowScan.func1(row_test.go:43)`", //nolint:lll
48+
expErrStr: "test error at `github.com/ydb-platform/ydb-go-sdk/v3/internal/query.Row.Scan(row.go:39)` at `github.com/ydb-platform/ydb-go-sdk/v3/internal/query.TestRowScan.func1(row_test.go:46)`", //nolint:lll
4649
},
4750
{
4851
name: "named scan",
4952
scan: func() error {
5053
return row.ScanNamed()
5154
},
52-
expErrStr: "test error at `github.com/ydb-platform/ydb-go-sdk/v3/internal/query.Row.ScanNamed(row.go:51)` at `github.com/ydb-platform/ydb-go-sdk/v3/internal/query.TestRowScan.func2(row_test.go:50)`", //nolint:lll
55+
expErrStr: "test error at `github.com/ydb-platform/ydb-go-sdk/v3/internal/query.Row.ScanNamed(row.go:51)` at `github.com/ydb-platform/ydb-go-sdk/v3/internal/query.TestRowScan.func2(row_test.go:53)`", //nolint:lll
5356
},
5457
{
5558
name: "struct scan",
5659
scan: func() error {
5760
return row.ScanStruct(nil)
5861
},
59-
expErrStr: "test error at `github.com/ydb-platform/ydb-go-sdk/v3/internal/query.Row.ScanStruct(row.go:63)` at `github.com/ydb-platform/ydb-go-sdk/v3/internal/query.TestRowScan.func3(row_test.go:57)`", //nolint:lll
62+
expErrStr: "test error at `github.com/ydb-platform/ydb-go-sdk/v3/internal/query.Row.ScanStruct(row.go:63)` at `github.com/ydb-platform/ydb-go-sdk/v3/internal/query.TestRowScan.func3(row_test.go:60)`", //nolint:lll
6063
},
6164
} {
6265
t.Run(tt.name, func(t *testing.T) {
@@ -67,3 +70,112 @@ func TestRowScan(t *testing.T) {
6770
})
6871
}
6972
}
73+
74+
func generateData(count int) []*Row {
75+
columns := []*Ydb.Column{{
76+
Name: "series_id",
77+
Type: &Ydb.Type{
78+
Type: &Ydb.Type_TypeId{
79+
TypeId: Ydb.Type_UINT64,
80+
},
81+
},
82+
}, {
83+
Name: "title",
84+
Type: &Ydb.Type{
85+
Type: &Ydb.Type_OptionalType{
86+
OptionalType: &Ydb.OptionalType{
87+
Item: &Ydb.Type{
88+
Type: &Ydb.Type_TypeId{
89+
TypeId: Ydb.Type_UTF8,
90+
},
91+
},
92+
},
93+
},
94+
},
95+
}, {
96+
Name: "release_date",
97+
Type: &Ydb.Type{
98+
Type: &Ydb.Type_OptionalType{
99+
OptionalType: &Ydb.OptionalType{
100+
Item: &Ydb.Type{
101+
Type: &Ydb.Type_TypeId{
102+
TypeId: Ydb.Type_DATETIME,
103+
},
104+
},
105+
},
106+
},
107+
},
108+
}}
109+
rows := make([]*Row, count)
110+
for i := 0; i < count; i++ {
111+
rows[i] = NewRow(columns, &Ydb.Value{
112+
Items: []*Ydb.Value{{
113+
Value: &Ydb.Value_Uint64Value{
114+
Uint64Value: uint64(i),
115+
},
116+
}, {
117+
Value: &Ydb.Value_TextValue{
118+
TextValue: strconv.Itoa(i) + "a",
119+
},
120+
}, {
121+
Value: &Ydb.Value_Uint32Value{
122+
Uint32Value: uint32(i),
123+
},
124+
}},
125+
})
126+
}
127+
128+
return rows
129+
}
130+
131+
func BenchmarkScanner(b *testing.B) {
132+
b.Run("Scan", func(b *testing.B) {
133+
b.ReportAllocs()
134+
rows := generateData(b.N)
135+
var (
136+
id uint64 // for requied scan
137+
title *string // for optional scan
138+
date *time.Time // for optional scan with default type value
139+
)
140+
b.ResetTimer()
141+
for i := 0; i < b.N; i++ {
142+
if err := rows[i].Scan(&id, &title, &date); err != nil {
143+
b.Error(err)
144+
}
145+
}
146+
})
147+
b.Run("ScanNamed", func(b *testing.B) {
148+
b.ReportAllocs()
149+
rows := generateData(b.N)
150+
var (
151+
id uint64 // for requied scan
152+
title *string // for optional scan
153+
date *time.Time // for optional scan with default type value
154+
)
155+
b.ResetTimer()
156+
for i := 0; i < b.N; i++ {
157+
if err := rows[i].ScanNamed(
158+
scanner.NamedRef("series_id", &id),
159+
scanner.NamedRef("title", &title),
160+
scanner.NamedRef("release_date", &date),
161+
); err != nil {
162+
b.Error(err)
163+
}
164+
}
165+
})
166+
b.Run("ScanStruct", func(b *testing.B) {
167+
b.ReportAllocs()
168+
rows := generateData(b.N)
169+
var info struct {
170+
SeriesID string `sql:"series_id"`
171+
Title *string `sql:"title"`
172+
ReleaseDate *time.Time `sql:"release_date"`
173+
}
174+
b.ResetTimer()
175+
for i := 0; i < b.N; i++ {
176+
if err := rows[i].ScanStruct(&info); err != nil {
177+
b.Error(err)
178+
}
179+
}
180+
})
181+
}

internal/table/scanner/perfomance_test.go

+3-20
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ var testSize = 10000
1111

1212
func BenchmarkTestScanWithColumns(b *testing.B) {
1313
b.ReportAllocs()
14-
res := PrepareScannerPerformanceTest(b.N)
14+
res := generateScannerData(b.N)
1515
var (
1616
id uint64 // for requied scan
1717
title *string // for optional scan
@@ -30,7 +30,7 @@ func BenchmarkTestScanWithColumns(b *testing.B) {
3030

3131
func BenchmarkTestScan(b *testing.B) {
3232
b.ReportAllocs()
33-
res := PrepareScannerPerformanceTest(b.N)
33+
res := generateScannerData(b.N)
3434
var (
3535
id uint64 // for requied scan
3636
title *string // for optional scan
@@ -48,7 +48,7 @@ func BenchmarkTestScan(b *testing.B) {
4848

4949
func BenchmarkTestScanNamed(b *testing.B) {
5050
b.ReportAllocs()
51-
res := PrepareScannerPerformanceTest(b.N)
51+
res := generateScannerData(b.N)
5252
var (
5353
id uint64 // for requied scan
5454
title *string // for optional scan
@@ -101,23 +101,6 @@ func TestOverallSliceApproaches(t *testing.T) {
101101
}
102102
}
103103

104-
func BenchmarkTestSliceReduce(b *testing.B) {
105-
slice := make([]*column, testSize)
106-
for j := 0; j < testSize; j++ {
107-
slice[j] = &column{}
108-
}
109-
b.ResetTimer()
110-
var row column
111-
for i := 0; i < b.N; i++ {
112-
c := slice
113-
for j := 0; j < testSize; j++ {
114-
row = *c[0]
115-
slice = c[1:]
116-
}
117-
}
118-
_ = row
119-
}
120-
121104
func BenchmarkTestSliceIncrement(b *testing.B) {
122105
slice := make([]*column, testSize)
123106
for j := 0; j < testSize; j++ {

internal/table/scanner/scanner_data_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -492,7 +492,7 @@ func initScanner() *valueScanner {
492492
return &res
493493
}
494494

495-
func PrepareScannerPerformanceTest(count int) *valueScanner {
495+
func generateScannerData(count int) *valueScanner {
496496
res := initScanner()
497497
res.set.Columns = []*Ydb.Column{{
498498
Name: "series_id",

0 commit comments

Comments
 (0)