
# Veiktspējas testi

Repozitorijā ir veiktspējas testu sistēma mapē `bin/` un `benchmarks/`. Tā mēra katru meklēšanas režīmu ar reālām datu kopām (WordPress, Laravel) un ģenerētām sintētiskām datu kopām, apkopo strukturētus pārskatus un ļauj salīdzināt divas pārskatu sērijas.

Testu sistēma ir daļa no repozitorija, nevis Composer pakotnes: tā kā 0.2.3, `benchmarks/` un `bin/bench*` skripti pakotnē nav iekļauti, palaidiet tos no klona (`git clone https://github.com/inline0/greph && cd greph && composer install`).

Publicētie rezultāti [README ir iegūti GitHub Actions izpildes laikā, nekad no lokālām mašīnām](https://github.com/inline0/greph#performance). Lokālās izpildes noder izstrādei; CI izpildes ir galvenais informācijas avots.

## Datu kopas

Sintētiskās datu kopas (`synthetic-1k`, `synthetic-10k`, `synthetic-100k-single`) pirmajā palaišanas reizē tiek ģenerētas mapē `benchmarks/corpora/synthetic/`. Reālās datu kopas nav iekļautas: ievietojiet to repozitorija kopiju mapē `benchmarks/corpora/wordpress` vai `benchmarks/corpora/laravel` (CI darbplūsma klonē `WordPress/WordPress` ar `--depth=1`). Datu kopa, kuras direktorija trūkst, tiek izlaista.

## Veiktspējas testu palaišana

```bash
# 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` salīdzina divu sēriju failus (`bench-series` vai `bench-aggregate` izvadi) un izvada Markdown kopsavilkumu, kas noder, optimizējot intensīvi lietotu koda ceļu. `bin/bench-ci` aktivizē Benchmark darbplūsmu GitHub Actions, izmantojot `gh` CLI.

## Kategorijas

README publicē astoņas rezultātu grupas, katra mēra konkrētu dzinēja slāni. Katrā grupā ietilpst viena vai vairākas testu sistēmas kategorijas, kas definētas failā `benchmarks/suites/`.

### Skenēšanas režīms: teksts

Vietējā teksta meklēšana pēc burtiskām, regulāro izteiksmju un kombinētām veidnēm. Publicētais bāzes mērījums tiek veikts ar WordPress datu kopu un ietver:

- Burtiska `function`
- Burtiska, reģistrjutīga
- Burtiska, pilnam vārdam
- Regulārā izteiksme, jauna instance
- Regulāro izteiksmju masīva izsaukums
- Regulārā izteiksme, prefiksa burtiskā virkne
- Regulārā izteiksme, sufiksa burtiskā virkne
- Regulārā izteiksme, precīza rindas burtiskā virkne
- Regulārā izteiksme, burtisko virkņu apvienošana

### Skenēšanas režīms: pārlūkošana

Tikai failu pārlūkošana, bez meklēšanas. Mēra gitignore noteikumus ievērojošā pārlūka darbības izmaksas.

### Skenēšanas režīms: paralēlais teksts

Fiksētas virknes meklēšana `function` ar `1`, `2` un `4` uzdevumiem. Šai veidnei darbinieku kopums sāk darboties tikai tad, kad failu ir vairāk par `jobs * 4_000` (skatiet [Paralēlie darbinieki](https://greph.inline0.dev/lv/docs/advanced/parallel)); WordPress datu kopā to ir mazāk, tāpēc visas trīs publicētās rindas darbojas vienā procesā un neparāda kopuma mērogošanu ([#8](https://github.com/inline0/greph/issues/8)).

### Skenēšanas režīms: AST

Vietējā AST meklēšana pēc raksturīgām veidnēm:

- `new $CLASS()`
- `array($$$ITEMS)`

### Indeksētais teksta režīms

Uzsildīta indeksēta teksta meklēšana pēc tām pašām veidnēm kā skenēšanas režīmā. Ietver burtisku, reģistrjutīgu, pilna vārda, īsa tokena un regulāro izteiksmju vaicājumus.

### Indeksētie kopsavilkuma vaicājumi

Uzsildīta indeksēta teksta meklēšana ar rezultātiem, kas uzrāda skaitu, failus ar atbilstībām un failus bez atbilstībām. Tos visvairāk paātrina ierakstu krātuve, jo darbs katram failam ir vismazākais.

### Indeksēts / kešots AST

Uzsildīta AST faktu meklēšana un kešota AST meklēšana pēc tām pašām veidnēm kā AST skenēšanas režīmā.

### Būvēšanas izmaksas

Trigrammas indeksa, AST faktu indeksa un AST kešatmiņas aukstās būvēšanas izmaksas. Noder, izvēloties, kuru režīmu uzturēt konkrētai darba slodzei.

## Publicēto rezultātu lasīšana

README publicē jaunākās CI izpildes momentuzņēmumu katram bāzes mērījumam. Katra sadaļa iegūta konkrētā GitHub Actions izpildē un ir marķēta ar datu kopu, izpildītāju, PHP versiju, kā arī mērījumu un iesildīšanas reižu skaitu. Lai atkārtotu mērījumu, lokāli izmantojiet to pašu konfigurāciju.

Salīdzinājuma kolonnas (`rg`, `grep`, `sg`) tiek apkopotas vienā darbā, uz viena izpildītāja un ar vienu un to pašu datu kopu. Tās netiek ekstrapolētas no ārējiem veiktspējas testiem.

## Kā pievienot veiktspējas testu

1. Pievienojiet veiktspējas testa definīciju mapē `benchmarks/`.
2. Pievienojiet regresiju testu kopai atbilstošu scenāriju, ja tāda vēl nav (lai tiktu pārbaudīta arī mērītā darbība).
3. Palaidiet `./bin/bench --category <yours>`, lai pārbaudītu jauno veiktspējas testu.
4. Salīdziniet ar `main`, izmantojot Benchmark darbplūsmu, kas tiek palaista tajos izvilkšanas pieprasījumos, kuros mainīti `src/`, `benchmarks/` vai `bin/`, un izpildes kopsavilkumā publicē galvenes zara un pamatzara salīdzinājumu.
5. Atjauniniet README tabulu, kad CI izpilde ar jauno veiktspējas testu ir nonākusi `main`.

## Veiktspējas filozofija

Greph nemēģina aukstās skenēšanās pārspēt ripgrep vai grep. Ripgrep ir ieviests Rust ar manuāli pielāgotu SIMD burtisko virkņu skenēšanu, un publicētajos rezultātos gan `rg`, gan GNU `grep` katrā aukstajā teksta skenēšanā ir ātrāks par Greph. Mērķi ir citi:

- Būt pietiekami ātram, lai interaktīva lietošana un aģentu cikli šķistu dabiski.
- Atbildēt uz atkārtotiem vaicājumiem, izmantojot uzsildītus indeksus: indeksētās regulārās izteiksmes, skaita un failu saraksta vaicājumi ir ātrāki nekā gan `rg`, gan `grep` viena un tā paša koka skenēšana.
- Pārspēt `ast-grep` indeksētās un kešotās AST darba slodzēs, kur Greph uzsildītās kešatmiņas ļauj izvairīties no koka atkārtotas parsēšanas. Aukstā AST meklēšana dod jauktus rezultātus: `new $CLASS()` ir ātrāks par `sg`, bet `array($$$ITEMS)` ir lēnāks.
- Padarīt katru veiktspējas uzlabojumu izmērāmu un atkārtojamu.

Veiktspējas uzlabojumi, ko neapliecina veiktspējas testa pārskats, netiek pieņemti.
