Skip to content

Commit

Permalink
Make top score collector about 7 times faster
Browse files Browse the repository at this point in the history
  • Loading branch information
slavikm committed Apr 29, 2016
1 parent 6d830a9 commit f2aba11
Show file tree
Hide file tree
Showing 3 changed files with 49 additions and 24 deletions.
32 changes: 32 additions & 0 deletions search/collectors/bench_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package collectors

import (
"math/rand"
"strconv"
"testing"

"github.com/blevesearch/bleve/search"
"golang.org/x/net/context"
)

func benchHelper(numOfMatches int, collector search.Collector, b *testing.B) {
matches := make(search.DocumentMatchCollection, 0, numOfMatches)
for i := 0; i < numOfMatches; i++ {
matches = append(matches, &search.DocumentMatch{
ID: strconv.Itoa(i),
Score: rand.Float64(),
})
}

b.ResetTimer()

for run := 0; run < b.N; run++ {
searcher := &stubSearcher{
matches: matches,
}
err := collector.Collect(context.Background(), searcher)
if err != nil {
b.Fatal(err)
}
}
}
9 changes: 7 additions & 2 deletions search/collectors/collector_top_score.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ type TopScoreCollector struct {
results *list.List
took time.Duration
maxScore float64
minScore float64
total uint64
facetsBuilder *search.FacetsBuilder
}
Expand Down Expand Up @@ -98,6 +99,10 @@ func (tksc *TopScoreCollector) collectSingle(dm *search.DocumentMatch) {
tksc.maxScore = dm.Score
}

if dm.Score <= tksc.minScore {
return
}

for e := tksc.results.Front(); e != nil; e = e.Next() {
curr := e.Value.(*search.DocumentMatch)
if dm.Score < curr.Score {
Expand All @@ -106,7 +111,7 @@ func (tksc *TopScoreCollector) collectSingle(dm *search.DocumentMatch) {
// if we just made the list too long
if tksc.results.Len() > (tksc.k + tksc.skip) {
// remove the head
tksc.results.Remove(tksc.results.Front())
tksc.minScore = tksc.results.Remove(tksc.results.Front()).(*search.DocumentMatch).Score
}
return
}
Expand All @@ -115,7 +120,7 @@ func (tksc *TopScoreCollector) collectSingle(dm *search.DocumentMatch) {
tksc.results.PushBack(dm)
if tksc.results.Len() > (tksc.k + tksc.skip) {
// remove the head
tksc.results.Remove(tksc.results.Front())
tksc.minScore = tksc.results.Remove(tksc.results.Front()).(*search.DocumentMatch).Score
}
}

Expand Down
32 changes: 10 additions & 22 deletions search/collectors/collector_top_score_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,6 @@
package collectors

import (
"math/rand"
"strconv"
"testing"

"golang.org/x/net/context"
Expand Down Expand Up @@ -225,27 +223,17 @@ func TestTop10ScoresSkip10(t *testing.T) {
}

func BenchmarkTop10of100000Scores(b *testing.B) {
benchHelper(10000, NewTopScorerCollector(10), b)
}

matches := make(search.DocumentMatchCollection, 0, 100000)
for i := 0; i < 100000; i++ {
matches = append(matches, &search.DocumentMatch{
ID: strconv.Itoa(i),
Score: rand.Float64(),
})
}
searcher := &stubSearcher{
matches: matches,
}
func BenchmarkTop100of100000Scores(b *testing.B) {
benchHelper(10000, NewTopScorerCollector(100), b)
}

collector := NewTopScorerCollector(10)
b.ResetTimer()
func BenchmarkTop10of1000000Scores(b *testing.B) {
benchHelper(100000, NewTopScorerCollector(10), b)
}

err := collector.Collect(context.Background(), searcher)
if err != nil {
b.Fatal(err)
}
res := collector.Results()
for _, dm := range res {
b.Logf("%s - %f\n", dm.ID, dm.Score)
}
func BenchmarkTop100of1000000Scores(b *testing.B) {
benchHelper(100000, NewTopScorerCollector(100), b)
}

0 comments on commit f2aba11

Please sign in to comment.