الأداء
ينفّذ shikiphp تقسيمًا حقيقيًا إلى رموز وفق TextMate باستخدام PHP بالكامل، لذا من المفيد توضيح المواضع التي يكون فيها سريعًا وتلك التي لا يكون فيها كذلك.
ما الذي يمكن توقعه
توقّع عشرات إلى مئات المللي ثانية لكل ملف، لا ميكروثوانٍ. يخزّن محلل الرموز القواعد والماسحات المترجمة مؤقتًا، وتُحمّل القواعد النحوية عند الحاجة (فالعينة التي لا تستخدم لغة مضمنة لا تتحمل تكلفة فك ترميزها)، وتعمل معظم أنماط القواعد عبر preg_* الأصلي باستخدام مسار PCRE سريع مشروط بالتكافؤ، بينما يتولى المطابق 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.
ضمانات السلامة
يتضمن محرك التعابير النمطية تخزينًا مؤقتًا للإخفاقات وحماية من ReDoS، كي يتدهور أداء النمط المرضي بدلًا من التعليق. ويمكنك أيضًا تحديد مقدار العمل لكل سطر باستخدام tokenizeMaxLineLength، الذي يُخرج رمزًا نصيًا عاديًا واحدًا لأي سطر يبلغ طولًا معينًا أو يتجاوزه — للحماية من المدخلات العدائية ذات السطر الواحد.
التخزين المؤقت في الإنتاج
الطريقة الموثوقة لإبعاد إبراز النص عن مسار الطلبات هي عدم تشغيله مع كل طلب. فإبراز الشيفرة نفسها بالخيارات نفسها ينتج دائمًا HTML نفسه، لذا يمكن تخزينه مؤقتًا بكفاءة تامة:
- أبرِز النص وقت البناء للمواقع الثابتة والتوثيق.
- خزّن HTML المعروض مؤقتًا (باستخدام الشيفرة والخيارات كمفتاح) للمقاطع التي يرسلها المستخدم أو المخزنة في قاعدة البيانات، وأعد استخدامه حتى يتغير المصدر.
داخل العملية، أعد استخدام أداة تمييز واحدة (واجهة Shikiphp تتولى ذلك نيابة عنك) لمشاركة ذاكرة القواعد النحوية والسمات بين الاستدعاءات.