-
-
Notifications
You must be signed in to change notification settings - Fork 1.1k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
reduce allocations when binding string/time args
This commit reduces the number of allocations required to bind args by eliminating string to byte slice conversions for string and time.Time types and by only checking for bind parameters if any of the driver.NamedValue args are named. It also changes bind to only reset the sqlite3 statement when necessary - previously the statement was always reset even on first use (this yields a 3-4% performance boost). goos: darwin goarch: arm64 pkg: github.com/mattn/go-sqlite3 cpu: Apple M4 Pro │ y1.txt │ y2.txt │ │ sec/op │ sec/op vs base │ Suite/BenchmarkQuery-14 2.080µ ± 3% 1.995µ ± 0% -4.13% (p=0.000 n=10) Suite/BenchmarkParams-14 2.282µ ± 1% 2.181µ ± 2% -4.43% (p=0.000 n=10) Suite/BenchmarkStmt-14 1.537µ ± 1% 1.489µ ± 1% -3.16% (p=0.000 n=10) geomean 1.939µ 1.864µ -3.91% │ y1.txt │ y2.txt │ │ B/op │ B/op vs base │ Suite/BenchmarkQuery-14 688.0 ± 0% 688.0 ± 0% ~ (p=1.000 n=10) ¹ Suite/BenchmarkParams-14 1104.0 ± 0% 1000.0 ± 0% -9.42% (p=0.000 n=10) Suite/BenchmarkStmt-14 920.0 ± 0% 816.0 ± 0% -11.30% (p=0.000 n=10) geomean 887.4 824.9 -7.04% ¹ all samples are equal │ y1.txt │ y2.txt │ │ allocs/op │ allocs/op vs base │ Suite/BenchmarkQuery-14 23.00 ± 0% 23.00 ± 0% ~ (p=1.000 n=10) ¹ Suite/BenchmarkParams-14 27.00 ± 0% 25.00 ± 0% -7.41% (p=0.000 n=10) Suite/BenchmarkStmt-14 25.00 ± 0% 23.00 ± 0% -8.00% (p=0.000 n=10) geomean 24.95 23.65 -5.20% ¹ all samples are equal
- Loading branch information
1 parent
294c2ce
commit a7c0d28
Showing
3 changed files
with
128 additions
and
19 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
//go:build !go1.21 | ||
// +build !go1.21 | ||
|
||
package sqlite3 | ||
|
||
import "unsafe" | ||
|
||
// stringData is a safe version of unsafe.StringData that handles empty strings. | ||
func stringData(s string) *byte { | ||
if len(s) != 0 { | ||
b := *(*[]byte)(unsafe.Pointer(&s)) | ||
return &b[0] | ||
} | ||
// The return value of unsafe.StringData | ||
// is unspecified if the string is empty. | ||
return &placeHolder[0] | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,23 @@ | ||
//go:build go1.21 | ||
// +build go1.21 | ||
|
||
// The unsafe.StringData function was made available in Go 1.20 but it | ||
// was not until Go 1.21 that Go was changed to interpret the Go version | ||
// in go.mod (1.19 as of writing this) as the minimum version required | ||
// instead of the exact version. | ||
// | ||
// See: https://github.com/golang/go/issues/59033 | ||
|
||
package sqlite3 | ||
|
||
import "unsafe" | ||
|
||
// stringData is a safe version of unsafe.StringData that handles empty strings. | ||
func stringData(s string) *byte { | ||
if len(s) != 0 { | ||
return unsafe.StringData(s) | ||
} | ||
// The return value of unsafe.StringData | ||
// is unspecified if the string is empty. | ||
return &placeHolder[0] | ||
} |