From c04b05f3adfa7f64e47bf054350f2336aea32e9d Mon Sep 17 00:00:00 2001 From: jake-ciolek <66125090+jake-ciolek@users.noreply.github.com> Date: Thu, 4 Jun 2020 22:16:12 +0200 Subject: [PATCH] Optimize randBool() and randString() (#41) * - Optimize the randBool() function. Previous time: 15.175 ns/op New time: 4.78 ns/op * - Optimize randString() by using strings.Builder. 30% less memory used and a 5 to 7% higher throughput. * - Add benchmarks for randBool() and randString(). * - Ran go fmt --- fuzz.go | 15 +++++++-------- fuzz_test.go | 25 ++++++++++++++++++++++--- 2 files changed, 29 insertions(+), 11 deletions(-) diff --git a/fuzz.go b/fuzz.go index 982f637..1356e2d 100644 --- a/fuzz.go +++ b/fuzz.go @@ -24,6 +24,7 @@ import ( "time" "github.com/google/gofuzz/bytesource" + "strings" ) // fuzzFuncMap is a map from a type to a fuzzFunc that handles that type. @@ -495,10 +496,7 @@ var fillFuncMap = map[reflect.Kind]func(reflect.Value, *rand.Rand){ // randBool returns true or false randomly. func randBool(r *rand.Rand) bool { - if r.Int()&1 == 1 { - return true - } - return false + return r.Int31()&(1<<30) == 0 } type int63nPicker interface { @@ -526,11 +524,12 @@ var unicodeRanges = []charRange{ // may include a variety of (valid) UTF-8 encodings. func randString(r *rand.Rand) string { n := r.Intn(20) - runes := make([]rune, n) - for i := range runes { - runes[i] = unicodeRanges[r.Intn(len(unicodeRanges))].choose(r) + sb := strings.Builder{} + sb.Grow(n) + for i := 0; i < n; i++ { + sb.WriteRune(unicodeRanges[r.Intn(len(unicodeRanges))].choose(r)) } - return string(runes) + return sb.String() } // randUint64 makes random 64 bit numbers. diff --git a/fuzz_test.go b/fuzz_test.go index e7371fc..7adbe1b 100644 --- a/fuzz_test.go +++ b/fuzz_test.go @@ -528,9 +528,12 @@ type customInt63 struct { func (c customInt63) Int63n(n int64) int64 { switch c.mode { - case modeFirst: return 0 - case modeLast: return n-1 - default: return rand.Int63n(n) + case modeFirst: + return 0 + case modeLast: + return n - 1 + default: + return rand.Int63n(n) } } @@ -566,3 +569,19 @@ func TestNewFromGoFuzz(t *testing.T) { t.Errorf("Fuzz(%q) = %d, want: %d", input, got, want) } } + +func BenchmarkRandBool(b *testing.B) { + rs := rand.New(rand.NewSource(123)) + + for i := 0; i < b.N; i++ { + randBool(rs) + } +} + +func BenchmarkRandString(b *testing.B) { + rs := rand.New(rand.NewSource(123)) + + for i := 0; i < b.N; i++ { + randString(rs) + } +}