Skip to content

Commit 0bdc2a7

Browse files
authored
Merge pull request jmoiron#635 from nussjustin/optimize-in
Optimize In performance by reducing allocations for common queries
2 parents ded6c03 + 13b2331 commit 0bdc2a7

File tree

1 file changed

+17
-8
lines changed

1 file changed

+17
-8
lines changed

bind.go

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,14 @@ func In(query string, args ...interface{}) (string, []interface{}, error) {
151151
var flatArgsCount int
152152
var anySlices bool
153153

154-
meta := make([]argMeta, len(args))
154+
var stackMeta [32]argMeta
155+
156+
var meta []argMeta
157+
if len(args) <= len(stackMeta) {
158+
meta = stackMeta[:len(args)]
159+
} else {
160+
meta = make([]argMeta, len(args))
161+
}
155162

156163
for i, arg := range args {
157164
if a, ok := arg.(driver.Valuer); ok {
@@ -185,7 +192,9 @@ func In(query string, args ...interface{}) (string, []interface{}, error) {
185192
}
186193

187194
newArgs := make([]interface{}, 0, flatArgsCount)
188-
buf := make([]byte, 0, len(query)+len(", ?")*flatArgsCount)
195+
196+
var buf strings.Builder
197+
buf.Grow(len(query) + len(", ?")*flatArgsCount)
189198

190199
var arg, offset int
191200

@@ -211,10 +220,10 @@ func In(query string, args ...interface{}) (string, []interface{}, error) {
211220
}
212221

213222
// write everything up to and including our ? character
214-
buf = append(buf, query[:offset+i+1]...)
223+
buf.WriteString(query[:offset+i+1])
215224

216225
for si := 1; si < argMeta.length; si++ {
217-
buf = append(buf, ", ?"...)
226+
buf.WriteString(", ?")
218227
}
219228

220229
newArgs = appendReflectSlice(newArgs, argMeta.v, argMeta.length)
@@ -225,13 +234,13 @@ func In(query string, args ...interface{}) (string, []interface{}, error) {
225234
offset = 0
226235
}
227236

228-
buf = append(buf, query...)
237+
buf.WriteString(query)
229238

230239
if arg < len(meta) {
231240
return "", nil, errors.New("number of bindVars less than number arguments")
232241
}
233242

234-
return string(buf), newArgs, nil
243+
return buf.String(), newArgs, nil
235244
}
236245

237246
func appendReflectSlice(args []interface{}, v reflect.Value, vlen int) []interface{} {
@@ -240,11 +249,11 @@ func appendReflectSlice(args []interface{}, v reflect.Value, vlen int) []interfa
240249
args = append(args, val...)
241250
case []int:
242251
for i := range val {
243-
args = append(args, val[i])
252+
args = append(args, &val[i])
244253
}
245254
case []string:
246255
for i := range val {
247-
args = append(args, val[i])
256+
args = append(args, &val[i])
248257
}
249258
default:
250259
for si := 0; si < vlen; si++ {

0 commit comments

Comments
 (0)