aboutsummaryrefslogtreecommitdiff
path: root/stream_timing_test.go
diff options
context:
space:
mode:
authorGravatar Aliaksandr Valialkin <valyala@gmail.com> 2016-06-10 15:31:02 +0300
committerGravatar Aliaksandr Valialkin <valyala@gmail.com> 2016-06-10 15:31:05 +0300
commitce9d1d2224df0b32cf58b6ce92e0c37b30007932 (patch)
treea37c8a0e99fbe1357cd6361c0c8536ef23b0997e /stream_timing_test.go
parenttypo fix (diff)
downloadfasthttp-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.go70
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")
+ }
+ })
+}