
# Teste de performanță

Depozitul include un instrument de testare a performanței în `bin/` și `benchmarks/`. Acesta măsoară fiecare mod de căutare pe corpusuri reale (WordPress, Laravel) și seturi de date sintetice generate, capturează rapoarte structurate și vă permite să comparați două serii de rapoarte.

Instrumentul face parte din depozit, nu din pachetul Composer: deoarece 0.2.3, `benchmarks/` și scripturile `bin/bench*` nu sunt incluse în pachet, rulați-le dintr-o clonă (`git clone https://github.com/inline0/greph && cd greph && composer install`).

Valorile publicate în [README](https://github.com/inline0/greph#performance) provin din rulări GitHub Actions, niciodată de pe mașini locale. Rulările locale sunt utile pentru iterații; rulările CI sunt sursa de referință.

## Corpusuri

Corpusurile sintetice (`synthetic-1k`, `synthetic-10k`, `synthetic-100k-single`) sunt generate în `benchmarks/corpora/synthetic/` la prima rulare. Corpusurile reale nu sunt incluse: clonați depozitul în `benchmarks/corpora/wordpress` sau `benchmarks/corpora/laravel` (fluxul CI clonează `WordPress/WordPress` cu `--depth=1`). Corpusurile al căror director lipsește sunt omise.

## Rularea testelor de performanță

```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` compară două fișiere cu serii (rezultatul `bench-series` sau `bench-aggregate`) și afișează un rezumat Markdown, util la optimizarea unei căi critice. `bin/bench-ci` declanșează fluxul de lucru Benchmark pe GitHub Actions prin `gh` CLI.

## Categorii

README publică opt grupuri de rezultate, fiecare măsurând un anumit nivel al motorului. Fiecare grup reunește una sau mai multe categorii ale instrumentului definite în `benchmarks/suites/`.

### Modul de scanare: text

Căutare nativă în text, cu modele literale, regex și combinate. Linia de bază publicată rulează pe corpusul WordPress și include:

- `function` literal
- Literal fără diferențiere între majuscule și minuscule
- Literal ca cuvânt întreg
- Instanță regex nouă
- Apel cu matrice regex
- Literal prefix regex
- Literal sufix regex
- Literal exact pe linie regex
- Compactare literală regex

### Modul de scanare: parcurgere

Doar parcurgerea fișierelor, fără căutare. Măsoară costul parcurgerii care ține cont de gitignore, independent de celelalte operații.

### Modul de scanare: text paralel

Căutare cu șir fix pentru `function`, cu `1`, `2` și `4` procese de lucru. Pentru acest model, grupul de procese pornește doar peste `jobs * 4_000` fișiere (consultați [Lucrători paraleli](https://greph.inline0.dev/ro/docs/advanced/parallel)), mai multe decât are corpusul WordPress, așadar toate cele trei rânduri publicate rulează într-un singur proces și nu ilustrează scalarea grupului ([#8](https://github.com/inline0/greph/issues/8)).

### Modul de scanare: AST

Căutare AST nativă pentru modele reprezentative:

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

### Modul text indexat

Căutare text indexată încălzită, folosind aceleași modele ca modul de scanare. Include interogări literale, fără diferențiere între majuscule și minuscule, pentru cuvinte întregi, tokenuri scurte și regex.

### Interogări rezumative indexate

Căutare text indexată încălzită, cu rezultate de tip număr, fișiere cu potriviri și fișiere fără potriviri. Acestea beneficiază cel mai mult de depozitul de postări, deoarece operația per fișier este cea mai ieftină.

### AST indexat / memorat în cache

Căutare încălzită a faptelor AST și căutare AST memorată în cache, folosind aceleași modele ca modul de scanare AST.

### Costuri de compilare

Costurile compilării la rece pentru indexul trigramă, indexul de fapte AST și memoria cache AST. Utile pentru a decide ce mod să întrețineți pentru o anumită sarcină.

## Interpretarea valorilor publicate

README publică un instantaneu al celei mai recente rulări CI pentru fiecare linie de bază. Fiecare secțiune provine dintr-o anumită rulare GitHub Actions și este etichetată cu corpusul, executorul, versiunea PHP și numărul de rulări și încălziri măsurate. Pentru a reproduce o valoare, folosiți local aceeași combinație.

Coloanele de comparație (`rg`, `grep`, `sg`) sunt colectate în aceeași sarcină, pe același executor și pe același corpus. Nu sunt extrapolate din teste externe.

## Adăugarea unui test de performanță

1. Adăugați o definiție a testului de performanță în `benchmarks/`.
2. Adăugați un scenariu corespunzător în suita de regresie dacă nu există deja unul echivalent (astfel încât comportamentul măsurat să fie și verificat).
3. Rulați `./bin/bench --category <yours>` pentru a valida noul test de performanță.
4. Comparați cu `main` folosind fluxul de lucru Benchmark, care rulează la cererile de integrare ce modifică `src/`, `benchmarks/` sau `bin/` și publică o comparație între versiunea de bază și cea curentă în rezumatul rulării.
5. Actualizați tabelul README după ce rularea CI care include noul test de performanță ajunge în `main`.

## Filosofia performanței

Greph nu încearcă să depășească ripgrep sau grep la scanările la rece. Ripgrep este implementat în Rust cu scanare literală SIMD optimizată manual, iar valorile publicate arată că atât `rg`, cât și GNU `grep` sunt mai rapide decât Greph la fiecare scanare text la rece. Obiectivele sunt diferite:

- Să fie suficient de rapid pentru ca utilizarea interactivă și buclele agenților să pară native.
- Să răspundă interogărilor repetate folosind indexuri încălzite: interogările regex indexate, cele de numărare și cele care listează fișiere sunt mai rapide decât atât `rg`, cât și `grep` la scanarea aceluiași arbore.
- Să depășească `ast-grep` la sarcinile AST indexate și memorate în cache, unde cache-urile încălzite ale Greph evită reanalizarea arborelui. Căutarea AST la rece are rezultate mixte: `new $CLASS()` este mai rapid decât `sg`, iar `array($$$ITEMS)` este mai lent.
- Să facă fiecare îmbunătățire a performanței măsurabilă și reproductibilă.

Afirmațiile despre performanță care nu sunt susținute de un raport de testare nu sunt integrate.
