diff --git a/generator.go b/generator.go index 1628994..d6e80fe 100644 --- a/generator.go +++ b/generator.go @@ -22,7 +22,8 @@ var ErrGeneratorOverflow = fmt.Errorf("Write past end of bounded array/hash/ivar var ErrNonSymbolValue = fmt.Errorf("Non Symbol value written when Symbol expected") const ( - genStateGrowSize = 8 // Initial size + amount to grow state stack by + maxBufferSize = 512 // Flush buffer when it exceeds this threshold + genStateGrowSize = 8 // Initial size + amount to grow state stack by symTblGrowSize = 8 ) @@ -558,7 +559,7 @@ func (gen *Generator) writeAdv() error { // If we've just finished writing out the last value, then we make sure to flush anything remaining. // Otherwise, we let things accumulate in our small buffer between calls to reduce the number of writes. - if gen.bufn > 0 && gen.st.cur.pos == gen.st.cur.cnt && gen.st.sz == 1 { + if gen.bufn > maxBufferSize || (gen.bufn > 0 && gen.st.cur.pos == gen.st.cur.cnt && gen.st.sz == 1) { if _, err := gen.w.Write(gen.buf[:gen.bufn]); err != nil { return err } diff --git a/generator_test.go b/generator_test.go index 2837765..12d1827 100644 --- a/generator_test.go +++ b/generator_test.go @@ -241,11 +241,11 @@ func BenchmarkGenLargeArray(b *testing.B) { for i := 0; i < b.N; i++ { gen.Reset(nil) - if err := gen.StartArray(10); err != nil { + if err := gen.StartArray(50000); err != nil { b.Fatal(err) } - for i := 0; i < 10; i++ { - if err := gen.Nil(); err != nil { + for i := 0; i < 50000; i++ { + if err := gen.String("somebytes"); err != nil { b.Fatal(err) } }