
# Απόδοση & δοκιμές

Το TailwindPHP δίνει προτεραιότητα πρώτα στην ορθότητα. Όπου μια αλλαγή ειδικά για το PHP επιταχύνει τη λειτουργία χωρίς να αλλάζει την έξοδο, εφαρμόζεται και επισημαίνεται ως `@port-deviation:performance`. Η ισοτιμία με το TailwindCSS δεν θεωρείται δεδομένη — επαληθεύεται συνεχώς με τη δική του σουίτα δοκιμών του Tailwind.

## Απόδοση

Το port PHP δίνει προτεραιότητα στην αντιστοίχιση της εξόδου του TailwindCSS έναντι της ακατέργαστης απόδοσης, ενώ το αρχικό TypeScript παραμένει ούτως ή άλλως ταχύτερο — το JIT του V8 μεταγλωττίζει τις κρίσιμες διαδρομές σε εγγενή κώδικα, κάτι που το PHP δεν μπορεί να ανταγωνιστεί. Για CSS που παράγεται ανά αίτημα ή σελίδα, επαναχρησιμοποιήστε έναν μεταγλωττιστή (βλ. [generateExact()](https://tailwindphp.inline0.dev/el/docs/api#accumulating-vs-exact-generation)) και διατηρήστε την κατάσταση κατασκευής του με [`stateCacheFile`](https://tailwindphp.inline0.dev/el/docs/advanced/caching#compiler-state-cache).

Ορισμένες κρίσιμες διαδρομές έχουν χειροκίνητα ρυθμισμένες βελτιστοποιήσεις που **διατηρούν πανομοιότυπη έξοδο**:

- **`ast.php` `toCss()`** — συγκεντρώνει τμήματα σε έναν πίνακα και εκτελεί `implode` μία φορά αντί για επανειλημμένη συνένωση συμβολοσειρών, ενώ χρησιμοποιεί προϋπολογισμένες συμβολοσειρές εσοχής.
- **`css-parser.php`** — συγκρίνει απευθείας χαρακτήρες αντί να περνά από το `ord()` και παρακολουθεί τα μήκη των buffer αντί να επανυπολογίζει το `strlen()`.

Και οι δύο τεκμηριώνονται με `@port-deviation:performance` και ελέγχονται από τη σουίτα δοκιμών — δεν μπορούν να αλλάξουν το παραγόμενο CSS.

### Δοκιμές επιδόσεων

Ο κατάλογος `benchmarks/` περιέχει ένα εργαλείο σύγκρισης. Εκτελέστε το με:

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

Ενδεικτικά αποτελέσματα σε PHP 8.4.5 / Node.js v22.17.0 (Apple M1):

| Δοκιμή επιδόσεων | PHP | TypeScript |
|-----------|-----|------------|
| `css-parser` σε preflight.css | ~816 ops/s | ~15.45K ops/s (≈20× ταχύτερο) |
| `toCss` | ~65.85K ops/s | ~2.59M ops/s (≈39× ταχύτερο) |

Το TypeScript είναι ταχύτερο σε αυτές τις λειτουργίες χαμηλού επιπέδου, όπως αναμενόταν. Για τη δημιουργία CSS ολόκληρης σελίδας — την πραγματική περίπτωση χρήσης — η απόδοση του PHP είναι επαρκής (περίπου 14 ms ανά σελίδα στην ενδεικτική εκτέλεση). Για επαναλαμβανόμενη ίδια είσοδο, η [προσωρινή αποθήκευση αρχείων](https://tailwindphp.inline0.dev/el/docs/advanced/caching) μηδενίζει πλήρως το κόστος.

## Δοκιμές & ισοτιμία

Οι δοκιμές διασφαλίζουν ότι το port PHP παράγει την ίδια έξοδο με το TailwindCSS. Δύο προσεγγίσεις λειτουργούν συνδυαστικά.

**1. Δοκιμές βάσει εξαγωγής.** Τα σκριπτ στο `test-coverage/` αναλύουν τα ίδια τα αρχεία `.test.ts` του TailwindCSS και εξάγουν τις περιπτώσεις δοκιμών στο JSON. Στη συνέχεια, το PHPUnit τροφοδοτεί αυτές τις περιπτώσεις στο TailwindPHP και συγκρίνει την έξοδο με το αναμενόμενο CSS. Καθώς οι αναμενόμενες τιμές προέρχονται απευθείας από το upstream έργο, κάθε απόκλιση στη συμπεριφορά του PHP εμφανίζεται ως αποτυχία. Καλύπτονται τα σύνθετα μέρη: βοηθητικές συναρτήσεις, παραλλαγές, ενσωμάτωση, συναρτήσεις CSS και δοκιμές `ui.spec` σε επίπεδο προγράμματος περιήγησης.

**2. Μεταφερμένες χειροκίνητα δοκιμές μονάδας.** Τα απλούστερα αρχεία δοκιμών του TypeScript (AST, ανάλυση CSS, διαφυγή χαρακτήρων, ανάλυση υποψηφίων, ανάλυση τιμών, …) μεταφέρονται απευθείας στο PHP και βρίσκονται δίπλα στον πηγαίο κώδικα ως `*.test.php`, ακολουθώντας τη δομή και τις επιβεβαιώσεις των αρχικών.

Ο κύκλος είναι **εξαγωγή → εκτέλεση → επαλήθευση**: εξαγωγή ξανά από την τρέχουσα αναφορά του TailwindCSS, εκτέλεση της σουίτας και αποτυχία σε κάθε απόκλιση. Έτσι το port παραμένει συγχρονισμένο με το upstream και μια ενημέρωση του TailwindCSS μπορεί να επαληθευτεί μηχανικά, χωρίς επιθεώρηση. Οι αποκλίσεις αποτυγχάνουν στο CI.

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

Υπάρχουν **4,427 επιτυχείς δοκιμές** από την έκδοση 1.7.0 (αναφορά TailwindCSS v4.3.3):

| Σουίτα | Δοκιμές | Πηγή |
|-------|-------|--------|
| Εξαγόμενες σουίτες TailwindCSS (βοηθητικές συναρτήσεις 706, παραλλαγές 164, index 148, css-functions 64, `ui.spec` 68) | 1,150 | εξήχθησαν από `.test.ts` / `.spec.ts` |
| Κάλυψη API (βοηθητικές συναρτήσεις, τροποποιητές, παραλλαγές, οδηγίες, πρόσθετα, εισαγωγές, `@source`, προσωρινή αποθήκευση, δημόσιο API) | 2,252 | `tests/` |
| Δοκιμές μονάδας δίπλα στον πηγαίο κώδικα (αναλυτής, AST, υποψήφια, θέμα, βοηθητικές συναρτήσεις, αναλυτής επιλογέων, μετασχηματισμοί lightningcss, minifier) | 767 | port του `*.test.php` και δοκιμές ειδικά για το PHP |
| CLI (ανάλυση ορισμάτων, έξοδος, builds) | 84 | `tests/Cli*Test.php` |
| Port πρόσθετων (τυπογραφία, φόρμες) | 45 | `*.test.php` δίπλα στα πρόσθετα |
| Συνοδευτικές βιβλιοθήκες (clsx, tailwind-merge, CVA) | 129 | σουίτες αναφοράς |

## Ποιότητα κώδικα

Η μορφοποίηση και η στατική ανάλυση εκτελούνται μέσω σκριπτ 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 εκτελείται στο επίπεδο 4 (`phpstan.neon`), με σύντομη λίστα μοτίβων που αγνοούνται για τα δυναμικά σχήματα πινάκων που χρησιμοποιεί η αρχιτεκτονική βάσει συναρτήσεων. Αναλύονται όλα τα αρχεία πηγαίου κώδικα· εξαιρούνται τα αρχεία δοκιμών.

Για τη δομή που επαληθεύουν αυτές οι δοκιμές και τις καταγεγραμμένες αποκλίσεις, δείτε την [Αρχιτεκτονική](https://tailwindphp.inline0.dev/el/docs/advanced/architecture).
