diff --git a/pkg/phlaredb/symdb/dedup_slice.go b/pkg/phlaredb/symdb/dedup_slice.go index 78056f893e..f0f9face8f 100644 --- a/pkg/phlaredb/symdb/dedup_slice.go +++ b/pkg/phlaredb/symdb/dedup_slice.go @@ -254,7 +254,7 @@ func (s *deduplicatingSlice[M, K, H]) Size() uint64 { func (s *deduplicatingSlice[M, K, H]) ingest(elems []M, rewriter *rewriter) { var ( - rewritingMap = make(map[int64]int64) + rewritingMap = make(map[int64]int64, len(elems)) missing = int64SlicePool.Get() ) missing = missing[:0] @@ -279,6 +279,7 @@ func (s *deduplicatingSlice[M, K, H]) ingest(elems []M, rewriter *rewriter) { if len(missing) > 0 { s.lock.Lock() posSlice := int64(len(s.slice)) + misSlice := make([]M, 0, len(missing)) for _, pos := range missing { // check again if element exists k := s.helper.key(elems[pos]) @@ -288,12 +289,13 @@ func (s *deduplicatingSlice[M, K, H]) ingest(elems []M, rewriter *rewriter) { } // add element to slice/map - s.slice = append(s.slice, s.helper.clone(elems[pos])) + misSlice = append(misSlice, s.helper.clone(elems[pos])) s.lookup[k] = posSlice rewritingMap[int64(s.helper.setID(uint64(pos), uint64(posSlice), &elems[pos]))] = posSlice posSlice++ s.size.Add(s.helper.size(elems[pos])) } + s.slice = append(s.slice, misSlice...) s.lock.Unlock() } diff --git a/pkg/phlaredb/symdb/symdb_test.go b/pkg/phlaredb/symdb/symdb_test.go index 2f8804081d..d804b28fd6 100644 --- a/pkg/phlaredb/symdb/symdb_test.go +++ b/pkg/phlaredb/symdb/symdb_test.go @@ -227,3 +227,23 @@ func TestWritePartition(t *testing.T) { ` require.Equal(t, expected, resolved.String()) } + +func BenchmarkPartitionWriter_WriteProfileSymbols(b *testing.B) { + b.ReportAllocs() + + p, err := pprof.OpenFile("testdata/profile.pb.gz") + require.NoError(b, err) + p.Normalize() + cfg := DefaultConfig().WithDirectory(b.TempDir()) + + db := NewSymDB(cfg) + + for i := 0; i < b.N; i++ { + b.StopTimer() + newP := p.CloneVT() + pw := db.PartitionWriter(uint64(i)) + b.StartTimer() + + pw.WriteProfileSymbols(newP) + } +}