Skip to content
This repository has been archived by the owner on Jan 10, 2024. It is now read-only.

Commit

Permalink
Optimize randBool() and randString() (#41)
Browse files Browse the repository at this point in the history
* - 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
  • Loading branch information
jake-ciolek committed Jun 4, 2020
1 parent a994f4a commit c04b05f
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 11 deletions.
15 changes: 7 additions & 8 deletions fuzz.go
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down Expand Up @@ -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 {
Expand Down Expand Up @@ -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.
Expand Down
25 changes: 22 additions & 3 deletions fuzz_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
}
}

Expand Down Expand Up @@ -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)
}
}

0 comments on commit c04b05f

Please sign in to comment.