diff --git a/encoding.go b/encoding.go index 839f89d..f72f6e4 100644 --- a/encoding.go +++ b/encoding.go @@ -92,6 +92,8 @@ func (g *gzipEncoder) Encode(rc io.Reader) (*bytes.Buffer, error) { }() buf := g.bufferPool.Get().(*bytes.Buffer) + defer g.bufferPool.Put(buf) + buf.Reset() w.writer.Reset(buf) diff --git a/encoding_bench_test.go b/encoding_bench_test.go new file mode 100644 index 0000000..fbf2940 --- /dev/null +++ b/encoding_bench_test.go @@ -0,0 +1,148 @@ +package meilisearch + +import ( + "bytes" + "encoding/json" + "testing" +) + +func BenchmarkGzipEncoder(b *testing.B) { + encoder := newEncoding(GzipEncoding, DefaultCompression) + data := bytes.NewReader(make([]byte, 1024*1024)) // 1 MB of data + b.ResetTimer() + b.ReportAllocs() + + for i := 0; i < b.N; i++ { + buf, err := encoder.Encode(data) + if err != nil { + b.Fatalf("Encode failed: %v", err) + } + _ = buf + } +} + +func BenchmarkDeflateEncoder(b *testing.B) { + encoder := newEncoding(DeflateEncoding, DefaultCompression) + data := bytes.NewReader(make([]byte, 1024*1024)) // 1 MB of data + b.ResetTimer() + b.ReportAllocs() + + for i := 0; i < b.N; i++ { + buf, err := encoder.Encode(data) + if err != nil { + b.Fatalf("Encode failed: %v", err) + } + _ = buf + } +} + +func BenchmarkBrotliEncoder(b *testing.B) { + encoder := newEncoding(BrotliEncoding, DefaultCompression) + data := bytes.NewReader(make([]byte, 1024*1024)) // 1 MB of data + b.ResetTimer() + b.ReportAllocs() + + for i := 0; i < b.N; i++ { + buf, err := encoder.Encode(data) + if err != nil { + b.Fatalf("Encode failed: %v", err) + } + _ = buf + } +} + +func BenchmarkGzipDecoder(b *testing.B) { + encoder := newEncoding(GzipEncoding, DefaultCompression) + + // Prepare a valid JSON input + data := map[string]interface{}{ + "key1": "value1", + "key2": 12345, + "key3": []string{"item1", "item2", "item3"}, + } + jsonData, err := json.Marshal(data) + if err != nil { + b.Fatalf("JSON marshal failed: %v", err) + } + + // Encode the valid JSON data + input := bytes.NewReader(jsonData) + encoded, err := encoder.Encode(input) + if err != nil { + b.Fatalf("Encode failed: %v", err) + } + + b.ResetTimer() + b.ReportAllocs() + + for i := 0; i < b.N; i++ { + var result map[string]interface{} + if err := encoder.Decode(encoded.Bytes(), &result); err != nil { + b.Fatalf("Decode failed: %v", err) + } + } +} + +func BenchmarkFlateDecoder(b *testing.B) { + encoder := newEncoding(DeflateEncoding, DefaultCompression) + + // Prepare valid JSON input + data := map[string]interface{}{ + "key1": "value1", + "key2": 12345, + "key3": []string{"item1", "item2", "item3"}, + } + jsonData, err := json.Marshal(data) + if err != nil { + b.Fatalf("JSON marshal failed: %v", err) + } + + // Encode the valid JSON data + input := bytes.NewReader(jsonData) + encoded, err := encoder.Encode(input) + if err != nil { + b.Fatalf("Encode failed: %v", err) + } + + b.ResetTimer() + b.ReportAllocs() + + for i := 0; i < b.N; i++ { + var result map[string]interface{} + if err := encoder.Decode(encoded.Bytes(), &result); err != nil { + b.Fatalf("Decode failed: %v", err) + } + } +} + +func BenchmarkBrotliDecoder(b *testing.B) { + encoder := newEncoding(BrotliEncoding, DefaultCompression) + + // Prepare valid JSON input + data := map[string]interface{}{ + "key1": "value1", + "key2": 12345, + "key3": []string{"item1", "item2", "item3"}, + } + jsonData, err := json.Marshal(data) + if err != nil { + b.Fatalf("JSON marshal failed: %v", err) + } + + // Encode the valid JSON data + input := bytes.NewReader(jsonData) + encoded, err := encoder.Encode(input) + if err != nil { + b.Fatalf("Encode failed: %v", err) + } + + b.ResetTimer() + b.ReportAllocs() + + for i := 0; i < b.N; i++ { + var result map[string]interface{} + if err := encoder.Decode(encoded.Bytes(), &result); err != nil { + b.Fatalf("Decode failed: %v", err) + } + } +} diff --git a/meilisearch.go b/meilisearch.go index 6445789..f306b9c 100644 --- a/meilisearch.go +++ b/meilisearch.go @@ -49,23 +49,23 @@ func Connect(host string, options ...Option) (ServiceManager, error) { return meili, nil } -func (m *meilisearch) GetServiceReader() ServiceReader { +func (m *meilisearch) ServiceReader() ServiceReader { return m } -func (m *meilisearch) GetTaskManager() TaskManager { +func (m *meilisearch) TaskManager() TaskManager { return m } -func (m *meilisearch) GetTaskReader() TaskReader { +func (m *meilisearch) TaskReader() TaskReader { return m } -func (m *meilisearch) GetKeyManager() KeyManager { +func (m *meilisearch) KeyManager() KeyManager { return m } -func (m *meilisearch) GetKeyReader() KeyReader { +func (m *meilisearch) KeyReader() KeyReader { return m } diff --git a/meilisearch_interface.go b/meilisearch_interface.go index 5af9e88..1aa8d1d 100644 --- a/meilisearch_interface.go +++ b/meilisearch_interface.go @@ -10,11 +10,13 @@ type ServiceManager interface { KeyManager TaskManager - GetServiceReader() ServiceReader - GetTaskManager() TaskManager - GetTaskReader() TaskReader - GetKeyManager() KeyManager - GetKeyReader() KeyReader + ServiceReader() ServiceReader + + TaskManager() TaskManager + TaskReader() TaskReader + + KeyManager() KeyManager + KeyReader() KeyReader // CreateIndex creates a new index. CreateIndex(config *IndexConfig) (*TaskInfo, error) diff --git a/meilisearch_test.go b/meilisearch_test.go index 8dc8edb..6983da2 100644 --- a/meilisearch_test.go +++ b/meilisearch_test.go @@ -2335,9 +2335,9 @@ func Test_CreateSnapshot(t *testing.T) { func TestGetServiceManagerAndReaders(t *testing.T) { c := setup(t, "") - require.NotNil(t, c.GetServiceReader()) - require.NotNil(t, c.GetTaskManager()) - require.NotNil(t, c.GetTaskReader()) - require.NotNil(t, c.GetKeyManager()) - require.NotNil(t, c.GetKeyReader()) + require.NotNil(t, c.ServiceReader()) + require.NotNil(t, c.TaskManager()) + require.NotNil(t, c.TaskReader()) + require.NotNil(t, c.KeyManager()) + require.NotNil(t, c.KeyReader()) }