Performa
shikiphp melakukan tokenisasi TextMate sungguhan dalam PHP murni, jadi penting untuk memahami dengan jujur bagian mana yang cepat dan mana yang tidak.
Yang dapat diharapkan
Perkirakan puluhan hingga ratusan milidetik per file, bukan mikrodetik. Tokenizer menyimpan aturan dan pemindai yang telah dikompilasi ke cache, tata bahasa dimuat secara malas (sampel yang tidak pernah menggunakan bahasa tertanam tidak perlu mendekodenya), dan sebagian besar pola tata bahasa berjalan melalui preg_* native pada jalur cepat PCRE yang telah diuji kesetaraannya, sementara pencocok PHP murni menangani sisanya (lihat
Arsitektur).
Ini adalah waktu hangat untuk satu pemanggilan dari benchmark repositori
(bench/bench.php, tema github-dark) pada satu mesin, untuk file korpus dengan
sekitar 55 hingga 105 baris:
| Tata bahasa | 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 | sekitar 290 ms | sekitar 170 ms |
| TypeScript, TSX | 490–510 ms | 310–370 ms |
Pemanggilan pertama untuk bahasa dalam suatu proses juga memerlukan waktu untuk memuat dan
mengompilasi tata bahasa: dalam pengujian yang sama, waktunya berkisar dari 50–70 ms untuk JSON hingga sedikit
lebih dari satu detik untuk Markdown. Biayanya meningkat sesuai kompleksitas tata bahasa dan ukuran masukan,
dan angka-angka ini berubah mengikuti perangkat keras, jadi ukur sendiri: dalam klona
repositori, jalankan composer install lalu composer bench.
Perlindungan keamanan
Mesin regex mencakup memoisasi kegagalan dan perlindungan ReDoS agar pola yang
bermasalah menurun kinerjanya alih-alih membuat proses macet. Anda juga dapat membatasi pekerjaan per baris
dengan tokenizeMaxLineLength, yang menghasilkan satu token teks biasa untuk setiap baris yang mencapai
atau melebihi batas panjang tertentu — perlindungan terhadap masukan satu baris yang berbahaya.
Cache di lingkungan produksi
Cara andal agar proses penyorotan tidak membebani jalur permintaan Anda adalah dengan tidak menjalankannya pada setiap permintaan. Penyorotan kode yang sama dengan opsi yang sama selalu menghasilkan HTML yang sama, sehingga hasilnya dapat di-cache dengan sempurna:
- Lakukan penyorotan saat build untuk situs statis dan dokumentasi.
- Cache HTML yang telah dirender (dengan kunci berupa kode + opsi) untuk cuplikan yang diberikan pengguna atau disimpan di basis data, lalu gunakan kembali hingga sumbernya berubah.
Dalam satu proses, gunakan kembali satu highlighter (fasad Shikiphp melakukannya untuk Anda) agar cache tata bahasa dan tema digunakan bersama di berbagai pemanggilan.