İçeriğe geç

Performans

shikiphp, saf PHP içinde gerçek TextMate belirteçleme yapar; bu nedenle hangi durumlarda hızlı olduğunu ve olmadığını açıkça belirtmek gerekir.

Neler beklenmeli

Dosya başına mikrosaniyeler değil, onlarca ila yüzlerce milisaniye bekleyin. Belirteç ayrıştırıcısı derlenmiş kuralları ve tarayıcıları önbelleğe alır, dilbilgileri gerektiğinde yüklenir (gömülü bir dile hiç dokunmayan örnek, o dili çözümleme maliyetine katlanmaz) ve dilbilgisi desenlerinin çoğu eşdeğerlik denetimli PCRE hızlı yolunda yerel preg_* üzerinden çalışır; geri kalanını saf PHP eşleştiricisi işler (bkz. Mimari).

Bunlar, depodaki kıyaslama aracından (bench/bench.php, tema github-dark) alınmış, tek bir makinede yaklaşık 55 ila 105 satırlık derlem dosyaları için, ön ısıtmalı tek çağrı süreleridir:

Dilbilgisi 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 yaklaşık 290 ms yaklaşık 170 ms
TypeScript, TSX 490–510 ms 310–370 ms

Bir dilin süreçteki ilk çağrısında tek seferlik dilbilgisi yükleme ve derleme maliyeti de vardır: aynı çalıştırmalarda bu süre JSON için 50–70 ms, Markdown içinse bir saniyeyi biraz aşan bir değerdi. Maliyet, dilbilgisi karmaşıklığına ve girdi boyutuna göre değişir; donanıma bağlı olarak süreler de farklılaşır. Bu yüzden kendi ortamınızda ölçün: depoyu klonlayıp önce composer install, ardından composer bench komutunu çalıştırın.

Güvenlik önlemleri

Düzenli ifade altyapısı, başarısızlıkları belleğe alma ve ReDoS koruması içerir; böylece sorunlu bir desen sistemi kilitlemek yerine yavaşlar. Ayrıca, tokenizeMaxLineLength ile satır başına yapılan işi sınırlayabilirsiniz. Bu seçenek, belirlenen uzunluğa eşit veya daha uzun satırları tek bir düz metin belirtecine dönüştürerek tek satırlık kötü amaçlı girdilere karşı koruma sağlar.

Üretimde önbellekleme

Vurgulama işleminin istek yolunu etkilemesini önlemenin güvenilir yolu, onu her istekte çalıştırmamaktır. Aynı kodu aynı seçeneklerle vurgulamak her zaman aynı HTML sonucunu üretir; bu nedenle önbelleğe almak çok etkilidir:

  • Statik siteler ve dokümantasyon için derleme zamanında vurgulama yapın.
  • Kullanıcı tarafından sağlanan veya veritabanında saklanan parçalar için oluşturulan HTML çıktısını (kod + seçeneklere göre anahtarlanmış olarak) önbelleğe alın ve kaynak değişene kadar yeniden kullanın.

Dilbilgisi ve tema önbelleklerinin çağrılar arasında paylaşılması için süreç içinde tek bir vurgulayıcıyı yeniden kullanın (Shikiphp arayüzü bunu sizin için yapar).