diff --git a/src/pkg/compress/flate/reader_test.go b/src/pkg/compress/flate/reader_test.go index 560d7e87bbe..d6d943bd9dc 100644 --- a/src/pkg/compress/flate/reader_test.go +++ b/src/pkg/compress/flate/reader_test.go @@ -12,20 +12,47 @@ import ( "testing" ) -func benchmarkDecoder(b *testing.B, level, n int) { +const ( + digits = iota + twain +) + +var testfiles = []string{ + // Digits is the digits of the irrational number e. Its decimal representation + // does not repeat, but there are only 10 posible digits, so it should be + // reasonably compressible. + // + // TODO(nigeltao): e.txt is only 10K long, so when benchmarking 100K or 1000K + // of input, the digits are just repeated from the beginning, and flate can + // trivially compress this as a length/distance copy operation. Thus, + // BenchmarkDecodeDigitsXxx1e6 is essentially just measuring the speed of the + // forwardCopy implementation, but isn't particularly representative of real + // usage. The TODO is to replace e.txt with 100K digits, not just 10K digits, + // since that's larger than the windowSize 1<<15 (= 32768). + digits: "../testdata/e.txt", + // Twain is Project Gutenberg's edition of Mark Twain's classic English novel. + twain: "../testdata/Mark.Twain-Tom.Sawyer.txt", +} + +func benchmarkDecode(b *testing.B, testfile, level, n int) { b.StopTimer() b.SetBytes(int64(n)) - buf0, err := ioutil.ReadFile("../testdata/e.txt") + buf0, err := ioutil.ReadFile(testfiles[testfile]) if err != nil { b.Fatal(err) } - buf0 = buf0[:10000] + if len(buf0) == 0 { + b.Fatalf("test file %q has no data", testfiles[testfile]) + } compressed := new(bytes.Buffer) w, err := NewWriter(compressed, level) if err != nil { b.Fatal(err) } for i := 0; i < n; i += len(buf0) { + if len(buf0) > n-i { + buf0 = buf0[:n-i] + } io.Copy(w, bytes.NewBuffer(buf0)) } w.Close() @@ -38,38 +65,29 @@ func benchmarkDecoder(b *testing.B, level, n int) { } } -func BenchmarkDecoderBestSpeed1K(b *testing.B) { - benchmarkDecoder(b, BestSpeed, 1e4) -} +// These short names are so that gofmt doesn't break the BenchmarkXxx function +// bodies below over multiple lines. +const ( + speed = BestSpeed + default_ = DefaultCompression + compress = BestCompression +) -func BenchmarkDecoderBestSpeed10K(b *testing.B) { - benchmarkDecoder(b, BestSpeed, 1e5) -} - -func BenchmarkDecoderBestSpeed100K(b *testing.B) { - benchmarkDecoder(b, BestSpeed, 1e6) -} - -func BenchmarkDecoderDefaultCompression1K(b *testing.B) { - benchmarkDecoder(b, DefaultCompression, 1e4) -} - -func BenchmarkDecoderDefaultCompression10K(b *testing.B) { - benchmarkDecoder(b, DefaultCompression, 1e5) -} - -func BenchmarkDecoderDefaultCompression100K(b *testing.B) { - benchmarkDecoder(b, DefaultCompression, 1e6) -} - -func BenchmarkDecoderBestCompression1K(b *testing.B) { - benchmarkDecoder(b, BestCompression, 1e4) -} - -func BenchmarkDecoderBestCompression10K(b *testing.B) { - benchmarkDecoder(b, BestCompression, 1e5) -} - -func BenchmarkDecoderBestCompression100K(b *testing.B) { - benchmarkDecoder(b, BestCompression, 1e6) -} +func BenchmarkDecodeDigitsSpeed1e4(b *testing.B) { benchmarkDecode(b, digits, speed, 1e4) } +func BenchmarkDecodeDigitsSpeed1e5(b *testing.B) { benchmarkDecode(b, digits, speed, 1e5) } +func BenchmarkDecodeDigitsSpeed1e6(b *testing.B) { benchmarkDecode(b, digits, speed, 1e6) } +func BenchmarkDecodeDigitsDefault1e4(b *testing.B) { benchmarkDecode(b, digits, default_, 1e4) } +func BenchmarkDecodeDigitsDefault1e5(b *testing.B) { benchmarkDecode(b, digits, default_, 1e5) } +func BenchmarkDecodeDigitsDefault1e6(b *testing.B) { benchmarkDecode(b, digits, default_, 1e6) } +func BenchmarkDecodeDigitsCompress1e4(b *testing.B) { benchmarkDecode(b, digits, compress, 1e4) } +func BenchmarkDecodeDigitsCompress1e5(b *testing.B) { benchmarkDecode(b, digits, compress, 1e5) } +func BenchmarkDecodeDigitsCompress1e6(b *testing.B) { benchmarkDecode(b, digits, compress, 1e6) } +func BenchmarkDecodeTwainSpeed1e4(b *testing.B) { benchmarkDecode(b, twain, speed, 1e4) } +func BenchmarkDecodeTwainSpeed1e5(b *testing.B) { benchmarkDecode(b, twain, speed, 1e5) } +func BenchmarkDecodeTwainSpeed1e6(b *testing.B) { benchmarkDecode(b, twain, speed, 1e6) } +func BenchmarkDecodeTwainDefault1e4(b *testing.B) { benchmarkDecode(b, twain, default_, 1e4) } +func BenchmarkDecodeTwainDefault1e5(b *testing.B) { benchmarkDecode(b, twain, default_, 1e5) } +func BenchmarkDecodeTwainDefault1e6(b *testing.B) { benchmarkDecode(b, twain, default_, 1e6) } +func BenchmarkDecodeTwainCompress1e4(b *testing.B) { benchmarkDecode(b, twain, compress, 1e4) } +func BenchmarkDecodeTwainCompress1e5(b *testing.B) { benchmarkDecode(b, twain, compress, 1e5) } +func BenchmarkDecodeTwainCompress1e6(b *testing.B) { benchmarkDecode(b, twain, compress, 1e6) } diff --git a/src/pkg/compress/flate/writer_test.go b/src/pkg/compress/flate/writer_test.go index 52d9cda0fb9..58431774e0e 100644 --- a/src/pkg/compress/flate/writer_test.go +++ b/src/pkg/compress/flate/writer_test.go @@ -10,16 +10,21 @@ import ( "testing" ) -func benchmarkEncoder(b *testing.B, level, n int) { +func benchmarkEncoder(b *testing.B, testfile, level, n int) { b.StopTimer() b.SetBytes(int64(n)) - buf0, err := ioutil.ReadFile("../testdata/e.txt") + buf0, err := ioutil.ReadFile(testfiles[testfile]) if err != nil { b.Fatal(err) } - buf0 = buf0[:10000] + if len(buf0) == 0 { + b.Fatalf("test file %q has no data", testfiles[testfile]) + } buf1 := make([]byte, n) for i := 0; i < n; i += len(buf0) { + if len(buf0) > n-i { + buf0 = buf0[:n-i] + } copy(buf1[i:], buf0) } buf0 = nil @@ -35,38 +40,21 @@ func benchmarkEncoder(b *testing.B, level, n int) { } } -func BenchmarkEncoderBestSpeed1K(b *testing.B) { - benchmarkEncoder(b, BestSpeed, 1e4) -} - -func BenchmarkEncoderBestSpeed10K(b *testing.B) { - benchmarkEncoder(b, BestSpeed, 1e5) -} - -func BenchmarkEncoderBestSpeed100K(b *testing.B) { - benchmarkEncoder(b, BestSpeed, 1e6) -} - -func BenchmarkEncoderDefaultCompression1K(b *testing.B) { - benchmarkEncoder(b, DefaultCompression, 1e4) -} - -func BenchmarkEncoderDefaultCompression10K(b *testing.B) { - benchmarkEncoder(b, DefaultCompression, 1e5) -} - -func BenchmarkEncoderDefaultCompression100K(b *testing.B) { - benchmarkEncoder(b, DefaultCompression, 1e6) -} - -func BenchmarkEncoderBestCompression1K(b *testing.B) { - benchmarkEncoder(b, BestCompression, 1e4) -} - -func BenchmarkEncoderBestCompression10K(b *testing.B) { - benchmarkEncoder(b, BestCompression, 1e5) -} - -func BenchmarkEncoderBestCompression100K(b *testing.B) { - benchmarkEncoder(b, BestCompression, 1e6) -} +func BenchmarkEncodeDigitsSpeed1e4(b *testing.B) { benchmarkEncoder(b, digits, speed, 1e4) } +func BenchmarkEncodeDigitsSpeed1e5(b *testing.B) { benchmarkEncoder(b, digits, speed, 1e5) } +func BenchmarkEncodeDigitsSpeed1e6(b *testing.B) { benchmarkEncoder(b, digits, speed, 1e6) } +func BenchmarkEncodeDigitsDefault1e4(b *testing.B) { benchmarkEncoder(b, digits, default_, 1e4) } +func BenchmarkEncodeDigitsDefault1e5(b *testing.B) { benchmarkEncoder(b, digits, default_, 1e5) } +func BenchmarkEncodeDigitsDefault1e6(b *testing.B) { benchmarkEncoder(b, digits, default_, 1e6) } +func BenchmarkEncodeDigitsCompress1e4(b *testing.B) { benchmarkEncoder(b, digits, compress, 1e4) } +func BenchmarkEncodeDigitsCompress1e5(b *testing.B) { benchmarkEncoder(b, digits, compress, 1e5) } +func BenchmarkEncodeDigitsCompress1e6(b *testing.B) { benchmarkEncoder(b, digits, compress, 1e6) } +func BenchmarkEncodeTwainSpeed1e4(b *testing.B) { benchmarkEncoder(b, twain, speed, 1e4) } +func BenchmarkEncodeTwainSpeed1e5(b *testing.B) { benchmarkEncoder(b, twain, speed, 1e5) } +func BenchmarkEncodeTwainSpeed1e6(b *testing.B) { benchmarkEncoder(b, twain, speed, 1e6) } +func BenchmarkEncodeTwainDefault1e4(b *testing.B) { benchmarkEncoder(b, twain, default_, 1e4) } +func BenchmarkEncodeTwainDefault1e5(b *testing.B) { benchmarkEncoder(b, twain, default_, 1e5) } +func BenchmarkEncodeTwainDefault1e6(b *testing.B) { benchmarkEncoder(b, twain, default_, 1e6) } +func BenchmarkEncodeTwainCompress1e4(b *testing.B) { benchmarkEncoder(b, twain, compress, 1e4) } +func BenchmarkEncodeTwainCompress1e5(b *testing.B) { benchmarkEncoder(b, twain, compress, 1e5) } +func BenchmarkEncodeTwainCompress1e6(b *testing.B) { benchmarkEncoder(b, twain, compress, 1e6) }