
# 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](https://shikiphp.inline0.dev/tr/docs/architecture#the-scanner-and-its-pcre-fast-path)).

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`](https://shikiphp.inline0.dev/tr/docs/options#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).
