Open1

strings.Repeatすごい

catatsuycatatsuy

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