diff --git a/client.go b/client.go index 59cc0fe..d74ba8a 100644 --- a/client.go +++ b/client.go @@ -1,7 +1,6 @@ package gotsrpc import ( - "bufio" "compress/gzip" "context" "fmt" @@ -155,7 +154,7 @@ func (c *BufferedClient) Call(ctx context.Context, url string, endpoint string, encodeWriter = snappyWriter defer snappyWriter.Close() case CompressorNone: - encodeWriter = bufio.NewWriterSize(writer, 1024) + encodeWriter = writer default: encodeWriter = writer } @@ -180,6 +179,8 @@ func (c *BufferedClient) Call(ctx context.Context, url string, endpoint string, req.Header.Set("Content-Encoding", "gzip") case CompressorSnappy: req.Header.Set("Content-Encoding", "snappy") + case CompressorNone: + // uncompressed, nothing to do default: // uncompressed, nothing to do } diff --git a/client_test.go b/client_test.go index ae8a0fd..629ad31 100644 --- a/client_test.go +++ b/client_test.go @@ -97,7 +97,6 @@ func TestNewBufferedClient(t *testing.T) { } func BenchmarkBufferedClient(b *testing.B) { - var testRequestData []interface{} data, err := os.ReadFile("testdata/request.json") require.NoError(b, err) @@ -106,22 +105,33 @@ func BenchmarkBufferedClient(b *testing.B) { require.NoError(b, err) benchClient := func(b *testing.B, client Client) { - server := httptest.NewServer(http.HandlerFunc(func(writer http.ResponseWriter, request *http.Request) { writer.Write([]byte("[]")) })) defer server.Close() b.ReportAllocs() - - client.(*BufferedClient).client = server.Client() + b.ResetTimer() + if bc, ok := client.(*BufferedClient); ok { + bc.client = server.Client() + } for i := 0; i < b.N; i++ { err := client.Call(context.Background(), server.URL, "/test", "test", testRequestData, nil) require.NoError(b, err) } } + benchmarks := map[string]Compressor{ + "none": CompressorNone, + "gzip": CompressorGZIP, + "snappy": CompressorSnappy, + } + runs := 5 - b.Run("uncompressed", func(b *testing.B) { benchClient(b, NewBufferedClient(WithCompressor(CompressorNone))) }) - b.Run("gzip", func(b *testing.B) { benchClient(b, NewBufferedClient(WithCompressor(CompressorGZIP))) }) - b.Run("snappy", func(b *testing.B) { benchClient(b, NewBufferedClient(WithCompressor(CompressorSnappy))) }) + for name, compressor := range benchmarks { + b.Run(name, func(b *testing.B) { + for index := 0; index < runs; index++ { + b.Run(fmt.Sprintf("%d", index), func(b *testing.B) { benchClient(b, NewBufferedClient(WithCompressor(compressor))) }) + } + }) + } } diff --git a/doc/adr/0001-record-architecture-decisions.md b/doc/adr/0001-record-architecture-decisions.md new file mode 100644 index 0000000..5ed6ce1 --- /dev/null +++ b/doc/adr/0001-record-architecture-decisions.md @@ -0,0 +1,19 @@ +# 1. Record architecture decisions + +Date: 2025-01-16 + +## Status + +Accepted + +## Context + +We need to record the architectural decisions made on this project. + +## Decision + +We will use Architecture Decision Records, as [described by Michael Nygard](http://thinkrelevance.com/blog/2011/11/15/documenting-architecture-decisions). + +## Consequences + +See Michael Nygard's article, linked above. For a lightweight ADR toolset, see Nat Pryce's [adr-tools](https://github.com/npryce/adr-tools). diff --git a/doc/adr/0002-streaming-and-compression.md b/doc/adr/0002-streaming-and-compression.md new file mode 100644 index 0000000..373a98f --- /dev/null +++ b/doc/adr/0002-streaming-and-compression.md @@ -0,0 +1,72 @@ +# 2. streaming and compression + +Date: 2025-01-16 + +## Status + +Accepted + +## Context + +We need to allow streaming and compression of the data. + +## Decision + +We will use the `io.Pipe` interface to allow streaming of the data, and pipe the data through the compression algorithm. +For + +## Consequences + +Benchmarking shows that the compression is not noticeable for snappy, but the streaming is in comparison to the old method. + +```text +goos: darwin +goarch: arm64 +pkg: github.com/foomo/gotsrpc/v2 +cpu: Apple M1 Max +BenchmarkBufferedClient +BenchmarkBufferedClient/deprecated +BenchmarkBufferedClient/deprecated/0 +BenchmarkBufferedClient/deprecated/0-10 20712 54428 ns/op 26135 B/op 108 allocs/op +BenchmarkBufferedClient/deprecated/1 +BenchmarkBufferedClient/deprecated/1-10 22180 52320 ns/op 26170 B/op 108 allocs/op +BenchmarkBufferedClient/deprecated/2 +BenchmarkBufferedClient/deprecated/2-10 22329 49323 ns/op 26236 B/op 108 allocs/op +BenchmarkBufferedClient/deprecated/3 +BenchmarkBufferedClient/deprecated/3-10 24580 48177 ns/op 26138 B/op 108 allocs/op +BenchmarkBufferedClient/deprecated/4 +BenchmarkBufferedClient/deprecated/4-10 24999 57772 ns/op 26154 B/op 108 allocs/op +BenchmarkBufferedClient/snappy +BenchmarkBufferedClient/snappy/0 +BenchmarkBufferedClient/snappy/0-10 16392 69553 ns/op 15282 B/op 114 allocs/op +BenchmarkBufferedClient/snappy/1 +BenchmarkBufferedClient/snappy/1-10 17702 72923 ns/op 14944 B/op 114 allocs/op +BenchmarkBufferedClient/snappy/2 +BenchmarkBufferedClient/snappy/2-10 17932 67446 ns/op 14819 B/op 114 allocs/op +BenchmarkBufferedClient/snappy/3 +BenchmarkBufferedClient/snappy/3-10 16640 69216 ns/op 15155 B/op 114 allocs/op +BenchmarkBufferedClient/snappy/4 +BenchmarkBufferedClient/snappy/4-10 16767 66247 ns/op 15010 B/op 114 allocs/op +BenchmarkBufferedClient/none +BenchmarkBufferedClient/none/0 +BenchmarkBufferedClient/none/0-10 17706 68516 ns/op 12280 B/op 112 allocs/op +BenchmarkBufferedClient/none/1 +BenchmarkBufferedClient/none/1-10 17593 68580 ns/op 12308 B/op 112 allocs/op +BenchmarkBufferedClient/none/2 +BenchmarkBufferedClient/none/2-10 17292 67673 ns/op 12208 B/op 112 allocs/op +BenchmarkBufferedClient/none/3 +BenchmarkBufferedClient/none/3-10 17086 71715 ns/op 12285 B/op 112 allocs/op +BenchmarkBufferedClient/none/4 +BenchmarkBufferedClient/none/4-10 17067 68955 ns/op 12295 B/op 112 allocs/op +BenchmarkBufferedClient/gzip +BenchmarkBufferedClient/gzip/0 +BenchmarkBufferedClient/gzip/0-10 7190 153284 ns/op 22024 B/op 113 allocs/op +BenchmarkBufferedClient/gzip/1 +BenchmarkBufferedClient/gzip/1-10 6808 158344 ns/op 20757 B/op 113 allocs/op +BenchmarkBufferedClient/gzip/2 +BenchmarkBufferedClient/gzip/2-10 6889 156492 ns/op 19680 B/op 113 allocs/op +BenchmarkBufferedClient/gzip/3 +BenchmarkBufferedClient/gzip/3-10 6927 148146 ns/op 18912 B/op 113 allocs/op +BenchmarkBufferedClient/gzip/4 +BenchmarkBufferedClient/gzip/4-10 8340 146697 ns/op 20207 B/op 113 allocs/op +```