Skip to content

Commit

Permalink
fix parsing of escaped unicode and fix random generation
Browse files Browse the repository at this point in the history
  • Loading branch information
awalterschulze committed Feb 1, 2025
1 parent a1c19fd commit 1b61c8d
Show file tree
Hide file tree
Showing 4 changed files with 202 additions and 82 deletions.
23 changes: 13 additions & 10 deletions json/alloc_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,9 @@ import (
)

func TestNoAllocsOnAverage(t *testing.T) {
seed := time.Now().UnixNano()
num := 100
r := rand.New(rand.NewSource(time.Now().UnixNano()))
r := rand.New(rand.NewSource(seed))
js := randJsons(r, num)
jparser := NewJsonParser()

Expand All @@ -34,23 +35,24 @@ func TestNoAllocsOnAverage(t *testing.T) {
return func(t *testing.T) {
t.Helper()
if allocs := testing.AllocsPerRun(runsPerTest, f); allocs != 0 {
t.Errorf("got %v allocs, want 0 allocs", allocs)
t.Errorf("seed = %v, got %v allocs, want 0 allocs", seed, allocs)
}
}
}
for i := 0; i < num; i++ {
t.Run(fmt.Sprintf("%d", i), checkNoAllocs(func() {
if err := jparser.Init(js[i]); err != nil {
t.Fatal(err)
t.Fatalf("seed = %v, err = %v", seed, err)
}
walk(jparser)
}))
}
}

func TestNotASingleAllocAfterWarmUp(t *testing.T) {
seed := time.Now().UnixNano()
num := 100
r := rand.New(rand.NewSource(time.Now().UnixNano()))
r := rand.New(rand.NewSource(seed))
js := randJsons(r, num)
pool := pool.New()
jparser := NewJsonParser()
Expand All @@ -59,7 +61,7 @@ func TestNotASingleAllocAfterWarmUp(t *testing.T) {
// warm up buffer pool
for i := 0; i < num; i++ {
if err := jparser.Init(js[i%num]); err != nil {
t.Fatal(err)
t.Fatalf("seed = %v, err = %v", seed, err)
}
walk(jparser)
}
Expand All @@ -70,38 +72,39 @@ func TestNotASingleAllocAfterWarmUp(t *testing.T) {
return func(t *testing.T) {
t.Helper()
if allocs := testing.AllocsPerRun(runsPerTest, f); allocs != 0 {
t.Errorf("got %v allocs, want 0 allocs, pool allocs = %v", allocs, pool.Size()-originalPoolSize)
t.Errorf("seed = %v, got %v allocs, want 0 allocs, pool allocs = %v", seed, allocs, pool.Size()-originalPoolSize)
}
}
}
for i := 0; i < num; i++ {
t.Run(fmt.Sprintf("%d", i), checkNoAllocs(func() {
if err := jparser.Init(js[i]); err != nil {
t.Fatal(err)
t.Fatalf("seed = %v, err = %v", seed, err)
}
walk(jparser)
}))
}
}

func BenchmarkAlloc(b *testing.B) {
seed := time.Now().UnixNano()
num := 1000
r := rand.New(rand.NewSource(time.Now().UnixNano()))
r := rand.New(rand.NewSource(seed))
js := randJsons(r, num)
jparser := NewJsonParser()

// exercise buffer pool
for i := 0; i < num; i++ {
if err := jparser.Init(js[i%num]); err != nil {
b.Fatal(err)
b.Fatalf("seed = %v, err = %v", seed, err)
}
walk(jparser)
}

b.ResetTimer()
for i := 0; i < b.N; i++ {
if err := jparser.Init(js[i%num]); err != nil {
b.Fatal(err)
b.Fatalf("seed = %v, err = %v", seed, err)
}
walk(jparser)
}
Expand Down
1 change: 1 addition & 0 deletions json/json.go
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ func scanString(buf []byte) (int, error) {
continue
case 'u':
udigits = 0
escaped = false
continue
}
return 0, errScanString
Expand Down
12 changes: 7 additions & 5 deletions json/pool_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,10 @@ import (
)

func BenchmarkPoolDefault(b *testing.B) {
seed := time.Now().UnixNano()
// generate random jsons
num := 1000
r := rand.New(rand.NewSource(time.Now().UnixNano()))
r := rand.New(rand.NewSource(seed))
js := randJsons(r, num)

// initialise pool
Expand All @@ -34,25 +35,26 @@ func BenchmarkPoolDefault(b *testing.B) {
// exercise buffer pool
for i := 0; i < num; i++ {
if err := jparser.Init(js[i%num]); err != nil {
b.Fatal(err)
b.Fatalf("seed = %v, err = %v", seed, err)
}
walk(jparser)
}
// start benchmark
b.ResetTimer()
for i := 0; i < b.N; i++ {
if err := jparser.Init(js[i%num]); err != nil {
b.Fatal(err)
b.Fatalf("seed = %v, err = %v", seed, err)
}
walk(jparser)
}
b.ReportAllocs()
}

func BenchmarkPoolNone(b *testing.B) {
seed := time.Now().UnixNano()
// generate random jsons
num := 1000
r := rand.New(rand.NewSource(time.Now().UnixNano()))
r := rand.New(rand.NewSource(seed))
js := randJsons(r, num)

// set pool to no pool
Expand All @@ -63,7 +65,7 @@ func BenchmarkPoolNone(b *testing.B) {
b.ResetTimer()
for i := 0; i < b.N; i++ {
if err := jparser.Init(js[i%num]); err != nil {
b.Fatal(err)
b.Fatalf("seed = %v, err = %v", seed, err)
}
walk(jparser)
}
Expand Down
Loading

0 comments on commit 1b61c8d

Please sign in to comment.