44 "io"
55 "testing"
66
7- "github.com/nspcc-dev/neofs-node/pkg/core/object"
8- "github.com/nspcc-dev/neofs-node/pkg/local_object_storage/blobstor/compression"
97 "github.com/nspcc-dev/neofs-node/pkg/local_object_storage/blobstor/fstree"
108 objectSDK "github.com/nspcc-dev/neofs-sdk-go/object"
119 oid "github.com/nspcc-dev/neofs-sdk-go/object/id"
@@ -15,203 +13,121 @@ import (
1513func BenchmarkFSTree_Head (b * testing.B ) {
1614 for _ , size := range payloadSizes {
1715 b .Run (generateSizeLabel (size ), func (b * testing.B ) {
18- fsTree := fstree .New (fstree .WithPath (b .TempDir ()))
19-
20- require .NoError (b , fsTree .Open (false ))
21- require .NoError (b , fsTree .Init ())
22-
23- testReadOp (b , fsTree , fsTree .Head , "Head" , size )
16+ runReadBenchmark (b , "Head" , size )
2417 })
2518 }
2619}
2720
2821func BenchmarkFSTree_Get (b * testing.B ) {
2922 for _ , size := range payloadSizes {
3023 b .Run (generateSizeLabel (size ), func (b * testing.B ) {
31- fsTree := fstree .New (fstree .WithPath (b .TempDir ()))
32-
33- require .NoError (b , fsTree .Open (false ))
34- require .NoError (b , fsTree .Init ())
35-
36- testReadOp (b , fsTree , fsTree .Get , "Get" , size )
24+ runReadBenchmark (b , "Get" , size )
3725 })
3826 }
3927}
4028
4129func BenchmarkFSTree_GetStream (b * testing.B ) {
4230 for _ , size := range payloadSizes {
4331 b .Run (generateSizeLabel (size ), func (b * testing.B ) {
44- fsTree := fstree .New (fstree .WithPath (b .TempDir ()))
45-
46- require .NoError (b , fsTree .Open (false ))
47- require .NoError (b , fsTree .Init ())
48-
49- testGetStreamOp (b , fsTree , size )
32+ runReadBenchmark (b , "GetStream" , size )
33+
34+ b .Run ("GetStream_with_payload_read" , func (b * testing.B ) {
35+ freshFSTree := setupFSTree (b )
36+ addr := prepareSingleObject (b , freshFSTree , size )
37+
38+ b .ReportAllocs ()
39+ b .ResetTimer ()
40+ for range b .N {
41+ header , reader , err := freshFSTree .GetStream (addr )
42+ if err != nil {
43+ b .Fatal (err )
44+ }
45+ if header == nil {
46+ b .Fatal ("header is nil" )
47+ }
48+ if reader != nil {
49+ // Read all payload to simulate real usage
50+ _ , err := io .ReadAll (reader )
51+ if err != nil {
52+ b .Fatal (err )
53+ }
54+ require .NoError (b , reader .Close ())
55+ }
56+ }
57+ })
5058 })
5159 }
5260}
5361
54- func testReadOp (b * testing.B , fsTree * fstree.FSTree , read func (address oid.Address ) (* objectSDK.Object , error ),
55- name string , payloadSize int ) {
56- b .Run (name + "_regular" , func (b * testing.B ) {
57- obj := generateTestObject (payloadSize )
58- addr := object .AddressOf (obj )
59-
60- require .NoError (b , fsTree .Put (addr , obj .Marshal ()))
61- b .ReportAllocs ()
62- b .ResetTimer ()
63- for range b .N {
64- _ , err := read (addr )
65- if err != nil {
66- b .Fatal (err )
62+ func runReadBenchmark (b * testing.B , methodName string , payloadSize int ) {
63+ testRead := func (fsTree * fstree.FSTree , addr oid.Address ) {
64+ var err error
65+ switch methodName {
66+ case "Head" :
67+ _ , err = fsTree .Head (addr )
68+ case "Get" :
69+ _ , err = fsTree .Get (addr )
70+ case "GetStream" :
71+ var (
72+ header * objectSDK.Object
73+ reader io.ReadCloser
74+ )
75+ header , reader , err = fsTree .GetStream (addr )
76+ if header == nil {
77+ b .Fatal ("header is nil" )
6778 }
68- }
69- })
70-
71- b .Run (name + "_combined" , func (b * testing.B ) {
72- const numObjects = 10
73-
74- objMap := make (map [oid.Address ][]byte , numObjects )
75- addrs := make ([]oid.Address , numObjects )
76- for i := range numObjects {
77- o := generateTestObject (payloadSize )
78- objMap [object .AddressOf (o )] = o .Marshal ()
79- addrs [i ] = object .AddressOf (o )
80- }
81- require .NoError (b , fsTree .PutBatch (objMap ))
82-
83- b .ReportAllocs ()
84- b .ResetTimer ()
85- for k := range b .N {
86- _ , err := read (addrs [k % numObjects ])
87- if err != nil {
88- b .Fatal (err )
79+ if reader != nil {
80+ require .NoError (b , reader .Close ())
8981 }
9082 }
91- })
92-
93- b .Run (name + "_compressed" , func (b * testing.B ) {
94- obj := generateTestObject (payloadSize )
95- addr := object .AddressOf (obj )
96-
97- compressConfig := & compression.Config {
98- Enabled : true ,
99- }
100- require .NoError (b , compressConfig .Init ())
101- fsTree .SetCompressor (compressConfig )
102- require .NoError (b , fsTree .Put (addr , obj .Marshal ()))
103-
104- b .ReportAllocs ()
105- b .ResetTimer ()
106- for range b .N {
107- _ , err := read (addr )
108- if err != nil {
109- b .Fatal (err )
110- }
83+ if err != nil {
84+ b .Fatal (err )
11185 }
112- })
113- }
86+ }
11487
115- func testGetStreamOp (b * testing.B , fsTree * fstree.FSTree , payloadSize int ) {
116- b .Run ("GetStream_regular" , func (b * testing.B ) {
117- obj := generateTestObject (payloadSize )
118- addr := object .AddressOf (obj )
88+ b .Run (methodName + "_regular" , func (b * testing.B ) {
89+ fsTree := setupFSTree (b )
90+ addr := prepareSingleObject (b , fsTree , payloadSize )
11991
120- require .NoError (b , fsTree .Put (addr , obj .Marshal ()))
12192 b .ReportAllocs ()
12293 b .ResetTimer ()
12394 for range b .N {
124- header , reader , err := fsTree .GetStream (addr )
125- if err != nil {
126- b .Fatal (err )
127- }
128- if header == nil {
129- b .Fatal ("header is nil" )
130- }
131- if reader != nil {
132- reader .Close ()
133- }
95+ testRead (fsTree , addr )
13496 }
13597 })
13698
137- b .Run ("GetStream_combined" , func (b * testing.B ) {
138- const numObjects = 10
139-
140- objMap := make (map [oid.Address ][]byte , numObjects )
141- addrs := make ([]oid.Address , numObjects )
142- for i := range numObjects {
143- o := generateTestObject (payloadSize )
144- objMap [object .AddressOf (o )] = o .Marshal ()
145- addrs [i ] = object .AddressOf (o )
146- }
147- require .NoError (b , fsTree .PutBatch (objMap ))
99+ b .Run (methodName + "_combined" , func (b * testing.B ) {
100+ fsTree := setupFSTree (b )
101+ addrs := prepareMultipleObjects (b , fsTree , payloadSize )
148102
149103 b .ReportAllocs ()
150104 b .ResetTimer ()
151105 for k := range b .N {
152- header , reader , err := fsTree .GetStream (addrs [k % numObjects ])
153- if err != nil {
154- b .Fatal (err )
155- }
156- if header == nil {
157- b .Fatal ("header is nil" )
158- }
159- if reader != nil {
160- reader .Close ()
161- }
106+ testRead (fsTree , addrs [k % len (addrs )])
162107 }
163108 })
164109
165- b .Run ("GetStream_compressed" , func (b * testing.B ) {
166- obj := generateTestObject (payloadSize )
167- addr := object .AddressOf (obj )
168-
169- compressConfig := & compression.Config {
170- Enabled : true ,
171- }
172- require .NoError (b , compressConfig .Init ())
173- fsTree .SetCompressor (compressConfig )
174- require .NoError (b , fsTree .Put (addr , obj .Marshal ()))
110+ b .Run (methodName + "_compressed" , func (b * testing.B ) {
111+ fsTree := setupFSTree (b )
112+ setupCompressor (b , fsTree )
113+ addr := prepareSingleObject (b , fsTree , payloadSize )
175114
176115 b .ReportAllocs ()
177116 b .ResetTimer ()
178117 for range b .N {
179- header , reader , err := fsTree .GetStream (addr )
180- if err != nil {
181- b .Fatal (err )
182- }
183- if header == nil {
184- b .Fatal ("header is nil" )
185- }
186- if reader != nil {
187- reader .Close ()
188- }
118+ testRead (fsTree , addr )
189119 }
190120 })
191121
192- b .Run ("GetStream_with_payload_read" , func (b * testing.B ) {
193- obj := generateTestObject (payloadSize )
194- addr := object .AddressOf (obj )
122+ b .Run (methodName + "_compressed_combined" , func (b * testing.B ) {
123+ fsTree := setupFSTree (b )
124+ setupCompressor (b , fsTree )
125+ addrs := prepareMultipleObjects (b , fsTree , payloadSize )
195126
196- require .NoError (b , fsTree .Put (addr , obj .Marshal ()))
197127 b .ReportAllocs ()
198128 b .ResetTimer ()
199- for range b .N {
200- header , reader , err := fsTree .GetStream (addr )
201- if err != nil {
202- b .Fatal (err )
203- }
204- if header == nil {
205- b .Fatal ("header is nil" )
206- }
207- if reader != nil {
208- // Read all payload to simulate real usage
209- _ , err := io .ReadAll (reader )
210- if err != nil {
211- b .Fatal (err )
212- }
213- reader .Close ()
214- }
129+ for k := range b .N {
130+ testRead (fsTree , addrs [k % len (addrs )])
215131 }
216132 })
217133}
0 commit comments