zstd_test.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. // Copyright (c) 2020 Tailscale Inc & AUTHORS All rights reserved.
  2. // Use of this source code is governed by a BSD-style
  3. // license that can be found in the LICENSE file.
  4. package smallzstd
  5. import (
  6. "io/ioutil"
  7. "testing"
  8. "github.com/klauspost/compress/zstd"
  9. )
  10. func BenchmarkSmallEncoder(b *testing.B) {
  11. benchEncoder(b, func() (*zstd.Encoder, error) { return NewEncoder(nil) })
  12. }
  13. func BenchmarkSmallEncoderWithBuild(b *testing.B) {
  14. benchEncoderWithConstruction(b, func() (*zstd.Encoder, error) { return NewEncoder(nil) })
  15. }
  16. func BenchmarkStockEncoder(b *testing.B) {
  17. benchEncoder(b, func() (*zstd.Encoder, error) { return zstd.NewWriter(nil) })
  18. }
  19. func BenchmarkStockEncoderWithBuild(b *testing.B) {
  20. benchEncoderWithConstruction(b, func() (*zstd.Encoder, error) { return zstd.NewWriter(nil) })
  21. }
  22. func BenchmarkSmallDecoder(b *testing.B) {
  23. benchDecoder(b, func() (*zstd.Decoder, error) { return NewDecoder(nil) })
  24. }
  25. func BenchmarkSmallDecoderWithBuild(b *testing.B) {
  26. benchDecoderWithConstruction(b, func() (*zstd.Decoder, error) { return NewDecoder(nil) })
  27. }
  28. func BenchmarkStockDecoder(b *testing.B) {
  29. benchDecoder(b, func() (*zstd.Decoder, error) { return zstd.NewReader(nil) })
  30. }
  31. func BenchmarkStockDecoderWithBuild(b *testing.B) {
  32. benchDecoderWithConstruction(b, func() (*zstd.Decoder, error) { return zstd.NewReader(nil) })
  33. }
  34. func benchEncoder(b *testing.B, mk func() (*zstd.Encoder, error)) {
  35. b.ReportAllocs()
  36. in := testdata(b)
  37. out := make([]byte, 0, 10<<10) // 10kiB
  38. e, err := mk()
  39. if err != nil {
  40. b.Fatalf("making encoder: %v", err)
  41. }
  42. b.ResetTimer()
  43. for i := 0; i < b.N; i++ {
  44. e.EncodeAll(in, out)
  45. }
  46. }
  47. func benchEncoderWithConstruction(b *testing.B, mk func() (*zstd.Encoder, error)) {
  48. b.ReportAllocs()
  49. in := testdata(b)
  50. out := make([]byte, 0, 10<<10) // 10kiB
  51. b.ResetTimer()
  52. for i := 0; i < b.N; i++ {
  53. e, err := mk()
  54. if err != nil {
  55. b.Fatalf("making encoder: %v", err)
  56. }
  57. e.EncodeAll(in, out)
  58. }
  59. }
  60. func benchDecoder(b *testing.B, mk func() (*zstd.Decoder, error)) {
  61. b.ReportAllocs()
  62. in := compressedTestdata(b)
  63. out := make([]byte, 0, 10<<10)
  64. d, err := mk()
  65. if err != nil {
  66. b.Fatalf("creating decoder: %v", err)
  67. }
  68. b.ResetTimer()
  69. for i := 0; i < b.N; i++ {
  70. d.DecodeAll(in, out)
  71. }
  72. }
  73. func benchDecoderWithConstruction(b *testing.B, mk func() (*zstd.Decoder, error)) {
  74. b.ReportAllocs()
  75. in := compressedTestdata(b)
  76. out := make([]byte, 0, 10<<10)
  77. b.ResetTimer()
  78. for i := 0; i < b.N; i++ {
  79. d, err := mk()
  80. if err != nil {
  81. b.Fatalf("creating decoder: %v", err)
  82. }
  83. d.DecodeAll(in, out)
  84. }
  85. }
  86. func testdata(b *testing.B) []byte {
  87. b.Helper()
  88. in, err := ioutil.ReadFile("testdata")
  89. if err != nil {
  90. b.Fatalf("reading testdata: %v", err)
  91. }
  92. return in
  93. }
  94. func compressedTestdata(b *testing.B) []byte {
  95. b.Helper()
  96. uncomp := testdata(b)
  97. e, err := NewEncoder(nil)
  98. if err != nil {
  99. b.Fatalf("creating encoder: %v", err)
  100. }
  101. return e.EncodeAll(uncomp, nil)
  102. }