Primerjalni preizkusi
V repozitoriju je orodje za primerjalne preizkuse v imenikih bin/ in benchmarks/. Meri vsak način iskanja na resničnih korpusih (WordPress, Laravel) in ustvarjenih sintetičnih naborih podatkov, zajema strukturirana poročila ter omogoča primerjavo dveh serij poročil.
Orodje je del repozitorija, ne paketa Composer: ker so 0.2.3, benchmarks/ in skripti bin/bench* izključeni iz paketa, jih zaženite iz klona (git clone https://github.com/inline0/greph && cd greph && composer install).
Objavljene številke v README temeljijo na zagonih GitHub Actions, nikoli na lokalnih računalnikih. Lokalni zagoni so uporabni pri iteriranju; merodajni so zagoni CI.
Korpusi
Sintetični korpusi (synthetic-1k, synthetic-10k, synthetic-100k-single) se ob prvem zagonu ustvarijo v benchmarks/corpora/synthetic/. Resnični korpusi niso vključeni: kopijo repozitorija namestite v benchmarks/corpora/wordpress ali benchmarks/corpora/laravel (potek dela CI klonira WordPress/WordPress z --depth=1). Korpus, katerega imenik manjka, se preskoči.
Zagon primerjalnih preizkusov
# Full benchmark suite, every corpus that is present
./bin/bench
# Specific category (the category names used in benchmarks/suites/)
./bin/bench --category text
./bin/bench --category ast
# Compare against external tools when available
./bin/bench --compare rg,grep
./bin/bench --compare sg
# Choose a corpus
./bin/bench --corpus wordpress
./bin/bench --corpus laravel
./bin/bench --corpus synthetic-1k
# Write the run as JSON
./bin/bench --corpus wordpress --output build/run-1.json
# Measured series: 5 runs after 1 warmup run
./bin/bench-series --repeat 5 --warmup 1 --corpus wordpress --output build/head-series.json
# Aggregate separate runs into one series
./bin/bench-aggregate --output build/head-series.json build/run-*.json
bin/bench-compare base-series.json head-series.json primerja dve datoteki serij (izhod ukaza bench-series ali bench-aggregate) in izpiše povzetek Markdown, uporaben pri iteriranju na kritični poti. bin/bench-ci sproži potek dela Benchmark v GitHub Actions prek gh CLI.
Kategorije
README objavlja osem skupin rezultatov, od katerih vsaka meri določeno plast pogona. Vsaka skupina združuje eno ali več kategorij orodja, določenih v benchmarks/suites/.
Način pregledovanja: besedilo
Izvorno iskanje besedila z dobesednimi vzorci, vzorci regex in kombiniranimi vzorci. Objavljena osnovna meritev se izvaja na korpusu WordPress in vključuje:
- Dobesedni
function - Iskanje dobesednega niza brez razlikovanja med velikimi in malimi črkami
- Iskanje celih besed
- Regex z novo instanco
- Klic z naborom regexov
- Dobesedni predponski regex
- Dobesedni priponski regex
- Dobesedni regex za natančno ujemanje vrstice
- Združevanje dobesednih regexov
Način pregledovanja: prehod
Samo sprehod po datotekah, brez iskanja. Meri strošek sprehajalnika, ki upošteva gitignore.
Način pregledovanja: vzporedno besedilo
Iskanje fiksnega niza function z 1, 2 in 4 opravili. Za ta vzorec se skupina delavcev zažene šele nad jobs * 4_000 datotekami (glejte Vzporedni delavci), kar je več, kot jih vsebuje korpus WordPress, zato se vse tri objavljene vrstice izvajajo v enem procesu in ne prikazujejo skaliranja skupine (#8).
Način pregledovanja: AST
Izvorno iskanje AST na reprezentativnih vzorcih:
new $CLASS()array($$$ITEMS)
Indeksirani način besedila
Iskanje po ogretem besedilnem indeksu z enakimi vzorci kot pri načinu pregledovanja. Vključuje poizvedbe za dobesedne nize, brez razlikovanja med velikimi in malimi črkami, za cele besede, kratke žetone in regex.
Indeksirane povzetne poizvedbe
Iskanje po ogretem besedilnem indeksu z izhodi za štetje, datoteke z zadetki in datoteke brez zadetkov. Te poizvedbe imajo največ koristi od shrambe objav, saj je delo na posamezni datoteki najmanj zahtevno.
Indeksirani / predpomnjeni AST
Iskanje po dejstvih AST in iskanje po predpomnjenem AST z enakimi vzorci kot pri načinu pregledovanja AST.
Stroški gradnje
Stroški hladne gradnje indeksa trigramov, indeksa dejstev AST in predpomnilnika AST. Uporabno pri odločanju, kateri način vzdrževati za določeno delovno obremenitev.
Branje objavljenih številk
README objavi posnetek najnovejšega zagona CI za vsako osnovno meritev. Vsak razdelek temelji na določenem zagonu GitHub Actions in je označen s korpusom, izvajalnikom, različico PHP ter številom meritev in ogrevalnih zagonov. Če želite ponoviti meritev, uporabite enako kombinacijo lokalno.
Primerjalni stolpci (rg, grep, sg) so zbrani v istem opravilu, na istem izvajalniku in na istem korpusu. Niso ekstrapolirani iz zunanjih primerjalnih preizkusov.
Kako dodati primerjalni preizkus
- Dodajte definicijo primerjalnega preizkusa v
benchmarks/. - Če še ni enakovrednega scenarija, dodajte ustrezen scenarij v zbirko regresijskih preizkusov (tako preverite tudi merjeno vedenje).
- Zaženite
./bin/bench --category <yours>, da preverite nov primerjalni preizkus. - Primerjajte z
mainprek poteka dela Benchmark, ki se zažene pri zahtevah za združitev, ki spreminjajosrc/,benchmarks/alibin/, ter v povzetek zagona objavi primerjavo trenutne in osnovne različice. - Posodobite tabelo README, ko je zagon CI, ki vključuje nov primerjalni preizkus, združen v
main.
Filozofija zmogljivosti
Greph ne poskuša prehiteti ripgrep ali grepa pri hladnih pregledovanjih. Ripgrep je implementiran v Rust z ročno prilagojenim iskanjem dobesednih nizov SIMD; v objavljenih meritvah sta tako rg kot GNU grep hitrejša od Greph pri vsakem hladnem iskanju besedila. Cilji so drugačni:
- Biti dovolj hiter, da sta interaktivna uporaba in zanke agentov odzivni kot domača aplikacija.
- Ponavljajoče se poizvedbe odgovarjati iz ogretih indeksov: indeksirani regex ter indeksirane poizvedbe za štetje in seznam datotek so hitrejši od pregledovanja istega drevesa z
rgingrep. - Prehiteti
ast-greppri obremenitvah z indeksiranim in predpomnjenim AST, kjer ogreti predpomnilniki Greph preprečijo ponovno razčlenjevanje drevesa. Pri hladnem iskanju AST so rezultati mešani:new $CLASS()je hitrejši odsg,array($$$ITEMS)pa počasnejši. - Poskrbeti, da je vsako izboljšanje zmogljivosti merljivo in ponovljivo.
Trditve o zmogljivosti, ki niso podprte s poročilom primerjalnih preizkusov, niso vključene.