scorch zap postingsIter reuses nextLocs/nextSegmentLocs
The previous code would inefficiently throw away the nextLocs and would also throw away the []segment.Location slice if there were no locations, such as if it was a 1-hit postings list. This change tries to reuse the nextLocs/nextSegmentLocs for all cases.
This commit is contained in:
parent
6540b197d4
commit
db792717a6
|
@ -154,6 +154,9 @@ func (p *PostingsList) iterator(rv *PostingsIterator) *PostingsIterator {
|
||||||
freqChunkOffsets := rv.freqChunkOffsets[:0]
|
freqChunkOffsets := rv.freqChunkOffsets[:0]
|
||||||
locChunkOffsets := rv.locChunkOffsets[:0]
|
locChunkOffsets := rv.locChunkOffsets[:0]
|
||||||
|
|
||||||
|
nextLocs := rv.nextLocs[:0]
|
||||||
|
nextSegmentLocs := rv.nextSegmentLocs[:0]
|
||||||
|
|
||||||
buf := rv.buf
|
buf := rv.buf
|
||||||
|
|
||||||
*rv = PostingsIterator{} // clear the struct
|
*rv = PostingsIterator{} // clear the struct
|
||||||
|
@ -167,6 +170,9 @@ func (p *PostingsList) iterator(rv *PostingsIterator) *PostingsIterator {
|
||||||
rv.freqChunkOffsets = freqChunkOffsets
|
rv.freqChunkOffsets = freqChunkOffsets
|
||||||
rv.locChunkOffsets = locChunkOffsets
|
rv.locChunkOffsets = locChunkOffsets
|
||||||
|
|
||||||
|
rv.nextLocs = nextLocs
|
||||||
|
rv.nextSegmentLocs = nextSegmentLocs
|
||||||
|
|
||||||
rv.buf = buf
|
rv.buf = buf
|
||||||
}
|
}
|
||||||
rv.postings = p
|
rv.postings = p
|
||||||
|
@ -314,8 +320,9 @@ type PostingsIterator struct {
|
||||||
locChunkOffsets []uint64
|
locChunkOffsets []uint64
|
||||||
locChunkStart uint64
|
locChunkStart uint64
|
||||||
|
|
||||||
next Posting // reused across Next() calls
|
next Posting // reused across Next() calls
|
||||||
nextLocs []Location // reused across Next() calls
|
nextLocs []Location // reused across Next() calls
|
||||||
|
nextSegmentLocs []segment.Location // reused across Next() calls
|
||||||
|
|
||||||
docNum1Hit uint64
|
docNum1Hit uint64
|
||||||
normBits1Hit uint64
|
normBits1Hit uint64
|
||||||
|
@ -469,8 +476,7 @@ func (i *PostingsIterator) Next() (segment.Posting, error) {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
reuseLocs := i.next.locs // hold for reuse before struct clearing
|
i.next = Posting{} // clear the struct
|
||||||
i.next = Posting{} // clear the struct
|
|
||||||
rv := &i.next
|
rv := &i.next
|
||||||
rv.docNum = docNum
|
rv.docNum = docNum
|
||||||
|
|
||||||
|
@ -491,11 +497,10 @@ func (i *PostingsIterator) Next() (segment.Posting, error) {
|
||||||
} else {
|
} else {
|
||||||
i.nextLocs = make([]Location, rv.freq)
|
i.nextLocs = make([]Location, rv.freq)
|
||||||
}
|
}
|
||||||
if cap(reuseLocs) >= int(rv.freq) {
|
if cap(i.nextSegmentLocs) < int(rv.freq) {
|
||||||
rv.locs = reuseLocs[0:rv.freq]
|
i.nextSegmentLocs = make([]segment.Location, rv.freq)
|
||||||
} else {
|
|
||||||
rv.locs = make([]segment.Location, rv.freq)
|
|
||||||
}
|
}
|
||||||
|
rv.locs = i.nextSegmentLocs[0:rv.freq]
|
||||||
for j := 0; j < int(rv.freq); j++ {
|
for j := 0; j < int(rv.freq); j++ {
|
||||||
err := i.readLocation(&i.nextLocs[j])
|
err := i.readLocation(&i.nextLocs[j])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
Loading…
Reference in New Issue