go/src/compress/flate/reader_test.go

99 lines
2.3 KiB
Go
Raw Normal View History

// Copyright 2012 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package flate
import (
"bytes"
"io"
"io/ioutil"
"runtime"
"strings"
"testing"
)
func TestNlitOutOfRange(t *testing.T) {
// Trying to decode this bogus flate data, which has a Huffman table
// with nlit=288, should not panic.
io.Copy(ioutil.Discard, NewReader(strings.NewReader(
"\xfc\xfe\x36\xe7\x5e\x1c\xef\xb3\x55\x58\x77\xb6\x56\xb5\x43\xf4"+
"\x6f\xf2\xd2\xe6\x3d\x99\xa0\x85\x8c\x48\xeb\xf8\xda\x83\x04\x2a"+
"\x75\xc4\xf8\x0f\x12\x11\xb9\xb4\x4b\x09\xa0\xbe\x8b\x91\x4c")))
}
var suites = []struct{ name, file string }{
compress/flate: benchmark some English text, not just the digits of e. The testdata/e.txt input is repeated on the longer benchmarks, but the length of that data is less than flate's window size, so the numbers are essentially measuring the performance of a trivial compression. A follow-up CL will add more data to testdata/e.txt. Sample output on my laptop (linux, amd64): BenchmarkDecodeDigitsSpeed1e4 5000 603153 ns/op 16.58 MB/s BenchmarkDecodeDigitsSpeed1e5 1000 1465602 ns/op 68.23 MB/s BenchmarkDecodeDigitsSpeed1e6 200 8036050 ns/op 124.44 MB/s BenchmarkDecodeDigitsDefault1e4 5000 581796 ns/op 17.19 MB/s BenchmarkDecodeDigitsDefault1e5 2000 846653 ns/op 118.11 MB/s BenchmarkDecodeDigitsDefault1e6 500 3385782 ns/op 295.35 MB/s BenchmarkDecodeDigitsCompress1e4 5000 581180 ns/op 17.21 MB/s BenchmarkDecodeDigitsCompress1e5 2000 846209 ns/op 118.17 MB/s BenchmarkDecodeDigitsCompress1e6 500 3386174 ns/op 295.32 MB/s BenchmarkDecodeTwainSpeed1e4 5000 643563 ns/op 15.54 MB/s BenchmarkDecodeTwainSpeed1e5 500 5418408 ns/op 18.46 MB/s BenchmarkDecodeTwainSpeed1e6 50 52277520 ns/op 19.13 MB/s BenchmarkDecodeTwainDefault1e4 5000 583551 ns/op 17.14 MB/s BenchmarkDecodeTwainDefault1e5 500 4443428 ns/op 22.51 MB/s BenchmarkDecodeTwainDefault1e6 50 41862080 ns/op 23.89 MB/s BenchmarkDecodeTwainCompress1e4 5000 583490 ns/op 17.14 MB/s BenchmarkDecodeTwainCompress1e5 500 4426356 ns/op 22.59 MB/s BenchmarkDecodeTwainCompress1e6 50 41657940 ns/op 24.01 MB/s BenchmarkEncodeDigitsSpeed1e4 2000 1230907 ns/op 8.12 MB/s BenchmarkEncodeDigitsSpeed1e5 1000 2319129 ns/op 43.12 MB/s BenchmarkEncodeDigitsSpeed1e6 100 12378950 ns/op 80.78 MB/s BenchmarkEncodeDigitsDefault1e4 1000 1597865 ns/op 6.26 MB/s BenchmarkEncodeDigitsDefault1e5 500 3163458 ns/op 31.61 MB/s BenchmarkEncodeDigitsDefault1e6 100 18770240 ns/op 53.28 MB/s BenchmarkEncodeDigitsCompress1e4 1000 1603461 ns/op 6.24 MB/s BenchmarkEncodeDigitsCompress1e5 500 3168766 ns/op 31.56 MB/s BenchmarkEncodeDigitsCompress1e6 100 18855830 ns/op 53.03 MB/s BenchmarkEncodeTwainSpeed1e4 1000 1338049 ns/op 7.47 MB/s BenchmarkEncodeTwainSpeed1e5 500 7341622 ns/op 13.62 MB/s BenchmarkEncodeTwainSpeed1e6 50 67484600 ns/op 14.82 MB/s BenchmarkEncodeTwainDefault1e4 1000 1778399 ns/op 5.62 MB/s BenchmarkEncodeTwainDefault1e5 100 23261810 ns/op 4.30 MB/s BenchmarkEncodeTwainDefault1e6 10 243533600 ns/op 4.11 MB/s BenchmarkEncodeTwainCompress1e4 1000 1795469 ns/op 5.57 MB/s BenchmarkEncodeTwainCompress1e5 50 29447140 ns/op 3.40 MB/s BenchmarkEncodeTwainCompress1e6 5 321686800 ns/op 3.11 MB/s ok compress/flate 89.246s R=rsc, r CC=golang-dev https://golang.org/cl/6195055
2012-05-09 08:57:54 +10:00
// Digits is the digits of the irrational number e. Its decimal representation
// does not repeat, but there are only 10 possible digits, so it should be
compress/flate: benchmark some English text, not just the digits of e. The testdata/e.txt input is repeated on the longer benchmarks, but the length of that data is less than flate's window size, so the numbers are essentially measuring the performance of a trivial compression. A follow-up CL will add more data to testdata/e.txt. Sample output on my laptop (linux, amd64): BenchmarkDecodeDigitsSpeed1e4 5000 603153 ns/op 16.58 MB/s BenchmarkDecodeDigitsSpeed1e5 1000 1465602 ns/op 68.23 MB/s BenchmarkDecodeDigitsSpeed1e6 200 8036050 ns/op 124.44 MB/s BenchmarkDecodeDigitsDefault1e4 5000 581796 ns/op 17.19 MB/s BenchmarkDecodeDigitsDefault1e5 2000 846653 ns/op 118.11 MB/s BenchmarkDecodeDigitsDefault1e6 500 3385782 ns/op 295.35 MB/s BenchmarkDecodeDigitsCompress1e4 5000 581180 ns/op 17.21 MB/s BenchmarkDecodeDigitsCompress1e5 2000 846209 ns/op 118.17 MB/s BenchmarkDecodeDigitsCompress1e6 500 3386174 ns/op 295.32 MB/s BenchmarkDecodeTwainSpeed1e4 5000 643563 ns/op 15.54 MB/s BenchmarkDecodeTwainSpeed1e5 500 5418408 ns/op 18.46 MB/s BenchmarkDecodeTwainSpeed1e6 50 52277520 ns/op 19.13 MB/s BenchmarkDecodeTwainDefault1e4 5000 583551 ns/op 17.14 MB/s BenchmarkDecodeTwainDefault1e5 500 4443428 ns/op 22.51 MB/s BenchmarkDecodeTwainDefault1e6 50 41862080 ns/op 23.89 MB/s BenchmarkDecodeTwainCompress1e4 5000 583490 ns/op 17.14 MB/s BenchmarkDecodeTwainCompress1e5 500 4426356 ns/op 22.59 MB/s BenchmarkDecodeTwainCompress1e6 50 41657940 ns/op 24.01 MB/s BenchmarkEncodeDigitsSpeed1e4 2000 1230907 ns/op 8.12 MB/s BenchmarkEncodeDigitsSpeed1e5 1000 2319129 ns/op 43.12 MB/s BenchmarkEncodeDigitsSpeed1e6 100 12378950 ns/op 80.78 MB/s BenchmarkEncodeDigitsDefault1e4 1000 1597865 ns/op 6.26 MB/s BenchmarkEncodeDigitsDefault1e5 500 3163458 ns/op 31.61 MB/s BenchmarkEncodeDigitsDefault1e6 100 18770240 ns/op 53.28 MB/s BenchmarkEncodeDigitsCompress1e4 1000 1603461 ns/op 6.24 MB/s BenchmarkEncodeDigitsCompress1e5 500 3168766 ns/op 31.56 MB/s BenchmarkEncodeDigitsCompress1e6 100 18855830 ns/op 53.03 MB/s BenchmarkEncodeTwainSpeed1e4 1000 1338049 ns/op 7.47 MB/s BenchmarkEncodeTwainSpeed1e5 500 7341622 ns/op 13.62 MB/s BenchmarkEncodeTwainSpeed1e6 50 67484600 ns/op 14.82 MB/s BenchmarkEncodeTwainDefault1e4 1000 1778399 ns/op 5.62 MB/s BenchmarkEncodeTwainDefault1e5 100 23261810 ns/op 4.30 MB/s BenchmarkEncodeTwainDefault1e6 10 243533600 ns/op 4.11 MB/s BenchmarkEncodeTwainCompress1e4 1000 1795469 ns/op 5.57 MB/s BenchmarkEncodeTwainCompress1e5 50 29447140 ns/op 3.40 MB/s BenchmarkEncodeTwainCompress1e6 5 321686800 ns/op 3.11 MB/s ok compress/flate 89.246s R=rsc, r CC=golang-dev https://golang.org/cl/6195055
2012-05-09 08:57:54 +10:00
// reasonably compressible.
{"Digits", "../testdata/e.txt"},
compress: reduce copies of new text for compression testing The previous book was 387 KiB decompressed and 119 KiB compressed, the new book is 567 KiB decompressed and 132 KiB compressed. Overall, this change will reduce the release binary size by 196 KiB. The new book will allow for slightly more extensive compression testing with a larger text. Command to run the benchmark tests used with benchstat: `../bin/go test -run='^$' -count=4 -bench=. compress/bzip2 compress/flate` When running the benchmarks locally, changed "Newton" to "Twain" and filtered the tests with the -bench flag to include only those which were relevant to these changes. benchstat results below: name old time/op new time/op delta DecodeTwain-8 19.6ms ± 2% 24.1ms ± 1% +23.04% (p=0.029 n=4+4) Decode/Twain/Huffman/1e4-8 140µs ± 3% 139µs ± 5% ~ (p=0.886 n=4+4) Decode/Twain/Huffman/1e5-8 1.27ms ± 3% 1.26ms ± 1% ~ (p=1.000 n=4+4) Decode/Twain/Huffman/1e6-8 12.4ms ± 0% 13.2ms ± 1% +6.42% (p=0.029 n=4+4) Decode/Twain/Speed/1e4-8 133µs ± 1% 123µs ± 1% -7.35% (p=0.029 n=4+4) Decode/Twain/Speed/1e5-8 1.20ms ± 0% 1.02ms ± 3% -15.32% (p=0.029 n=4+4) Decode/Twain/Speed/1e6-8 12.0ms ± 2% 10.1ms ± 3% -15.89% (p=0.029 n=4+4) Decode/Twain/Default/1e4-8 131µs ± 6% 108µs ± 5% -17.84% (p=0.029 n=4+4) Decode/Twain/Default/1e5-8 1.06ms ± 2% 0.80ms ± 1% -24.97% (p=0.029 n=4+4) Decode/Twain/Default/1e6-8 10.0ms ± 3% 8.0ms ± 3% -20.06% (p=0.029 n=4+4) Decode/Twain/Compression/1e4-8 128µs ± 4% 115µs ± 4% -9.70% (p=0.029 n=4+4) Decode/Twain/Compression/1e5-8 1.04ms ± 2% 0.83ms ± 4% -20.37% (p=0.029 n=4+4) Decode/Twain/Compression/1e6-8 10.4ms ± 4% 8.1ms ± 5% -22.25% (p=0.029 n=4+4) Encode/Twain/Huffman/1e4-8 55.7µs ± 2% 55.6µs ± 1% ~ (p=1.000 n=4+4) Encode/Twain/Huffman/1e5-8 441µs ± 0% 435µs ± 2% ~ (p=0.343 n=4+4) Encode/Twain/Huffman/1e6-8 4.31ms ± 4% 4.30ms ± 4% ~ (p=0.886 n=4+4) Encode/Twain/Speed/1e4-8 193µs ± 1% 166µs ± 2% -14.09% (p=0.029 n=4+4) Encode/Twain/Speed/1e5-8 1.54ms ± 1% 1.22ms ± 1% -20.53% (p=0.029 n=4+4) Encode/Twain/Speed/1e6-8 15.3ms ± 1% 12.2ms ± 3% -20.62% (p=0.029 n=4+4) Encode/Twain/Default/1e4-8 393µs ± 1% 390µs ± 1% ~ (p=0.114 n=4+4) Encode/Twain/Default/1e5-8 6.12ms ± 4% 6.02ms ± 5% ~ (p=0.486 n=4+4) Encode/Twain/Default/1e6-8 69.4ms ± 5% 59.0ms ± 4% -15.07% (p=0.029 n=4+4) Encode/Twain/Compression/1e4-8 423µs ± 2% 379µs ± 2% -10.34% (p=0.029 n=4+4) Encode/Twain/Compression/1e5-8 7.00ms ± 1% 7.88ms ± 3% +12.49% (p=0.029 n=4+4) Encode/Twain/Compression/1e6-8 76.6ms ± 5% 80.9ms ± 3% ~ (p=0.114 n=4+4) name old speed new speed delta DecodeTwain-8 19.8MB/s ± 2% 23.6MB/s ± 1% +18.84% (p=0.029 n=4+4) Decode/Twain/Huffman/1e4-8 71.7MB/s ± 3% 72.1MB/s ± 6% ~ (p=0.943 n=4+4) Decode/Twain/Huffman/1e5-8 78.8MB/s ± 3% 79.5MB/s ± 1% ~ (p=1.000 n=4+4) Decode/Twain/Huffman/1e6-8 80.5MB/s ± 0% 75.6MB/s ± 1% -6.03% (p=0.029 n=4+4) Decode/Twain/Speed/1e4-8 75.2MB/s ± 1% 81.2MB/s ± 1% +7.93% (p=0.029 n=4+4) Decode/Twain/Speed/1e5-8 83.4MB/s ± 0% 98.6MB/s ± 3% +18.16% (p=0.029 n=4+4) Decode/Twain/Speed/1e6-8 83.6MB/s ± 2% 99.5MB/s ± 3% +18.91% (p=0.029 n=4+4) Decode/Twain/Default/1e4-8 76.3MB/s ± 6% 92.8MB/s ± 4% +21.62% (p=0.029 n=4+4) Decode/Twain/Default/1e5-8 94.4MB/s ± 3% 125.7MB/s ± 1% +33.24% (p=0.029 n=4+4) Decode/Twain/Default/1e6-8 100MB/s ± 3% 125MB/s ± 3% +25.12% (p=0.029 n=4+4) Decode/Twain/Compression/1e4-8 78.4MB/s ± 4% 86.8MB/s ± 4% +10.73% (p=0.029 n=4+4) Decode/Twain/Compression/1e5-8 95.7MB/s ± 2% 120.3MB/s ± 4% +25.65% (p=0.029 n=4+4) Decode/Twain/Compression/1e6-8 96.4MB/s ± 4% 124.0MB/s ± 5% +28.64% (p=0.029 n=4+4) Encode/Twain/Huffman/1e4-8 179MB/s ± 2% 180MB/s ± 1% ~ (p=1.000 n=4+4) Encode/Twain/Huffman/1e5-8 227MB/s ± 0% 230MB/s ± 2% ~ (p=0.343 n=4+4) Encode/Twain/Huffman/1e6-8 232MB/s ± 4% 233MB/s ± 4% ~ (p=0.886 n=4+4) Encode/Twain/Speed/1e4-8 51.8MB/s ± 1% 60.4MB/s ± 2% +16.43% (p=0.029 n=4+4) Encode/Twain/Speed/1e5-8 65.1MB/s ± 1% 81.9MB/s ± 1% +25.83% (p=0.029 n=4+4) Encode/Twain/Speed/1e6-8 65.2MB/s ± 1% 82.2MB/s ± 3% +26.00% (p=0.029 n=4+4) Encode/Twain/Default/1e4-8 25.4MB/s ± 1% 25.6MB/s ± 1% ~ (p=0.114 n=4+4) Encode/Twain/Default/1e5-8 16.4MB/s ± 4% 16.6MB/s ± 5% ~ (p=0.486 n=4+4) Encode/Twain/Default/1e6-8 14.4MB/s ± 6% 17.0MB/s ± 4% +17.67% (p=0.029 n=4+4) Encode/Twain/Compression/1e4-8 23.6MB/s ± 2% 26.4MB/s ± 2% +11.54% (p=0.029 n=4+4) Encode/Twain/Compression/1e5-8 14.3MB/s ± 1% 12.7MB/s ± 3% -11.08% (p=0.029 n=4+4) Encode/Twain/Compression/1e6-8 13.1MB/s ± 4% 12.4MB/s ± 3% ~ (p=0.114 n=4+4) name old alloc/op new alloc/op delta DecodeTwain-8 3.63MB ± 0% 3.63MB ± 0% +0.15% (p=0.029 n=4+4) Decode/Twain/Huffman/1e4-8 42.0kB ± 0% 41.3kB ± 0% -1.62% (p=0.029 n=4+4) Decode/Twain/Huffman/1e5-8 43.5kB ± 0% 45.1kB ± 0% +3.74% (p=0.029 n=4+4) Decode/Twain/Huffman/1e6-8 71.7kB ± 0% 80.0kB ± 0% +11.55% (p=0.029 n=4+4) Decode/Twain/Speed/1e4-8 41.2kB ± 0% 41.3kB ± 0% ~ (p=0.286 n=4+4) Decode/Twain/Speed/1e5-8 45.1kB ± 0% 43.9kB ± 0% -2.80% (p=0.029 n=4+4) Decode/Twain/Speed/1e6-8 72.8kB ± 0% 81.3kB ± 0% +11.72% (p=0.029 n=4+4) Decode/Twain/Default/1e4-8 41.2kB ± 0% 41.2kB ± 0% -0.22% (p=0.029 n=4+4) Decode/Twain/Default/1e5-8 44.4kB ± 0% 43.0kB ± 0% -3.02% (p=0.029 n=4+4) Decode/Twain/Default/1e6-8 71.0kB ± 0% 61.8kB ± 0% -13.00% (p=0.029 n=4+4) Decode/Twain/Compression/1e4-8 41.3kB ± 0% 41.2kB ± 0% -0.29% (p=0.029 n=4+4) Decode/Twain/Compression/1e5-8 43.3kB ± 0% 43.0kB ± 0% -0.72% (p=0.029 n=4+4) Decode/Twain/Compression/1e6-8 69.1kB ± 0% 63.7kB ± 0% -7.90% (p=0.029 n=4+4) name old allocs/op new allocs/op delta DecodeTwain-8 51.0 ± 0% 51.2 ± 1% ~ (p=1.000 n=4+4) Decode/Twain/Huffman/1e4-8 15.0 ± 0% 14.0 ± 0% -6.67% (p=0.029 n=4+4) Decode/Twain/Huffman/1e5-8 20.0 ± 0% 23.0 ± 0% +15.00% (p=0.029 n=4+4) Decode/Twain/Huffman/1e6-8 134 ± 0% 161 ± 0% +20.15% (p=0.029 n=4+4) Decode/Twain/Speed/1e4-8 17.0 ± 0% 18.0 ± 0% +5.88% (p=0.029 n=4+4) Decode/Twain/Speed/1e5-8 30.0 ± 0% 31.0 ± 0% +3.33% (p=0.029 n=4+4) Decode/Twain/Speed/1e6-8 193 ± 0% 228 ± 0% +18.13% (p=0.029 n=4+4) Decode/Twain/Default/1e4-8 17.0 ± 0% 15.0 ± 0% -11.76% (p=0.029 n=4+4) Decode/Twain/Default/1e5-8 28.0 ± 0% 32.0 ± 0% +14.29% (p=0.029 n=4+4) Decode/Twain/Default/1e6-8 199 ± 0% 158 ± 0% -20.60% (p=0.029 n=4+4) Decode/Twain/Compression/1e4-8 17.0 ± 0% 15.0 ± 0% -11.76% (p=0.029 n=4+4) Decode/Twain/Compression/1e5-8 28.0 ± 0% 32.0 ± 0% +14.29% (p=0.029 n=4+4) Decode/Twain/Compression/1e6-8 196 ± 0% 150 ± 0% -23.47% (p=0.029 n=4+4) Updates #27151 Change-Id: I6c439694ed16a33bb4c63fbfb8570c7de46b4f2d Reviewed-on: https://go-review.googlesource.com/135495 Reviewed-by: Dmitri Shuralyov <dmitshur@golang.org> Reviewed-by: Joe Tsai <thebrokentoaster@gmail.com>
2018-09-14 17:07:56 -04:00
// Newton is Isaac Newtons's educational text on Opticks.
{"Newton", "../testdata/Isaac.Newton-Opticks.txt"},
compress/flate: benchmark some English text, not just the digits of e. The testdata/e.txt input is repeated on the longer benchmarks, but the length of that data is less than flate's window size, so the numbers are essentially measuring the performance of a trivial compression. A follow-up CL will add more data to testdata/e.txt. Sample output on my laptop (linux, amd64): BenchmarkDecodeDigitsSpeed1e4 5000 603153 ns/op 16.58 MB/s BenchmarkDecodeDigitsSpeed1e5 1000 1465602 ns/op 68.23 MB/s BenchmarkDecodeDigitsSpeed1e6 200 8036050 ns/op 124.44 MB/s BenchmarkDecodeDigitsDefault1e4 5000 581796 ns/op 17.19 MB/s BenchmarkDecodeDigitsDefault1e5 2000 846653 ns/op 118.11 MB/s BenchmarkDecodeDigitsDefault1e6 500 3385782 ns/op 295.35 MB/s BenchmarkDecodeDigitsCompress1e4 5000 581180 ns/op 17.21 MB/s BenchmarkDecodeDigitsCompress1e5 2000 846209 ns/op 118.17 MB/s BenchmarkDecodeDigitsCompress1e6 500 3386174 ns/op 295.32 MB/s BenchmarkDecodeTwainSpeed1e4 5000 643563 ns/op 15.54 MB/s BenchmarkDecodeTwainSpeed1e5 500 5418408 ns/op 18.46 MB/s BenchmarkDecodeTwainSpeed1e6 50 52277520 ns/op 19.13 MB/s BenchmarkDecodeTwainDefault1e4 5000 583551 ns/op 17.14 MB/s BenchmarkDecodeTwainDefault1e5 500 4443428 ns/op 22.51 MB/s BenchmarkDecodeTwainDefault1e6 50 41862080 ns/op 23.89 MB/s BenchmarkDecodeTwainCompress1e4 5000 583490 ns/op 17.14 MB/s BenchmarkDecodeTwainCompress1e5 500 4426356 ns/op 22.59 MB/s BenchmarkDecodeTwainCompress1e6 50 41657940 ns/op 24.01 MB/s BenchmarkEncodeDigitsSpeed1e4 2000 1230907 ns/op 8.12 MB/s BenchmarkEncodeDigitsSpeed1e5 1000 2319129 ns/op 43.12 MB/s BenchmarkEncodeDigitsSpeed1e6 100 12378950 ns/op 80.78 MB/s BenchmarkEncodeDigitsDefault1e4 1000 1597865 ns/op 6.26 MB/s BenchmarkEncodeDigitsDefault1e5 500 3163458 ns/op 31.61 MB/s BenchmarkEncodeDigitsDefault1e6 100 18770240 ns/op 53.28 MB/s BenchmarkEncodeDigitsCompress1e4 1000 1603461 ns/op 6.24 MB/s BenchmarkEncodeDigitsCompress1e5 500 3168766 ns/op 31.56 MB/s BenchmarkEncodeDigitsCompress1e6 100 18855830 ns/op 53.03 MB/s BenchmarkEncodeTwainSpeed1e4 1000 1338049 ns/op 7.47 MB/s BenchmarkEncodeTwainSpeed1e5 500 7341622 ns/op 13.62 MB/s BenchmarkEncodeTwainSpeed1e6 50 67484600 ns/op 14.82 MB/s BenchmarkEncodeTwainDefault1e4 1000 1778399 ns/op 5.62 MB/s BenchmarkEncodeTwainDefault1e5 100 23261810 ns/op 4.30 MB/s BenchmarkEncodeTwainDefault1e6 10 243533600 ns/op 4.11 MB/s BenchmarkEncodeTwainCompress1e4 1000 1795469 ns/op 5.57 MB/s BenchmarkEncodeTwainCompress1e5 50 29447140 ns/op 3.40 MB/s BenchmarkEncodeTwainCompress1e6 5 321686800 ns/op 3.11 MB/s ok compress/flate 89.246s R=rsc, r CC=golang-dev https://golang.org/cl/6195055
2012-05-09 08:57:54 +10:00
}
func BenchmarkDecode(b *testing.B) {
doBench(b, func(b *testing.B, buf0 []byte, level, n int) {
b.ReportAllocs()
b.StopTimer()
b.SetBytes(int64(n))
compressed := new(bytes.Buffer)
w, err := NewWriter(compressed, level)
if err != nil {
b.Fatal(err)
compress/flate: benchmark some English text, not just the digits of e. The testdata/e.txt input is repeated on the longer benchmarks, but the length of that data is less than flate's window size, so the numbers are essentially measuring the performance of a trivial compression. A follow-up CL will add more data to testdata/e.txt. Sample output on my laptop (linux, amd64): BenchmarkDecodeDigitsSpeed1e4 5000 603153 ns/op 16.58 MB/s BenchmarkDecodeDigitsSpeed1e5 1000 1465602 ns/op 68.23 MB/s BenchmarkDecodeDigitsSpeed1e6 200 8036050 ns/op 124.44 MB/s BenchmarkDecodeDigitsDefault1e4 5000 581796 ns/op 17.19 MB/s BenchmarkDecodeDigitsDefault1e5 2000 846653 ns/op 118.11 MB/s BenchmarkDecodeDigitsDefault1e6 500 3385782 ns/op 295.35 MB/s BenchmarkDecodeDigitsCompress1e4 5000 581180 ns/op 17.21 MB/s BenchmarkDecodeDigitsCompress1e5 2000 846209 ns/op 118.17 MB/s BenchmarkDecodeDigitsCompress1e6 500 3386174 ns/op 295.32 MB/s BenchmarkDecodeTwainSpeed1e4 5000 643563 ns/op 15.54 MB/s BenchmarkDecodeTwainSpeed1e5 500 5418408 ns/op 18.46 MB/s BenchmarkDecodeTwainSpeed1e6 50 52277520 ns/op 19.13 MB/s BenchmarkDecodeTwainDefault1e4 5000 583551 ns/op 17.14 MB/s BenchmarkDecodeTwainDefault1e5 500 4443428 ns/op 22.51 MB/s BenchmarkDecodeTwainDefault1e6 50 41862080 ns/op 23.89 MB/s BenchmarkDecodeTwainCompress1e4 5000 583490 ns/op 17.14 MB/s BenchmarkDecodeTwainCompress1e5 500 4426356 ns/op 22.59 MB/s BenchmarkDecodeTwainCompress1e6 50 41657940 ns/op 24.01 MB/s BenchmarkEncodeDigitsSpeed1e4 2000 1230907 ns/op 8.12 MB/s BenchmarkEncodeDigitsSpeed1e5 1000 2319129 ns/op 43.12 MB/s BenchmarkEncodeDigitsSpeed1e6 100 12378950 ns/op 80.78 MB/s BenchmarkEncodeDigitsDefault1e4 1000 1597865 ns/op 6.26 MB/s BenchmarkEncodeDigitsDefault1e5 500 3163458 ns/op 31.61 MB/s BenchmarkEncodeDigitsDefault1e6 100 18770240 ns/op 53.28 MB/s BenchmarkEncodeDigitsCompress1e4 1000 1603461 ns/op 6.24 MB/s BenchmarkEncodeDigitsCompress1e5 500 3168766 ns/op 31.56 MB/s BenchmarkEncodeDigitsCompress1e6 100 18855830 ns/op 53.03 MB/s BenchmarkEncodeTwainSpeed1e4 1000 1338049 ns/op 7.47 MB/s BenchmarkEncodeTwainSpeed1e5 500 7341622 ns/op 13.62 MB/s BenchmarkEncodeTwainSpeed1e6 50 67484600 ns/op 14.82 MB/s BenchmarkEncodeTwainDefault1e4 1000 1778399 ns/op 5.62 MB/s BenchmarkEncodeTwainDefault1e5 100 23261810 ns/op 4.30 MB/s BenchmarkEncodeTwainDefault1e6 10 243533600 ns/op 4.11 MB/s BenchmarkEncodeTwainCompress1e4 1000 1795469 ns/op 5.57 MB/s BenchmarkEncodeTwainCompress1e5 50 29447140 ns/op 3.40 MB/s BenchmarkEncodeTwainCompress1e6 5 321686800 ns/op 3.11 MB/s ok compress/flate 89.246s R=rsc, r CC=golang-dev https://golang.org/cl/6195055
2012-05-09 08:57:54 +10:00
}
for i := 0; i < n; i += len(buf0) {
if len(buf0) > n-i {
buf0 = buf0[:n-i]
}
io.Copy(w, bytes.NewReader(buf0))
}
w.Close()
buf1 := compressed.Bytes()
buf0, compressed, w = nil, nil, nil
runtime.GC()
b.StartTimer()
for i := 0; i < b.N; i++ {
io.Copy(ioutil.Discard, NewReader(bytes.NewReader(buf1)))
}
})
}
var levelTests = []struct {
name string
level int
}{
{"Huffman", HuffmanOnly},
{"Speed", BestSpeed},
{"Default", DefaultCompression},
{"Compression", BestCompression},
}
var sizes = []struct {
name string
n int
}{
{"1e4", 1e4},
{"1e5", 1e5},
{"1e6", 1e6},
}
func doBench(b *testing.B, f func(b *testing.B, buf []byte, level, n int)) {
for _, suite := range suites {
buf, err := ioutil.ReadFile(suite.file)
if err != nil {
b.Fatal(err)
}
if len(buf) == 0 {
b.Fatalf("test file %q has no data", suite.file)
}
for _, l := range levelTests {
for _, s := range sizes {
b.Run(suite.name+"/"+l.name+"/"+s.name, func(b *testing.B) {
f(b, buf, l.level, s.n)
})
}
}
}
}