From c8492d63755d93b923cc9d63562d6285905cd494 Mon Sep 17 00:00:00 2001 From: Klaus Post Date: Sun, 25 Sep 2022 15:59:52 +0200 Subject: [PATCH] tests: Add zstd Reset and NewReader benchmarks. (#676) Output: ``` goos: windows goarch: amd64 pkg: github.com/klauspost/compress/zstd cpu: AMD Ryzen 9 3950X 16-Core Processor BenchmarkDecoder_DecoderReset/kppkn.gtb.zst/stream-32 7342 139579 ns/op 0.01 MB/s 93922 B/op 16 allocs/op BenchmarkDecoder_DecoderReset/kppkn.gtb.zst/stream-single-32 29215276 38.96 ns/op 25.67 MB/s 0 B/op 0 allocs/op BenchmarkDecoder_DecoderReset/kppkn.gtb.zst/buffer-32 4060 280503 ns/op 0.00 MB/s 2 B/op 0 allocs/op BenchmarkDecoder_DecoderReset/kppkn.gtb.zst/buffer-single-32 4202 280597 ns/op 0.00 MB/s 2 B/op 0 allocs/op BenchmarkDecoder_DecoderReset/geo.protodata.zst/stream-32 20731 57093 ns/op 0.02 MB/s 61110 B/op 16 allocs/op BenchmarkDecoder_DecoderReset/geo.protodata.zst/stream-single-32 30301192 39.27 ns/op 25.46 MB/s 0 B/op 0 allocs/op BenchmarkDecoder_DecoderReset/geo.protodata.zst/buffer-32 16564 71993 ns/op 0.01 MB/s 0 B/op 0 allocs/op BenchmarkDecoder_DecoderReset/geo.protodata.zst/buffer-single-32 16620 72548 ns/op 0.01 MB/s 0 B/op 0 allocs/op BenchmarkDecoder_DecoderReset/plrabn12.txt.zst/stream-32 4443 251523 ns/op 0.00 MB/s 248747 B/op 16 allocs/op BenchmarkDecoder_DecoderReset/plrabn12.txt.zst/stream-single-32 28945444 38.59 ns/op 25.91 MB/s 0 B/op 0 allocs/op BenchmarkDecoder_DecoderReset/plrabn12.txt.zst/buffer-32 1296 915978 ns/op 0.00 MB/s 6 B/op 0 allocs/op BenchmarkDecoder_DecoderReset/plrabn12.txt.zst/buffer-single-32 1286 914266 ns/op 0.00 MB/s 6 B/op 0 allocs/op BenchmarkDecoder_DecoderReset/lcet10.txt.zst/stream-32 5703 213168 ns/op 0.00 MB/s 211389 B/op 16 allocs/op BenchmarkDecoder_DecoderReset/lcet10.txt.zst/stream-single-32 29227872 38.88 ns/op 25.72 MB/s 0 B/op 0 allocs/op BenchmarkDecoder_DecoderReset/lcet10.txt.zst/buffer-32 1737 680258 ns/op 0.00 MB/s 4 B/op 0 allocs/op BenchmarkDecoder_DecoderReset/lcet10.txt.zst/buffer-single-32 1764 678171 ns/op 0.00 MB/s 4 B/op 0 allocs/op BenchmarkDecoder_DecoderReset/asyoulik.txt.zst/stream-32 9230 126437 ns/op 0.01 MB/s 65765 B/op 16 allocs/op BenchmarkDecoder_DecoderReset/asyoulik.txt.zst/stream-single-32 28616192 39.14 ns/op 25.55 MB/s 0 B/op 0 allocs/op BenchmarkDecoder_DecoderReset/asyoulik.txt.zst/buffer-32 4788 243991 ns/op 0.00 MB/s 1 B/op 0 allocs/op BenchmarkDecoder_DecoderReset/asyoulik.txt.zst/buffer-single-32 4995 243551 ns/op 0.00 MB/s 1 B/op 0 allocs/op BenchmarkDecoder_DecoderReset/alice29.txt.zst/stream-32 7500 150852 ns/op 0.01 MB/s 81302 B/op 16 allocs/op BenchmarkDecoder_DecoderReset/alice29.txt.zst/stream-single-32 30316350 38.84 ns/op 25.75 MB/s 0 B/op 0 allocs/op BenchmarkDecoder_DecoderReset/alice29.txt.zst/buffer-32 4132 283894 ns/op 0.00 MB/s 6 B/op 0 allocs/op BenchmarkDecoder_DecoderReset/alice29.txt.zst/buffer-single-32 4282 283968 ns/op 0.00 MB/s 3 B/op 0 allocs/op BenchmarkDecoder_DecoderReset/html_x_4.zst/stream-32 14912 79797 ns/op 0.01 MB/s 209031 B/op 16 allocs/op BenchmarkDecoder_DecoderReset/html_x_4.zst/stream-single-32 29216841 39.40 ns/op 25.38 MB/s 0 B/op 0 allocs/op BenchmarkDecoder_DecoderReset/html_x_4.zst/buffer-32 5308 225698 ns/op 0.00 MB/s 2 B/op 0 allocs/op BenchmarkDecoder_DecoderReset/html_x_4.zst/buffer-single-32 5151 224095 ns/op 0.00 MB/s 1 B/op 0 allocs/op BenchmarkDecoder_DecoderReset/paper-100k.pdf.zst/stream-32 41679 28677 ns/op 0.03 MB/s 52505 B/op 15 allocs/op BenchmarkDecoder_DecoderReset/paper-100k.pdf.zst/stream-single-32 29281075 39.03 ns/op 25.62 MB/s 0 B/op 0 allocs/op BenchmarkDecoder_DecoderReset/paper-100k.pdf.zst/buffer-32 69525 17038 ns/op 0.06 MB/s 0 B/op 0 allocs/op BenchmarkDecoder_DecoderReset/paper-100k.pdf.zst/buffer-single-32 70429 17058 ns/op 0.06 MB/s 0 B/op 0 allocs/op BenchmarkDecoder_DecoderReset/fireworks.jpeg.zst/stream-32 50344 24352 ns/op 0.04 MB/s 64293 B/op 15 allocs/op BenchmarkDecoder_DecoderReset/fireworks.jpeg.zst/stream-single-32 28991318 40.39 ns/op 24.76 MB/s 0 B/op 0 allocs/op BenchmarkDecoder_DecoderReset/fireworks.jpeg.zst/buffer-32 125324 9517 ns/op 0.11 MB/s 0 B/op 0 allocs/op BenchmarkDecoder_DecoderReset/fireworks.jpeg.zst/buffer-single-32 125260 9473 ns/op 0.11 MB/s 0 B/op 0 allocs/op BenchmarkDecoder_DecoderReset/urls.10K.zst/stream-32 6666 175583 ns/op 0.01 MB/s 351143 B/op 16 allocs/op BenchmarkDecoder_DecoderReset/urls.10K.zst/stream-single-32 29149278 38.66 ns/op 25.87 MB/s 0 B/op 0 allocs/op BenchmarkDecoder_DecoderReset/urls.10K.zst/buffer-32 1369 866145 ns/op 0.00 MB/s 6 B/op 0 allocs/op BenchmarkDecoder_DecoderReset/urls.10K.zst/buffer-single-32 1376 867065 ns/op 0.00 MB/s 6 B/op 0 allocs/op BenchmarkDecoder_DecoderReset/html.zst/stream-32 22653 52693 ns/op 0.02 MB/s 52617 B/op 16 allocs/op BenchmarkDecoder_DecoderReset/html.zst/stream-single-32 29974896 39.97 ns/op 25.02 MB/s 0 B/op 0 allocs/op BenchmarkDecoder_DecoderReset/html.zst/buffer-32 15141 78948 ns/op 0.01 MB/s 0 B/op 0 allocs/op BenchmarkDecoder_DecoderReset/html.zst/buffer-single-32 15177 78995 ns/op 0.01 MB/s 0 B/op 0 allocs/op BenchmarkDecoder_DecoderReset/comp-data.bin.zst/stream-32 79095 15288 ns/op 0.07 MB/s 3212 B/op 15 allocs/op BenchmarkDecoder_DecoderReset/comp-data.bin.zst/stream-single-32 29901622 38.82 ns/op 25.76 MB/s 0 B/op 0 allocs/op BenchmarkDecoder_DecoderReset/comp-data.bin.zst/buffer-32 163027 7268 ns/op 0.14 MB/s 0 B/op 0 allocs/op BenchmarkDecoder_DecoderReset/comp-data.bin.zst/buffer-single-32 166342 7244 ns/op 0.14 MB/s 0 B/op 0 allocs/op PASS ok github.com/klauspost/compress/zstd 64.425s goos: windows goarch: amd64 pkg: github.com/klauspost/compress/zstd cpu: AMD Ryzen 9 3950X 16-Core Processor BenchmarkDecoder_DecoderNewNoRead/kppkn.gtb.zst/stream-32 7988 195894 ns/op 0.01 MB/s 515545 B/op 37 allocs/op BenchmarkDecoder_DecoderNewNoRead/kppkn.gtb.zst/stream-single-32 1000000 1047 ns/op 0.96 MB/s 1896 B/op 8 allocs/op BenchmarkDecoder_DecoderNewNoRead/kppkn.gtb.zst/buffer-32 3194 369579 ns/op 0.00 MB/s 401324 B/op 30 allocs/op BenchmarkDecoder_DecoderNewNoRead/kppkn.gtb.zst/buffer-single-32 3249 367261 ns/op 0.00 MB/s 398799 B/op 24 allocs/op BenchmarkDecoder_DecoderNewNoRead/geo.protodata.zst/stream-32 12852 88637 ns/op 0.01 MB/s 237922 B/op 35 allocs/op BenchmarkDecoder_DecoderNewNoRead/geo.protodata.zst/stream-single-32 1000000 1079 ns/op 0.93 MB/s 1896 B/op 8 allocs/op BenchmarkDecoder_DecoderNewNoRead/geo.protodata.zst/buffer-32 8000 133408 ns/op 0.01 MB/s 303786 B/op 30 allocs/op BenchmarkDecoder_DecoderNewNoRead/geo.protodata.zst/buffer-single-32 9230 130159 ns/op 0.01 MB/s 301251 B/op 24 allocs/op BenchmarkDecoder_DecoderNewNoRead/plrabn12.txt.zst/stream-32 3632 296785 ns/op 0.00 MB/s 1049748 B/op 37 allocs/op BenchmarkDecoder_DecoderNewNoRead/plrabn12.txt.zst/stream-single-32 1263639 945.8 ns/op 1.06 MB/s 1896 B/op 8 allocs/op BenchmarkDecoder_DecoderNewNoRead/plrabn12.txt.zst/buffer-32 1108 1051663 ns/op 0.00 MB/s 740722 B/op 30 allocs/op BenchmarkDecoder_DecoderNewNoRead/plrabn12.txt.zst/buffer-single-32 1128 1042940 ns/op 0.00 MB/s 738178 B/op 24 allocs/op BenchmarkDecoder_DecoderNewNoRead/lcet10.txt.zst/stream-32 4212 264847 ns/op 0.00 MB/s 973559 B/op 37 allocs/op BenchmarkDecoder_DecoderNewNoRead/lcet10.txt.zst/stream-single-32 1324858 898.7 ns/op 1.11 MB/s 1896 B/op 8 allocs/op BenchmarkDecoder_DecoderNewNoRead/lcet10.txt.zst/buffer-32 1470 801395 ns/op 0.00 MB/s 677042 B/op 30 allocs/op BenchmarkDecoder_DecoderNewNoRead/lcet10.txt.zst/buffer-single-32 1501 795344 ns/op 0.00 MB/s 674519 B/op 24 allocs/op BenchmarkDecoder_DecoderNewNoRead/asyoulik.txt.zst/stream-32 8235 157740 ns/op 0.01 MB/s 417782 B/op 35 allocs/op BenchmarkDecoder_DecoderNewNoRead/asyoulik.txt.zst/stream-single-32 1314586 911.5 ns/op 1.10 MB/s 1896 B/op 8 allocs/op BenchmarkDecoder_DecoderNewNoRead/asyoulik.txt.zst/buffer-32 3868 306632 ns/op 0.00 MB/s 379500 B/op 30 allocs/op BenchmarkDecoder_DecoderNewNoRead/asyoulik.txt.zst/buffer-single-32 3829 303607 ns/op 0.00 MB/s 376967 B/op 24 allocs/op BenchmarkDecoder_DecoderNewNoRead/alice29.txt.zst/stream-32 7500 179613 ns/op 0.01 MB/s 534965 B/op 36 allocs/op BenchmarkDecoder_DecoderNewNoRead/alice29.txt.zst/stream-single-32 1324558 908.0 ns/op 1.10 MB/s 1896 B/op 8 allocs/op BenchmarkDecoder_DecoderNewNoRead/alice29.txt.zst/buffer-32 3234 355589 ns/op 0.00 MB/s 402568 B/op 32 allocs/op BenchmarkDecoder_DecoderNewNoRead/alice29.txt.zst/buffer-single-32 3325 351937 ns/op 0.00 MB/s 400027 B/op 26 allocs/op BenchmarkDecoder_DecoderNewNoRead/html_x_4.zst/stream-32 9224 131240 ns/op 0.01 MB/s 612563 B/op 36 allocs/op BenchmarkDecoder_DecoderNewNoRead/html_x_4.zst/stream-single-32 1297621 914.3 ns/op 1.09 MB/s 1896 B/op 8 allocs/op BenchmarkDecoder_DecoderNewNoRead/html_x_4.zst/buffer-32 3514 317832 ns/op 0.00 MB/s 601999 B/op 27 allocs/op BenchmarkDecoder_DecoderNewNoRead/html_x_4.zst/buffer-single-32 3790 314895 ns/op 0.00 MB/s 599501 B/op 22 allocs/op BenchmarkDecoder_DecoderNewNoRead/paper-100k.pdf.zst/stream-32 21548 55774 ns/op 0.02 MB/s 218649 B/op 33 allocs/op BenchmarkDecoder_DecoderNewNoRead/paper-100k.pdf.zst/stream-single-32 1258678 950.9 ns/op 1.05 MB/s 1896 B/op 8 allocs/op BenchmarkDecoder_DecoderNewNoRead/paper-100k.pdf.zst/buffer-32 20197 60585 ns/op 0.02 MB/s 323397 B/op 21 allocs/op BenchmarkDecoder_DecoderNewNoRead/paper-100k.pdf.zst/buffer-single-32 21322 57519 ns/op 0.02 MB/s 320867 B/op 15 allocs/op BenchmarkDecoder_DecoderNewNoRead/fireworks.jpeg.zst/stream-32 26732 44428 ns/op 0.02 MB/s 199431 B/op 31 allocs/op BenchmarkDecoder_DecoderNewNoRead/fireworks.jpeg.zst/stream-single-32 1252455 942.8 ns/op 1.06 MB/s 1896 B/op 8 allocs/op BenchmarkDecoder_DecoderNewNoRead/fireworks.jpeg.zst/buffer-32 28455 43892 ns/op 0.02 MB/s 266064 B/op 16 allocs/op BenchmarkDecoder_DecoderNewNoRead/fireworks.jpeg.zst/buffer-single-32 27884 40087 ns/op 0.02 MB/s 263544 B/op 10 allocs/op BenchmarkDecoder_DecoderNewNoRead/urls.10K.zst/stream-32 4940 235695 ns/op 0.00 MB/s 1056938 B/op 37 allocs/op BenchmarkDecoder_DecoderNewNoRead/urls.10K.zst/stream-single-32 1315772 906.6 ns/op 1.10 MB/s 1896 B/op 8 allocs/op BenchmarkDecoder_DecoderNewNoRead/urls.10K.zst/buffer-32 1176 1010317 ns/op 0.00 MB/s 953690 B/op 30 allocs/op BenchmarkDecoder_DecoderNewNoRead/urls.10K.zst/buffer-single-32 1196 1003813 ns/op 0.00 MB/s 951174 B/op 24 allocs/op BenchmarkDecoder_DecoderNewNoRead/html.zst/stream-32 14635 82833 ns/op 0.01 MB/s 222690 B/op 34 allocs/op BenchmarkDecoder_DecoderNewNoRead/html.zst/stream-single-32 1286979 924.4 ns/op 1.08 MB/s 1896 B/op 8 allocs/op BenchmarkDecoder_DecoderNewNoRead/html.zst/buffer-32 9231 126209 ns/op 0.01 MB/s 272812 B/op 30 allocs/op BenchmarkDecoder_DecoderNewNoRead/html.zst/buffer-single-32 9384 124360 ns/op 0.01 MB/s 270286 B/op 24 allocs/op BenchmarkDecoder_DecoderNewNoRead/comp-data.bin.zst/stream-32 56230 21039 ns/op 0.05 MB/s 16200 B/op 31 allocs/op BenchmarkDecoder_DecoderNewNoRead/comp-data.bin.zst/stream-single-32 1240980 948.6 ns/op 1.05 MB/s 1896 B/op 8 allocs/op BenchmarkDecoder_DecoderNewNoRead/comp-data.bin.zst/buffer-32 63855 18989 ns/op 0.05 MB/s 46079 B/op 29 allocs/op BenchmarkDecoder_DecoderNewNoRead/comp-data.bin.zst/buffer-single-32 69026 17481 ns/op 0.06 MB/s 43553 B/op 23 allocs/op PASS ok github.com/klauspost/compress/zstd 74.269s ``` --- zstd/decoder_test.go | 133 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 133 insertions(+) diff --git a/zstd/decoder_test.go b/zstd/decoder_test.go index e9c7203487..ce37a768e6 100644 --- a/zstd/decoder_test.go +++ b/zstd/decoder_test.go @@ -1239,6 +1239,139 @@ func BenchmarkDecoder_DecoderSmall(b *testing.B) { } } +func BenchmarkDecoder_DecoderReset(b *testing.B) { + zr := testCreateZipReader("testdata/benchdecoder.zip", b) + dec, err := NewReader(nil, WithDecodeBuffersBelow(0)) + if err != nil { + b.Fatal(err) + return + } + defer dec.Close() + bench := func(name string, b *testing.B, opts []DOption, in, want []byte) { + b.Helper() + buf := &bytesReader{Reader: bytes.NewReader(in), buf: in} + dec, err := NewReader(nil, opts...) + if err != nil { + b.Fatal(err) + return + } + defer dec.Close() + b.Run(name, func(b *testing.B) { + b.SetBytes(1) + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + buf.Reset(in) + err = dec.Reset(buf) + if err != nil { + b.Fatal(err) + } + } + }) + } + for _, tt := range zr.File { + if !strings.HasSuffix(tt.Name, ".zst") { + continue + } + b.Run(tt.Name, func(b *testing.B) { + r, err := tt.Open() + if err != nil { + b.Fatal(err) + } + defer r.Close() + in, err := io.ReadAll(r) + if err != nil { + b.Fatal(err) + } + + got, err := dec.DecodeAll(in, nil) + if err != nil { + b.Fatal(err) + } + // Disable buffers: + bench("stream", b, []DOption{WithDecodeBuffersBelow(0)}, in, got) + bench("stream-single", b, []DOption{WithDecodeBuffersBelow(0), WithDecoderConcurrency(1)}, in, got) + // Force buffers: + bench("buffer", b, []DOption{WithDecodeBuffersBelow(1 << 30)}, in, got) + bench("buffer-single", b, []DOption{WithDecodeBuffersBelow(1 << 30), WithDecoderConcurrency(1)}, in, got) + }) + } +} + +type bytesReader struct { + *bytes.Reader + buf []byte +} + +func (b *bytesReader) Bytes() []byte { + n := b.Reader.Len() + if n > len(b.buf) { + panic("buffer mismatch") + } + return b.buf[len(b.buf)-n:] +} + +func (b *bytesReader) Reset(data []byte) { + b.buf = data + b.Reader.Reset(data) +} + +func BenchmarkDecoder_DecoderNewNoRead(b *testing.B) { + zr := testCreateZipReader("testdata/benchdecoder.zip", b) + dec, err := NewReader(nil) + if err != nil { + b.Fatal(err) + return + } + defer dec.Close() + + bench := func(name string, b *testing.B, opts []DOption, in, want []byte) { + b.Helper() + b.Run(name, func(b *testing.B) { + buf := &bytesReader{Reader: bytes.NewReader(in), buf: in} + b.SetBytes(1) + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + buf.Reset(in) + dec, err := NewReader(buf, opts...) + if err != nil { + b.Fatal(err) + return + } + dec.Close() + } + }) + } + for _, tt := range zr.File { + if !strings.HasSuffix(tt.Name, ".zst") { + continue + } + b.Run(tt.Name, func(b *testing.B) { + r, err := tt.Open() + if err != nil { + b.Fatal(err) + } + defer r.Close() + in, err := io.ReadAll(r) + if err != nil { + b.Fatal(err) + } + + got, err := dec.DecodeAll(in, nil) + if err != nil { + b.Fatal(err) + } + // Disable buffers: + bench("stream", b, []DOption{WithDecodeBuffersBelow(0)}, in, got) + bench("stream-single", b, []DOption{WithDecodeBuffersBelow(0), WithDecoderConcurrency(1)}, in, got) + // Force buffers: + bench("buffer", b, []DOption{WithDecodeBuffersBelow(1 << 30)}, in, got) + bench("buffer-single", b, []DOption{WithDecodeBuffersBelow(1 << 30), WithDecoderConcurrency(1)}, in, got) + }) + } +} + func BenchmarkDecoder_DecodeAll(b *testing.B) { zr := testCreateZipReader("testdata/benchdecoder.zip", b) dec, err := NewReader(nil, WithDecoderConcurrency(1))