zstd_test.go 2.8 KB

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