[#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:
parent
3601feab81
commit
77bdadde14
1 changed files with 14 additions and 5 deletions
|
@ -8,9 +8,13 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
type OrderedSlice struct {
|
type OrderedSlice struct {
|
||||||
nodes []pilorama.NodeInfo
|
nodes []node
|
||||||
sorted bool
|
sorted bool
|
||||||
}
|
}
|
||||||
|
type node struct {
|
||||||
|
filename []byte
|
||||||
|
info *pilorama.NodeInfo
|
||||||
|
}
|
||||||
|
|
||||||
func NewOrderedSlice() *OrderedSlice {
|
func NewOrderedSlice() *OrderedSlice {
|
||||||
return new(OrderedSlice)
|
return new(OrderedSlice)
|
||||||
|
@ -18,7 +22,12 @@ func NewOrderedSlice() *OrderedSlice {
|
||||||
|
|
||||||
func (s *OrderedSlice) Insert(infos ...pilorama.NodeInfo) {
|
func (s *OrderedSlice) Insert(infos ...pilorama.NodeInfo) {
|
||||||
s.sorted = false
|
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 {
|
func (s *OrderedSlice) IsEmpty() bool {
|
||||||
|
@ -33,15 +42,15 @@ func (s *OrderedSlice) ExtractMin() pilorama.NodeInfo {
|
||||||
|
|
||||||
node := s.nodes[0]
|
node := s.nodes[0]
|
||||||
s.nodes = s.nodes[1:]
|
s.nodes = s.nodes[1:]
|
||||||
return node
|
return *node.info
|
||||||
}
|
}
|
||||||
|
|
||||||
func sortByFilename(nodes []pilorama.NodeInfo) {
|
func sortByFilename(nodes []node) {
|
||||||
if len(nodes) == 0 {
|
if len(nodes) == 0 {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
less := func(i, j int) bool {
|
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)
|
sort.Slice(nodes, less)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue