From 980338861fe552253fd843fa150a1d58b80bc544 Mon Sep 17 00:00:00 2001 From: Aliaksandr Valialkin Date: Tue, 23 Jan 2024 03:15:49 +0200 Subject: [PATCH] lib/mergeset: skip comparison for every item in the block during merge if the last item in the block is smaller than the first item in the next block Thanks to @ahfuzhang for the suggestion at https://github.com/VictoriaMetrics/VictoriaMetrics/issues/5651 --- lib/mergeset/merge.go | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/lib/mergeset/merge.go b/lib/mergeset/merge.go index 41dbbf281..3f443c2f7 100644 --- a/lib/mergeset/merge.go +++ b/lib/mergeset/merge.go @@ -125,9 +125,16 @@ again: } items := bsr.Block.items data := bsr.Block.data - for bsr.currItemIdx < len(bsr.Block.items) { + compareEveryItem := true + if bsr.currItemIdx < len(items) { + // An optimization, which allows skipping costly comparison for every merged item in the loop below. + // Thanks to @ahfuzhang for the suggestion at https://github.com/VictoriaMetrics/VictoriaMetrics/issues/5651 + lastItem := items[len(items)-1].Bytes(data) + compareEveryItem = hasNextItem && string(lastItem) > nextItem + } + for bsr.currItemIdx < len(items) { item := items[bsr.currItemIdx].Bytes(data) - if hasNextItem && string(item) > nextItem { + if compareEveryItem && string(item) > nextItem { break } if !bsm.ib.Add(item) { @@ -137,7 +144,7 @@ again: } bsr.currItemIdx++ } - if bsr.currItemIdx == len(bsr.Block.items) { + if bsr.currItemIdx == len(items) { // bsr.Block is fully read. Proceed to the next block. if bsr.Next() { heap.Fix(&bsm.bsrHeap, 0)