Lewati ke konten

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.