Našumo testai
Saugykloje yra našumo testų įrankių rinkinys, esantis bin/ ir benchmarks/. Jis matuoja kiekvieną paieškos režimą su realiais duomenų rinkiniais (WordPress, Laravel) ir sugeneruotais sintetiniais duomenų rinkiniais, fiksuoja struktūrizuotas ataskaitas ir leidžia palyginti dvi ataskaitų sekas.
Šis įrankių rinkinys yra saugyklos dalis, o ne Composer paketo: kadangi 0.2.3, benchmarks/ ir bin/bench* scenarijai į paketą neįtraukti, paleiskite juos iš klonuotos saugyklos (git clone https://github.com/inline0/greph && cd greph && composer install).
Paskelbti skaičiai, pateikti README, gaunami iš GitHub Actions paleidimų, niekada iš vietinių kompiuterių. Vietiniai paleidimai naudingi darbo eigai tobulinti; CI paleidimai yra patikimiausias šaltinis.
Duomenų rinkiniai
Sintetiniai duomenų rinkiniai (synthetic-1k, synthetic-10k, synthetic-100k-single) sugeneruojami benchmarks/corpora/synthetic/ pirmojo paleidimo metu. Realūs duomenų rinkiniai neįtraukti: įdėkite jų saugyklos kopiją į benchmarks/corpora/wordpress arba benchmarks/corpora/laravel (CI darbo eiga klonuoja WordPress/WordPress naudodama --depth=1). Jei duomenų rinkinio katalogo nėra, jis praleidžiamas.
Našumo testų vykdymas
# 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 palygina dvi sekų rinkmenas (bench-series arba bench-aggregate išvestį) ir išveda Markdown suvestinę, naudingą optimizuojant dažnai naudojamą kodo kelią. bin/bench-ci per gh CLI paleidžia „Benchmark“ darbo eigą sistemoje GitHub Actions.
Kategorijos
README paskelbia aštuonias rezultatų grupes, kurių kiekviena matuoja konkretų variklio sluoksnį. Kiekvieną grupę sudaro viena ar daugiau įrankių rinkinio kategorijų, apibrėžtų benchmarks/suites/.
Skenavimo režimas: tekstas
Gimtoji teksto paieška pagal pažodinius, regex ir mišrius šablonus. Paskelbta bazinė versija veikia su WordPress duomenų rinkiniu ir apima:
- Pažodinė
function - Pažodinė paieška nepaisant raidžių registro
- Pažodinė viso žodžio paieška
- Nauja regex instancija
- Regex masyvo iškvietimas
- Regex prefikso pažodinė paieška
- Regex priesagos pažodinė paieška
- Regex tikslios eilutės pažodinė paieška
- Regex pažodinių reikšmių sutraukimas
Skenavimo režimas: perėjimas
Tik failų perėjimas, be paieškos. Matuojama vien gitignore taisykles suprantančio perėjimo įrankio kaina.
Skenavimo režimas: lygiagretus tekstas
Fiksuotos eilutės paieška pagal function su 1, 2 ir 4 užduotimis. Šiam šablonui darbuotojų telkinys paleidžiamas tik viršijus jobs * 4_000 failų ribą (žr. Lygiagretūs darbuotojai), o WordPress duomenų rinkinys turi mažiau failų, todėl visos trys paskelbtos eilutės vykdomos viename procese ir neparodo telkinio mastelio keitimo (#8).
Skenavimo režimas: AST
Gimtoji AST paieška pagal reprezentatyvius šablonus:
new $CLASS()array($$$ITEMS)
Indeksuoto teksto režimas
Paieška šiltame teksto indekse pagal tuos pačius šablonus kaip skenavimo režime. Apima pažodines, nepaisančias raidžių registro, viso žodžio, trumpo žetono ir regex užklausas.
Indeksuotos suvestinės užklausos
Paieška šiltame teksto indekse, pateikianti rastų atitikmenų skaičių, failus su atitikmenimis ir failus be atitikmenų. Šioms užklausoms pranešimų saugykla naudingiausia, nes kiekvieno failo apdorojimas kainuoja mažiausiai.
Indeksuotas / podėlyje saugomas AST
Paieška šiltuose AST faktų ir podėlyje saugomuose AST indeksuose pagal tuos pačius šablonus kaip AST skenavimo režime.
Kūrimo sąnaudos
Trigramų indekso, AST faktų indekso ir AST podėlio sukūrimo sąnaudos. Naudinga sprendžiant, kurį režimą palaikyti pagal darbo krūvį.
Paskelbtų rezultatų skaitymas
README skelbia naujausio CI paleidimo kiekvienai bazinei versijai momentinę kopiją. Kiekviena skiltis gaunama iš konkretaus GitHub Actions paleidimo ir pažymėta duomenų rinkiniu, vykdymo aplinka, PHP versija bei matuotų paleidimų ir apšilimo ciklų skaičiumi. Jei norite atkartoti rezultatą, naudokite tą patį derinį vietoje.
Palyginimo stulpelių (rg, grep, sg) duomenys surenkami tame pačiame darbe, toje pačioje vykdymo aplinkoje ir su tuo pačiu duomenų rinkiniu. Jie nėra ekstrapoliuojami iš išorinių našumo testų.
Kaip pridėti našumo testą
- Pridėkite našumo testo apibrėžtį į
benchmarks/. - Pridėkite atitinkamą scenarijų į regresijos rinkinį, jei dar nėra lygiaverčio (kad būtų patikrinta ir matuojama elgsena).
- Paleiskite
./bin/bench --category <yours>, kad patikrintumėte naują našumo testą. - Palyginkite su
mainnaudodami „Benchmark“ darbo eigą, kuri paleidžiama traukimo užklausoms, keičiančiomssrc/,benchmarks/arbabin/, ir paskelbimo suvestinėje pateikia naujos ir bazinės versijos palyginimą. - Atnaujinkite lentelę README, kai CI paleidimas su nauju našumo testu bus įtrauktas į
main.
Našumo principai
Greph nesiekia šaltuose skenavimuose aplenkti ripgrep ar grep. Ripgrep įgyvendintas Rust, naudojant rankiniu būdu optimizuotą SIMD pažodinių eilučių skenavimą, o paskelbtuose rezultatuose tiek rg, tiek GNU grep kiekviename šaltame teksto skenavime yra greitesni už Greph. Tikslai yra kitokie:
- Veikti pakankamai greitai, kad interaktyvus naudojimas ir agentų ciklai atrodytų natūralūs.
- Atsakyti į pasikartojančias užklausas iš įšilusių indeksų: indeksuotos regex, skaičiaus ir failų sąrašo užklausos greitesnės nei
rgirgrep, skenuojant tą patį medį. - Aplenkti
ast-grepindeksuoto ir podėlyje saugomo AST darbo krūviuose, kur Greph šilti podėliai leidžia išvengti pakartotinio medžio analizavimo. Šalto AST paieškos rezultatai nevienodi:new $CLASS()greitesnis užsg, oarray($$$ITEMS)lėtesnis. - Užtikrinti, kad kiekvieną našumo pagerinimą būtų galima išmatuoti ir atkartoti.
Našumo teiginiai, nepagrįsti našumo testų ataskaita, neįtraukiami.