From 77bdadde141caa0a84d9758f147ac8d41ae7a4ab Mon Sep 17 00:00:00 2001 From: Evgenii Stratonikov Date: Fri, 2 Feb 2024 23:32:26 +0300 Subject: [PATCH] [#957] treesvc/heap: Cache FileName attribute MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ``` 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 --- pkg/services/tree/heap/ordered_slice.go | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/pkg/services/tree/heap/ordered_slice.go b/pkg/services/tree/heap/ordered_slice.go index 6752bb685..23efe216d 100644 --- a/pkg/services/tree/heap/ordered_slice.go +++ b/pkg/services/tree/heap/ordered_slice.go @@ -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) }