[#957] treesvc/heap: Cache FileName attribute

```
goos: linux
goarch: amd64
pkg: git.frostfs.info/TrueCloudLab/frostfs-node/pkg/services/tree
cpu: 11th Gen Intel(R) Core(TM) i5-1135G7 @ 2.40GHz
                        │     new      │                cache                 │
                        │    sec/op    │    sec/op     vs base                │
GetSubTree/latency-8      4.059m ± 20%   2.350m ± 19%  -42.11% (p=0.000 n=10)
GetSubTree/total_time-8   78.82m ±  4%   70.62m ±  8%  -10.39% (p=0.001 n=10)
geomean                   17.89m         12.88m        -27.98%

                        │     new      │                cache                 │
                        │     B/op     │     B/op      vs base                │
GetSubTree/latency-8      32.81Mi ± 0%   43.87Mi ± 0%  +33.72% (p=0.000 n=10)
GetSubTree/total_time-8   32.81Mi ± 0%   43.87Mi ± 0%  +33.73% (p=0.000 n=10)
geomean                   32.81Mi        43.87Mi       +33.72%

                        │     new     │               cache                │
                        │  allocs/op  │  allocs/op   vs base               │
GetSubTree/latency-8      400.0k ± 0%   400.0k ± 0%  +0.01% (p=0.000 n=10)
GetSubTree/total_time-8   400.0k ± 0%   400.0k ± 0%  +0.01% (p=0.000 n=10)
geomean                   400.0k        400.0k       +0.01%
```

Signed-off-by: Evgenii Stratonikov <e.stratonikov@yadro.com>
This commit is contained in:
Evgenii Stratonikov 2024-02-02 23:32:26 +03:00
parent 3601feab81
commit 77bdadde14

View file

@ -8,9 +8,13 @@ import (
)
type OrderedSlice struct {
nodes []pilorama.NodeInfo
nodes []node
sorted bool
}
type node struct {
filename []byte
info *pilorama.NodeInfo
}
func NewOrderedSlice() *OrderedSlice {
return new(OrderedSlice)
@ -18,7 +22,12 @@ func NewOrderedSlice() *OrderedSlice {
func (s *OrderedSlice) Insert(infos ...pilorama.NodeInfo) {
s.sorted = false
s.nodes = append(s.nodes, infos...)
for i := range infos {
s.nodes = append(s.nodes, node{
filename: infos[i].Meta.GetAttr(pilorama.AttributeFilename),
info: &infos[i],
})
}
}
func (s *OrderedSlice) IsEmpty() bool {
@ -33,15 +42,15 @@ func (s *OrderedSlice) ExtractMin() pilorama.NodeInfo {
node := s.nodes[0]
s.nodes = s.nodes[1:]
return node
return *node.info
}
func sortByFilename(nodes []pilorama.NodeInfo) {
func sortByFilename(nodes []node) {
if len(nodes) == 0 {
return
}
less := func(i, j int) bool {
return bytes.Compare(nodes[i].Meta.GetAttr(pilorama.AttributeFilename), nodes[j].Meta.GetAttr(pilorama.AttributeFilename)) < 0
return bytes.Compare(nodes[i].filename, nodes[j].filename) < 0
}
sort.Slice(nodes, less)
}