4
4
"io"
5
5
"testing"
6
6
7
- "github.com/nspcc-dev/neofs-node/pkg/core/object"
8
- "github.com/nspcc-dev/neofs-node/pkg/local_object_storage/blobstor/compression"
9
7
"github.com/nspcc-dev/neofs-node/pkg/local_object_storage/blobstor/fstree"
10
8
objectSDK "github.com/nspcc-dev/neofs-sdk-go/object"
11
9
oid "github.com/nspcc-dev/neofs-sdk-go/object/id"
@@ -15,203 +13,121 @@ import (
15
13
func BenchmarkFSTree_Head (b * testing.B ) {
16
14
for _ , size := range payloadSizes {
17
15
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 )
24
17
})
25
18
}
26
19
}
27
20
28
21
func BenchmarkFSTree_Get (b * testing.B ) {
29
22
for _ , size := range payloadSizes {
30
23
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 )
37
25
})
38
26
}
39
27
}
40
28
41
29
func BenchmarkFSTree_GetStream (b * testing.B ) {
42
30
for _ , size := range payloadSizes {
43
31
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
+ })
50
58
})
51
59
}
52
60
}
53
61
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" )
67
78
}
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 ())
89
81
}
90
82
}
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 )
111
85
}
112
- })
113
- }
86
+ }
114
87
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 )
119
91
120
- require .NoError (b , fsTree .Put (addr , obj .Marshal ()))
121
92
b .ReportAllocs ()
122
93
b .ResetTimer ()
123
94
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 )
134
96
}
135
97
})
136
98
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 )
148
102
149
103
b .ReportAllocs ()
150
104
b .ResetTimer ()
151
105
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 )])
162
107
}
163
108
})
164
109
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 )
175
114
176
115
b .ReportAllocs ()
177
116
b .ResetTimer ()
178
117
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 )
189
119
}
190
120
})
191
121
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 )
195
126
196
- require .NoError (b , fsTree .Put (addr , obj .Marshal ()))
197
127
b .ReportAllocs ()
198
128
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 )])
215
131
}
216
132
})
217
133
}
0 commit comments