Skip to content
This repository has been archived by the owner on Nov 29, 2024. It is now read-only.

Commit

Permalink
Parametize the queries to raw adapter
Browse files Browse the repository at this point in the history
Previously, the same query would be sent each time, while the other
adapters were varying which rows were requested. Now the raw
benchmarks send the exact same queries.
  • Loading branch information
jackc committed Jun 27, 2014
1 parent ae6b90a commit 345ae9f
Show file tree
Hide file tree
Showing 8 changed files with 1,625 additions and 130 deletions.
12 changes: 4 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Go Database Benchmark

This tests the performance of pgx native, pgx through database/sql, apq through
This tests the performance of pgx native, pgx through database/sql, pq through
database/sql, and theoretical maximum PostgreSQL performance.

## Theoretical Max PostgreSQL Performance
Expand All @@ -11,10 +11,6 @@ connection and prepare statements. Query execution is benchmarked by sending a
message is received. This should be the theoretical best performance a Go
PostgreSQL driver could achieve.

Caveats:

* The other benchmarks select different rows with each query. The raw queries
select exactly the same rows each time.
* The returned data is not checked or parsed. It is only read until the ready
for query message is received. If an error occurs it may not be apparent
which could cause the timing to be misleading.
Caveat: The returned data is not checked or parsed. It is only read until the
ready for query message is received. If an error occurs it may not be apparent
which could cause the timing to be misleading.
56 changes: 42 additions & 14 deletions bench_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,11 @@ where id=$1`
var selectMultiplePeopleSQL = `
select id, first_name, last_name, sex, birth_date, weight, height
from person
where id between $1 and $1 + 25`
where id between $1 and $1 + 24`

var rawSelectPersonNameStmt *raw.PreparedStatement
var rawSelectPersonStmt *raw.PreparedStatement
var rawSelectMultiplePeopleStmt *raw.PreparedStatement

var rxBuf []byte

Expand Down Expand Up @@ -94,15 +98,15 @@ func setup(b *testing.B) {
if err != nil {
b.Fatalf("raw.Connect failed: %v", err)
}
_, err = rawConn.Prepare("selectPersonName", selectPersonNameSQL)
rawSelectPersonNameStmt, err = rawConn.Prepare("selectPersonName", selectPersonNameSQL)
if err != nil {
b.Fatalf("rawConn.Prepare failed: %v", err)
}
_, err = rawConn.Prepare("selectPerson", selectPersonSQL)
rawSelectPersonStmt, err = rawConn.Prepare("selectPerson", selectPersonSQL)
if err != nil {
b.Fatalf("rawConn.Prepare failed: %v", err)
}
_, err = rawConn.Prepare("selectMultiplePeople", selectMultiplePeopleSQL)
rawSelectMultiplePeopleStmt, err = rawConn.Prepare("selectMultiplePeople", selectMultiplePeopleSQL)
if err != nil {
b.Fatalf("rawConn.Prepare failed: %v", err)
}
Expand Down Expand Up @@ -213,12 +217,20 @@ func benchmarkSelectSingleValuePrepared(b *testing.B, stmt *sql.Stmt) {

func BenchmarkRawSelectSingleValuePrepared(b *testing.B) {
setup(b)
b.ResetTimer()

txBuf := []byte{0x42, 0x0, 0x0, 0x0, 0x28, 0x0, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x50, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x0, 0x0, 0x1, 0x0, 0x1, 0x0, 0x1, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x11, 0x61, 0x0, 0x1, 0x0, 0x0, 0x45, 0x0, 0x0, 0x0, 0x9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x53, 0x0, 0x0, 0x0, 0x4}
txBufs := make([][]byte, len(randPersonIDs))
for i, personID := range randPersonIDs {
var err error
txBufs[i], err = rawConn.BuildPreparedQueryBuf(rawSelectPersonNameStmt, personID)
if err != nil {
b.Fatalf("rawConn.BuildPreparedQueryBuf failed: %v", err)
}
}

b.ResetTimer()
for i := 0; i < b.N; i++ {
_, err := rawConn.Conn.Write(txBuf)
txBuf := txBufs[i%len(txBufs)]
_, err := rawConn.Conn().Write(txBuf)
if err != nil {
b.Fatalf("rawConn.Conn.Write failed: %v", err)
}
Expand Down Expand Up @@ -352,12 +364,20 @@ func benchmarkSelectSingleRowPrepared(b *testing.B, stmt *sql.Stmt) {

func BenchmarkRawSelectSingleRowPrepared(b *testing.B) {
setup(b)
b.ResetTimer()

txBuf := []byte{0x42, 0x0, 0x0, 0x0, 0x30, 0x0, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x50, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x0, 0x0, 0x1, 0x0, 0x1, 0x0, 0x1, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0xc, 0x7e, 0x0, 0x7, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x1, 0x45, 0x0, 0x0, 0x0, 0x9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x53, 0x0, 0x0, 0x0, 0x4}
txBufs := make([][]byte, len(randPersonIDs))
for i, personID := range randPersonIDs {
var err error
txBufs[i], err = rawConn.BuildPreparedQueryBuf(rawSelectPersonStmt, personID)
if err != nil {
b.Fatalf("rawConn.BuildPreparedQueryBuf failed: %v", err)
}
}

b.ResetTimer()
for i := 0; i < b.N; i++ {
_, err := rawConn.Conn.Write(txBuf)
txBuf := txBufs[i%len(txBufs)]
_, err := rawConn.Conn().Write(txBuf)
if err != nil {
b.Fatalf("rawConn.Conn.Write failed: %v", err)
}
Expand Down Expand Up @@ -497,12 +517,20 @@ func benchmarkSelectMultipleRowsPrepared(b *testing.B, stmt *sql.Stmt) {

func BenchmarkRawSelectMultipleRowsPrepared(b *testing.B) {
setup(b)
b.ResetTimer()

txBuf := []byte{0x42, 0x0, 0x0, 0x0, 0x38, 0x0, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x50, 0x65, 0x6f, 0x70, 0x6c, 0x65, 0x0, 0x0, 0x1, 0x0, 0x1, 0x0, 0x1, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x11, 0x83, 0x0, 0x7, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x1, 0x45, 0x0, 0x0, 0x0, 0x9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x53, 0x0, 0x0, 0x0, 0x4}
txBufs := make([][]byte, len(randPersonIDs))
for i, personID := range randPersonIDs {
var err error
txBufs[i], err = rawConn.BuildPreparedQueryBuf(rawSelectMultiplePeopleStmt, personID)
if err != nil {
b.Fatalf("rawConn.BuildPreparedQueryBuf failed: %v", err)
}
}

b.ResetTimer()
for i := 0; i < b.N; i++ {
_, err := rawConn.Conn.Write(txBuf)
txBuf := txBufs[i%len(txBufs)]
_, err := rawConn.Conn().Write(txBuf)
if err != nil {
b.Fatalf("rawConn.Conn.Write failed: %v", err)
}
Expand All @@ -513,7 +541,7 @@ func BenchmarkRawSelectMultipleRowsPrepared(b *testing.B) {

func rxRawUntilReady(b *testing.B) {
for {
n, err := rawConn.Conn.Read(rxBuf)
n, err := rawConn.Conn().Read(rxBuf)
if err != nil {
b.Fatalf("rawConn.Conn.Read failed: %v", err)
}
Expand Down
Loading

0 comments on commit 345ae9f

Please sign in to comment.