
# Prestanda & testning

TailwindPHP prioriterar korrekthet. Ändringar specifika för PHP som ökar hastigheten utan att ändra utdata tillämpas och märks med `@port-deviation:performance`. Likvärdighet med TailwindCSS tas inte för given – den verifieras kontinuerligt mot Tailwinds egen testsvit.

## Prestanda

Portningen av PHP prioriterar att matcha utdata från TailwindCSS framför rå genomströmning, och originalet TypeScript är ändå snabbare – JIT-kompilatorn i V8 kompilerar de mest använda kodvägarna till maskinkod på ett sätt som PHP inte kan matcha. För CSS som genereras per begäran eller sida återanvänder du en kompilator (se [generateExact()](https://tailwindphp.inline0.dev/sv/docs/api#accumulating-vs-exact-generation)) och sparar dess konstruktionstillstånd med [`stateCacheFile`](https://tailwindphp.inline0.dev/sv/docs/advanced/caching#compiler-state-cache).

Några mycket använda kodvägar har handoptimerats så att de **bevarar identisk utdata**:

- **`ast.php` `toCss()`** – samlar fragment i en array och anropar `implode` en gång i stället för att upprepade gånger slå ihop strängar, och använder förberäknade indragna strängar.
- **`css-parser.php`** – jämför tecken direkt i stället för att gå via `ord()`, och håller reda på buffertlängder i stället för att räkna om `strlen()`.

Båda dokumenteras med `@port-deviation:performance` och styrs av testsviten – de kan inte ändra genererad CSS.

### Riktmärken

Katalogen `benchmarks/` innehåller ett jämförelseverktyg. Kör det med:

```bash
composer bench         # PHP vs TypeScript
composer bench:save    # write benchmarks/results.json
```

Exempelresultat på PHP 8.4.5 / Node.js v22.17.0 (Apple M1):

| Riktmärke | PHP | TypeScript |
|-----------|-----|------------|
| `css-parser` på preflight.css | ~816 ops/s | ~15.45K ops/s (≈20× snabbare) |
| `toCss` | ~65.85K ops/s | ~2.59M ops/s (≈39× snabbare) |

TypeScript är snabbare för dessa lågnivåoperationer, som väntat. För generering av CSS för hela sidor – det faktiska användningsfallet – är prestandan i PHP tillräcklig (cirka 14 ms per sida i provkörningen). Vid upprepad identisk indata eliminerar [filcachen](https://tailwindphp.inline0.dev/sv/docs/advanced/caching) kostnaden helt.

## Testning och likvärdighet

Tester säkerställer att portningen av PHP ger samma utdata som TailwindCSS. Två metoder kompletterar varandra.

**1. Extraktionsbaserade tester.** Skript i `test-coverage/` tolkar TailwindCSSs egna `.test.ts`-filer och extraherar testfallen till JSON. Därefter kör PHPUnit fallen genom TailwindPHP och jämför utdata med förväntad CSS. Eftersom förväntningarna kommer direkt från uppströms syns varje avvikelse i PHPs beteende som ett fel. Tester täcker komplexa delar: verktyg, varianter, integration, CSS-funktioner och tester på webbläsarnivå för `ui.spec`.

**2. Handporterade enhetstester.** Enklare TypeScript-testfiler (AST, CSS-tolkning, escaping, kandidattolkning, värdetolkning, …) porteras direkt till PHP och ligger bredvid källkoden som `*.test.php`. De speglar originalens struktur och kontroller.

Testloopen är **extrahera → kör → verifiera**: extrahera på nytt från den aktuella referensen TailwindCSS, kör sviten och upptäck alla avvikelser. Det håller portningen i takt med uppströms och innebär att en uppdatering av TailwindCSS kan verifieras mekaniskt i stället för genom granskning. Avvikelser gör att CI misslyckas.

```bash
composer extract   # re-extract test cases from the TailwindCSS reference
composer test      # run the full suite
```

Från och med version 1.7.0 (referensen TailwindCSS v4.3.3) är 4,427 tester godkända:

| Testsvit | Tester | Källa |
|-------|-------|--------|
| Extraherade TailwindCSS-sviter (verktyg 706, varianter 164, index 148, css-funktioner 64, `ui.spec` 68) | 1,150 | extraherade från `.test.ts` / `.spec.ts` |
| API-täckning (verktyg, modifierare, varianter, direktiv, plugin-program, importer, `@source`, cachning, publikt API) | 2,252 | `tests/` |
| Enhetstester intill källkoden (parser, AST, kandidater, tema, verktyg, selektorparser, lightningcss-transformeringar, minifierare) | 767 | portningar av `*.test.php` och tester specifika för PHP |
| CLI (argumenttolkning, utdata, byggen) | 84 | `tests/Cli*Test.php` |
| Plugin-portningar (typografi, formulär) | 45 | `*.test.php` intill plugin-programmen |
| Kompletterande bibliotek (clsx, tailwind-merge, CVA) | 129 | referenssviter |

## Kodkvalitet

Formatering och statisk analys körs via skript för Composer:

```bash
composer lint      # Pint --test  (check formatting)
composer format    # Pint         (fix formatting)
composer analyse   # PHPStan      (static analysis, level 4)
composer quality   # lint + analyse
```

PHPStan körs på nivå 4 (`phpstan.neon`), med en kort lista ignorerade mönster för de dynamiska arrayformer som den funktionsbaserade arkitekturen använder. Alla källfiler analyseras; testfiler undantas.

Se [Arkitektur](https://tailwindphp.inline0.dev/sv/docs/advanced/architecture) för strukturen som testerna verifierar och var avvikelser dokumenteras.
