Skip to content

Commit 560e769

Browse files
committed
Add concurrent benchmarks
1 parent 95a0a4f commit 560e769

File tree

3 files changed

+109
-3
lines changed

3 files changed

+109
-3
lines changed

benchmarks.go

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ package main
22

33
import (
44
"database/sql"
5+
"sync"
6+
"sync/atomic"
57
)
68

79
func bmSimpleExec(db *sql.DB, n int) error {
@@ -222,3 +224,99 @@ func bmSelectPreparedLargeRaw(db *sql.DB, n int) error {
222224
}
223225
return nil
224226
}
227+
228+
func runPreparedExecConcurrent(db *sql.DB, n int, co int) error {
229+
stmt, err := db.Prepare("DO 1")
230+
if err != nil {
231+
return err
232+
}
233+
234+
remain := int64(n)
235+
var wg sync.WaitGroup
236+
wg.Add(co)
237+
238+
for i := 0; i < co; i++ {
239+
go func() {
240+
for {
241+
if atomic.AddInt64(&remain, -1) < 0 {
242+
wg.Done()
243+
return
244+
}
245+
246+
if _, err1 := stmt.Exec(); err1 != nil {
247+
wg.Done()
248+
err = err1
249+
return
250+
}
251+
}
252+
}()
253+
}
254+
wg.Wait()
255+
stmt.Close()
256+
return err
257+
}
258+
259+
func bmPreparedExecConcurrent2(db *sql.DB, n int) error {
260+
return runPreparedExecConcurrent(db, n, 2)
261+
}
262+
263+
func bmPreparedExecConcurrent4(db *sql.DB, n int) error {
264+
return runPreparedExecConcurrent(db, n, 4)
265+
}
266+
267+
func bmPreparedExecConcurrent8(db *sql.DB, n int) error {
268+
return runPreparedExecConcurrent(db, n, 8)
269+
}
270+
271+
func bmPreparedExecConcurrent16(db *sql.DB, n int) error {
272+
return runPreparedExecConcurrent(db, n, 16)
273+
}
274+
275+
func runPreparedQueryConcurrent(db *sql.DB, n int, co int) error {
276+
stmt, err := db.Prepare("SELECT ?, \"foobar\"")
277+
if err != nil {
278+
return err
279+
}
280+
281+
remain := int64(n)
282+
var wg sync.WaitGroup
283+
wg.Add(co)
284+
285+
for i := 0; i < co; i++ {
286+
go func() {
287+
var id int
288+
var str string
289+
for {
290+
if atomic.AddInt64(&remain, -1) < 0 {
291+
wg.Done()
292+
return
293+
}
294+
295+
if err1 := stmt.QueryRow(i).Scan(&id, &str); err1 != nil {
296+
wg.Done()
297+
err = err1
298+
return
299+
}
300+
}
301+
}()
302+
}
303+
wg.Wait()
304+
stmt.Close()
305+
return err
306+
}
307+
308+
func bmPreparedQueryConcurrent2(db *sql.DB, n int) error {
309+
return runPreparedQueryConcurrent(db, n, 2)
310+
}
311+
312+
func bmPreparedQueryConcurrent4(db *sql.DB, n int) error {
313+
return runPreparedQueryConcurrent(db, n, 4)
314+
}
315+
316+
func bmPreparedQueryConcurrent8(db *sql.DB, n int) error {
317+
return runPreparedQueryConcurrent(db, n, 8)
318+
}
319+
320+
func bmPreparedQueryConcurrent16(db *sql.DB, n int) error {
321+
return runPreparedQueryConcurrent(db, n, 16)
322+
}

framework/suite.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ func (bs *BenchmarkSuite) Run() {
130130
} else {
131131
fmt.Println(
132132
res.Duration.String(), " \t",
133-
res.QueriesPerSecond(), "queries/sec \t",
133+
int(res.QueriesPerSecond()+0.5), "queries/sec \t",
134134
res.AllocsPerQuery(), "allocs/query \t",
135135
res.BytesPerQuery(), "B/query",
136136
)

main.go

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,11 @@ func main() {
2929
WarmUp: warmup,
3030
}
3131

32-
if err = bs.AddDriver("mymysql godrv", "mymysql", "gotest/root/root"); err != nil {
32+
if err = bs.AddDriver("Go-MySQL-Driver", "mysql", "root:root@/gotest"); err != nil {
3333
fmt.Println(err)
3434
return
3535
}
36-
if err = bs.AddDriver("Go-MySQL-Driver", "mysql", "root:root@/gotest"); err != nil {
36+
if err = bs.AddDriver("mymysql godrv", "mymysql", "gotest/root/root"); err != nil {
3737
fmt.Println(err)
3838
return
3939
}
@@ -50,6 +50,14 @@ func main() {
5050
bs.AddBenchmark("SelectPreparedLargeBytes", 100000, bmSelectPreparedLargeBytes)
5151
bs.AddBenchmark("SelectLargeRaw", 100000, bmSelectLargeRaw)
5252
bs.AddBenchmark("SelectPreparedLargeRaw", 100000, bmSelectPreparedLargeRaw)
53+
bs.AddBenchmark("PreparedExecConcurrent2", 500000, bmPreparedExecConcurrent2)
54+
bs.AddBenchmark("PreparedExecConcurrent4", 500000, bmPreparedExecConcurrent4)
55+
bs.AddBenchmark("PreparedExecConcurrent8", 500000, bmPreparedExecConcurrent8)
56+
bs.AddBenchmark("PreparedExecConcurrent16", 500000, bmPreparedExecConcurrent16)
57+
bs.AddBenchmark("PreparedQueryConcurrent2", 500000, bmPreparedQueryConcurrent2)
58+
bs.AddBenchmark("PreparedQueryConcurrent4", 500000, bmPreparedQueryConcurrent4)
59+
bs.AddBenchmark("PreparedQueryConcurrent8", 500000, bmPreparedQueryConcurrent8)
60+
bs.AddBenchmark("PreparedQueryConcurrent16", 500000, bmPreparedQueryConcurrent16)
5361

5462
bs.Run()
5563
}

0 commit comments

Comments
 (0)