diff options
author | Aliaksandr Valialkin <valyala@gmail.com> | 2016-06-10 15:31:02 +0300 |
---|---|---|
committer | Aliaksandr Valialkin <valyala@gmail.com> | 2016-06-10 15:31:05 +0300 |
commit | ce9d1d2224df0b32cf58b6ce92e0c37b30007932 (patch) | |
tree | a37c8a0e99fbe1357cd6361c0c8536ef23b0997e /stream_timing_test.go | |
parent | typo fix (diff) | |
download | fasthttp-ce9d1d2224df0b32cf58b6ce92e0c37b30007932.tar.gz fasthttp-ce9d1d2224df0b32cf58b6ce92e0c37b30007932.tar.bz2 fasthttp-ce9d1d2224df0b32cf58b6ce92e0c37b30007932.zip |
Use fasthttp.PipeConns instead of io.Pipe in StreamReader
This improves StreamReader performance by more than 2x.
Diffstat (limited to 'stream_timing_test.go')
-rw-r--r-- | stream_timing_test.go | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/stream_timing_test.go b/stream_timing_test.go new file mode 100644 index 0000000..facca3a --- /dev/null +++ b/stream_timing_test.go @@ -0,0 +1,70 @@ +package fasthttp + +import ( + "bufio" + "io" + "testing" + "time" +) + +func BenchmarkStreamReader1(b *testing.B) { + benchmarkStreamReader(b, 1) +} + +func BenchmarkStreamReader10(b *testing.B) { + benchmarkStreamReader(b, 10) +} + +func BenchmarkStreamReader100(b *testing.B) { + benchmarkStreamReader(b, 100) +} + +func BenchmarkStreamReader1K(b *testing.B) { + benchmarkStreamReader(b, 1000) +} + +func BenchmarkStreamReader10K(b *testing.B) { + benchmarkStreamReader(b, 10000) +} + +func benchmarkStreamReader(b *testing.B, size int) { + src := createFixedBody(size) + b.SetBytes(int64(size)) + + b.RunParallel(func(pb *testing.PB) { + dst := make([]byte, size) + ch := make(chan error, 1) + sr := NewStreamReader(func(w *bufio.Writer) { + for pb.Next() { + if _, err := w.Write(src); err != nil { + ch <- err + return + } + if err := w.Flush(); err != nil { + ch <- err + return + } + } + ch <- nil + }) + for { + if _, err := sr.Read(dst); err != nil { + if err == io.EOF { + break + } + b.Fatalf("unexpected error when reading from stream reader: %s", err) + } + } + if err := sr.Close(); err != nil { + b.Fatalf("unexpected error when closing stream reader: %s", err) + } + select { + case err := <-ch: + if err != nil { + b.Fatalf("unexpected error from stream reader: %s", err) + } + case <-time.After(time.Second): + b.Fatalf("timeout") + } + }) +} |