Απόδοση
Το shikiphp εκτελεί πραγματική ανάλυση σε tokens TextMate με καθαρό PHP, επομένως αξίζει να είμαστε σαφείς για το πού είναι γρήγορο και πού όχι.
Τι να περιμένετε
Υπολογίστε δεκάδες έως εκατοντάδες χιλιοστά του δευτερολέπτου ανά αρχείο, όχι μικροδευτερόλεπτα. Ο αναλυτής σε tokens αποθηκεύει προσωρινά τους μεταγλωττισμένους κανόνες και σαρωτές, οι γραμματικές φορτώνονται καθυστερημένα (ένα δείγμα που δεν χρησιμοποιεί ποτέ ενσωματωμένη γλώσσα δεν επιβαρύνεται με την αποκωδικοποίησή της) και τα περισσότερα μοτίβα γραμματικών εκτελούνται μέσω του εγγενούς preg_* σε μια γρήγορη διαδρομή PCRE με έλεγχο ισοδυναμίας, ενώ ο αντιστοιχιστής pure-PHP αναλαμβάνει τα υπόλοιπα (δείτε την Αρχιτεκτονική).
Οι χρόνοι αυτοί προέρχονται από μία θερμή κλήση στον δείκτη επιδόσεων του αποθετηρίου (bench/bench.php, θέμα github-dark) σε ένα μηχάνημα, για αρχεία συλλογών κώδικα περίπου 55 έως 105 γραμμών:
| Γραμματική | PHP 8.2 | PHP 8.4 |
|---|---|---|
| JSON, YAML | 30–65 ms | 25–45 ms |
| CSS, HTML | 100–120 ms | 80–100 ms |
| Python, Rust, Go, Bash, Markdown | 190–220 ms | 125–175 ms |
| PHP | περίπου 290 ms | περίπου 170 ms |
| TypeScript, TSX | 490–510 ms | 310–370 ms |
Η πρώτη κλήση μιας γλώσσας σε μια διεργασία επιβαρύνεται επίσης με τη φόρτωση και μεταγλώττιση της γραμματικής, μία φορά: στις ίδιες εκτελέσεις, αυτό κυμάνθηκε από 50–70 ms για το JSON έως λίγο παραπάνω από ένα δευτερόλεπτο για το Markdown. Το κόστος αυξάνεται ανάλογα με την πολυπλοκότητα της γραμματικής και το μέγεθος της εισόδου, ενώ οι μετρήσεις αλλάζουν ανάλογα με το υλικό, οπότε κάντε δικές σας μετρήσεις: σε ένα αντίγραφο του αποθετηρίου, εκτελέστε το composer install και έπειτα το composer bench.
Προστατευτικά όρια
Η μηχανή regex περιλαμβάνει απομνημόνευση αποτυχιών και προστασία από ReDoS, ώστε ένα παθολογικό μοτίβο να επιβραδύνεται αντί να κολλά. Μπορείτε επίσης να περιορίσετε την εργασία ανά γραμμή με το tokenizeMaxLineLength, το οποίο παράγει ένα απλό token για κάθε γραμμή που φτάνει ή ξεπερνά ένα δεδομένο μήκος — προστασία από κακόβουλες εισόδους μίας γραμμής.
Προσωρινή αποθήκευση σε περιβάλλον παραγωγής
Ο αξιόπιστος τρόπος να μην επιβαρύνετε τη διαδρομή αιτημάτων με την επισήμανση είναι να μην την εκτελείτε σε κάθε αίτημα. Η επισήμανση του ίδιου κώδικα με τις ίδιες επιλογές παράγει πάντα το ίδιο HTML, επομένως η προσωρινή αποθήκευσή του είναι ιδανική:
- Εκτελέστε την επισήμανση κατά τη δημιουργία για στατικούς ιστότοπους και τεκμηρίωση.
- Αποθηκεύστε προσωρινά το αποδοσμένο HTML (με κλειδί τον κώδικα και τις επιλογές) για αποσπάσματα που παρέχονται από χρήστες ή αποθηκεύονται σε βάση δεδομένων και χρησιμοποιήστε το ξανά μέχρι να αλλάξει η πηγή.
Μέσα σε μια διεργασία, χρησιμοποιήστε ξανά ένα μόνο εργαλείο επισήμανσης (το facade του Shikiphp το κάνει για εσάς), ώστε οι προσωρινές μνήμες γραμματικών και θεμάτων να είναι κοινές σε όλες τις κλήσεις.