48 lines
1.2 KiB
Go
48 lines
1.2 KiB
Go
package search
|
|
|
|
import (
|
|
"fmt"
|
|
"math/rand"
|
|
"strings"
|
|
"testing"
|
|
)
|
|
|
|
// baueGrossenIndex legt einen Index in der Größenordnung eines großen Projekts
|
|
// an: 10.000 Einträge à 150 Wörter aus einem Wortschatz von 20.000 Wörtern.
|
|
//
|
|
// Die Wörter sind künstlich ("wort123"), das genügt: Für die Laufzeit zählt,
|
|
// wie viele verschiedene Wörter der Index durchgehen muss, nicht was sie heißen.
|
|
// Der feste Startwert macht jeden Lauf gleich.
|
|
func baueGrossenIndex() *Index {
|
|
const (
|
|
eintraege = 10_000
|
|
woerter = 150
|
|
wortschatz = 20_000
|
|
)
|
|
|
|
zufall := rand.New(rand.NewSource(1))
|
|
idx := NewIndex()
|
|
|
|
var text strings.Builder
|
|
for i := 0; i < eintraege; i++ {
|
|
text.Reset()
|
|
for j := 0; j < woerter; j++ {
|
|
fmt.Fprintf(&text, "wort%d ", zufall.Intn(wortschatz))
|
|
}
|
|
idx.Index(fmt.Sprintf("eintrag-%d", i), "Titel", text.String(), nil)
|
|
}
|
|
return idx
|
|
}
|
|
|
|
// BenchmarkSearch misst eine typische Agenten-Anfrage: eine ganze Frage mit
|
|
// Stoppwörtern und Wörtern, die es im Index nicht gibt.
|
|
//
|
|
// go test ./internal/search/ -bench . -run '^$'
|
|
func BenchmarkSearch(b *testing.B) {
|
|
idx := baueGrossenIndex()
|
|
b.ResetTimer()
|
|
|
|
for i := 0; i < b.N; i++ {
|
|
idx.Search("wie funktioniert wort123 mit wort4567", 10)
|
|
}
|
|
}
|