fix union performance regression (#2790)

* add inlines

* fix union performance regression

Remove unwrap from hotpath generates better assembly.

closes #2788
This commit is contained in:
PSeitz
2026-01-02 19:06:51 +08:00
committed by GitHub
parent 242a1531bf
commit 735c588f4f
16 changed files with 25 additions and 1 deletions

View File

@@ -84,7 +84,7 @@ pub struct NaturalComparator;
impl<T: PartialOrd> Comparator<T> for NaturalComparator {
#[inline(always)]
fn compare(&self, lhs: &T, rhs: &T) -> Ordering {
lhs.partial_cmp(rhs).unwrap()
lhs.partial_cmp(rhs).unwrap_or(Ordering::Equal)
}
}

View File

@@ -527,6 +527,7 @@ pub(crate) mod tests {
}
impl<TScorer: Scorer> Scorer for UnoptimizedDocSet<TScorer> {
#[inline]
fn score(&mut self) -> Score {
self.0.score()
}

View File

@@ -105,6 +105,7 @@ impl DocSet for AllScorer {
}
impl Scorer for AllScorer {
#[inline]
fn score(&mut self) -> Score {
1.0
}

View File

@@ -134,6 +134,7 @@ impl<S: Scorer> DocSet for BoostScorer<S> {
}
impl<S: Scorer> Scorer for BoostScorer<S> {
#[inline]
fn score(&mut self) -> Score {
self.underlying.score() * self.boost
}

View File

@@ -137,6 +137,7 @@ impl<TDocSet: DocSet> DocSet for ConstScorer<TDocSet> {
}
impl<TDocSet: DocSet + 'static> Scorer for ConstScorer<TDocSet> {
#[inline]
fn score(&mut self) -> Score {
self.score
}

View File

@@ -173,6 +173,7 @@ impl<TScorer: Scorer, TScoreCombiner: ScoreCombiner> DocSet
impl<TScorer: Scorer, TScoreCombiner: ScoreCombiner> Scorer
for Disjunction<TScorer, TScoreCombiner>
{
#[inline]
fn score(&mut self) -> Score {
self.current_score
}
@@ -307,6 +308,7 @@ mod tests {
}
impl Scorer for DummyScorer {
#[inline]
fn score(&mut self) -> Score {
self.foo.get(self.cursor).map(|x| x.1).unwrap_or(0.0)
}

View File

@@ -55,6 +55,7 @@ impl DocSet for EmptyScorer {
}
impl Scorer for EmptyScorer {
#[inline]
fn score(&mut self) -> Score {
0.0
}

View File

@@ -84,6 +84,7 @@ where
TScorer: Scorer,
TDocSetExclude: DocSet + 'static,
{
#[inline]
fn score(&mut self) -> Score {
self.underlying_docset.score()
}

View File

@@ -105,6 +105,7 @@ impl<TDocSet: DocSet> Intersection<TDocSet, TDocSet> {
}
impl<TDocSet: DocSet, TOtherDocSet: DocSet> DocSet for Intersection<TDocSet, TOtherDocSet> {
#[inline]
fn advance(&mut self) -> DocId {
let (left, right) = (&mut self.left, &mut self.right);
let mut candidate = left.advance();
@@ -174,6 +175,7 @@ impl<TDocSet: DocSet, TOtherDocSet: DocSet> DocSet for Intersection<TDocSet, TOt
.all(|docset| docset.seek_into_the_danger_zone(target))
}
#[inline]
fn doc(&self) -> DocId {
self.left.doc()
}
@@ -200,6 +202,7 @@ where
TScorer: Scorer,
TOtherScorer: Scorer,
{
#[inline]
fn score(&mut self) -> Score {
self.left.score()
+ self.right.score()

View File

@@ -81,6 +81,7 @@ impl<TPostings: Postings> DocSet for PhraseKind<TPostings> {
}
impl<TPostings: Postings> Scorer for PhraseKind<TPostings> {
#[inline]
fn score(&mut self) -> Score {
match self {
PhraseKind::SinglePrefix { positions, .. } => {
@@ -215,6 +216,7 @@ impl<TPostings: Postings> DocSet for PhrasePrefixScorer<TPostings> {
}
impl<TPostings: Postings> Scorer for PhrasePrefixScorer<TPostings> {
#[inline]
fn score(&mut self) -> Score {
// TODO modify score??
self.phrase_scorer.score()

View File

@@ -563,6 +563,7 @@ impl<TPostings: Postings> DocSet for PhraseScorer<TPostings> {
}
impl<TPostings: Postings> Scorer for PhraseScorer<TPostings> {
#[inline]
fn score(&mut self) -> Score {
let doc = self.doc();
let fieldnorm_id = self.fieldnorm_reader.fieldnorm_id(doc);

View File

@@ -81,6 +81,7 @@ where
TOptScorer: Scorer,
TScoreCombiner: ScoreCombiner,
{
#[inline]
fn score(&mut self) -> Score {
if let Some(score) = self.score_cache {
return score;

View File

@@ -29,6 +29,7 @@ impl ScoreCombiner for DoNothingCombiner {
fn clear(&mut self) {}
#[inline]
fn score(&self) -> Score {
1.0
}
@@ -49,6 +50,7 @@ impl ScoreCombiner for SumCombiner {
self.score = 0.0;
}
#[inline]
fn score(&self) -> Score {
self.score
}
@@ -86,6 +88,7 @@ impl ScoreCombiner for DisjunctionMaxCombiner {
self.sum = 0.0;
}
#[inline]
fn score(&self) -> Score {
self.max + (self.sum - self.max) * self.tie_breaker
}

View File

@@ -18,6 +18,7 @@ pub trait Scorer: downcast_rs::Downcast + DocSet + 'static {
impl_downcast!(Scorer);
impl Scorer for Box<dyn Scorer> {
#[inline]
fn score(&mut self) -> Score {
self.deref_mut().score()
}

View File

@@ -119,6 +119,7 @@ impl DocSet for TermScorer {
}
impl Scorer for TermScorer {
#[inline]
fn score(&mut self) -> Score {
let fieldnorm_id = self.fieldnorm_id();
let term_freq = self.term_freq();

View File

@@ -128,6 +128,7 @@ impl<TScorer: Scorer, TScoreCombiner: ScoreCombiner> BufferedUnionScorer<TScorer
}
}
#[inline]
fn advance_buffered(&mut self) -> bool {
while self.bucket_idx < HORIZON_NUM_TINYBITSETS {
if let Some(val) = self.bitsets[self.bucket_idx].pop_lowest() {
@@ -156,6 +157,7 @@ where
TScorer: Scorer,
TScoreCombiner: ScoreCombiner,
{
#[inline]
fn advance(&mut self) -> DocId {
if self.advance_buffered() {
return self.doc;
@@ -245,6 +247,7 @@ where
}
}
#[inline]
fn doc(&self) -> DocId {
self.doc
}
@@ -286,6 +289,7 @@ where
TScoreCombiner: ScoreCombiner,
TScorer: Scorer,
{
#[inline]
fn score(&mut self) -> Score {
self.score
}