Open1
strings.Repeatすごい
SQLのIN句用に"?, ?, ?"みたいな文字列が欲しい。そのときの文字列組み立てに何を使うべきか気になったので調べてみました。結論としてstrings.Repeat
すごい。
Go 1.16.6で確認
func InStatement(count int) string {
b := make([]byte, 0, count*2)
part := []byte{',', '?'}
for i := 0; i < count; i++ {
b = append(b, part...)
}
return string(b[1:])
}
func InStatementString(count int) string {
b := ""
part := ",?"
for i := 0; i < count; i++ {
b += part
}
return b[1:]
}
func InStatementUseStringsRepeat(count int) string {
return strings.Repeat(",?", count)[1:]
}
func BenchmarkInStatement(b *testing.B) {
for i := 0; i < b.N; i++ {
InStatement(10000)
}
}
func BenchmarkInStatementString(b *testing.B) {
for i := 0; i < b.N; i++ {
InStatementString(10000)
}
}
func BenchmarkInStatementUseRepeat(b *testing.B) {
for i := 0; i < b.N; i++ {
InStatementUseStringsRepeat(10000)
}
}
BenchmarkInStatement-8 195997 6087 ns/op 40960 B/op 2 allocs/op
BenchmarkInStatementString-8 165 7224305 ns/op 105389130 B/op 10000 allocs/op
BenchmarkInStatementUseRepeat-8 910346 1285 ns/op 20480 B/op 1 allocs/op