تخطٍّ إلى المحتوى
العودة إلى التوثيق
06PERFORMANCE

الأداء

زمن البدء البارد، وحجم الملف الثنائي، والمنهجية وراء كل رقم منشور. يضيف فحص ‎--code‎ الافتراضي مرحلة whitebox وفحص اعتماديات (govulncheck / ثغرات الحزم) فوق فحص الأسرار — تغطية أوسع جاهزة، بتكلفة بدء ثابتة ~40 مللي ثانية لم يدفعها مسار v0.11 المقتصر على الأسرار. استخدم ‎--fast‎ لتخطّيها.

زمن البدء على البارد

الزمن من تنفيذ fendix scan حتى الخروج بإخراج JSON على stdout. يشمل إنشاء العملية، وتحليل المعطيات، وإعداد الفحص، وتنفيذ الفحص، وعرض JSON، والخروج. تُمسح الذاكرة المؤقتة بين كل تشغيل بحيث يتحمّل كل استدعاء تكلفة البدء على البارد كاملةً.

التهيئةp50p95المتوسطحد الخروج في الـ CI
v1.0.0— الافتراضي الحالي؛ يضيف مرحلة whitebox وفحص اعتماديات بعد الأسرار (~40 مللي ثانية، ثابتة غالبًا)43 ms44 ms43 ms✅ ‎11× أسرع من حد 500 مللي ثانية
v1.0.0 + --python-engine— محرّك whitebox اختياري؛ مقارِب للافتراضي، لأن الافتراضي يدفع بالفعل تكلفة مرحلة whitebox43 ms46 ms44 ms✅ ‎11× أسرع من حد 500 مللي ثانية
v0.11.0 الافتراضي— ما يأتي به الإصدار v0.116.1 ms7.0 ms6.1 ms✅ أسرع بـ 82× من 500 ms
v0.11.0 + --python-engine— مسار whitebox القديم الاختياري (+ TASK-134 لاجتياز المسارات)40.7 ms45.1 ms41.3 ms✅ أسرع بـ 12× من 500 ms
v0.9.0 الافتراضي— خط الأساس TASK-1185.6 ms6.3 ms5.6 ms✅ أسرع بـ 89× من 500 ms
v0.8.0— قبل المرحلة 17b، مع Python مضمّن7.3 ms8.1 ms7.2 ms✅ أسرع بـ 68× من 500 ms

المللي ثانية الإضافية تشتري فحصًا أعمق بكثير.

فحص --code الافتراضي يفعل أكثر من البحث عن الأسرار: فهو يُشغّل مرحلة whitebox وفحص اعتماديات كاملة — مُحلّل تتبّع AST (تدفّق بيانات بين الإجراءات مع ربط مسارات مُثبَتة)، وفحص ثغرات الاعتماديات الانتقالية (govulncheck + OSV)، ووحدة DAST تشمل أعلام الكوكيز وإعادة التوجيه المفتوحة وترويسة المضيف وGraphQL والتلاعب بالطرق وتحديد المعدّل. هذه التغطية الأعمق هي سبب بقاء زمن البدء البارد قرب ~43 مللي ثانية بدل بضعة مللي ثوانٍ — ويبقى ضمن حد الـ CI البالغ 500 مللي ثانية بـ 11 ضعفًا. تحتاج السرعة القديمة لخطّاف ما قبل الالتزام؟ --fast يُسقط المرحلة الثقيلة.

v1.0.0 الافتراضي مقابل الاختياري

≈ متقارب

43 مللي ثانية مقابل 43 مللي ثانية (p50) — تكلفة بدء محرّك Python التي هيمنت في الإصدارات السابقة باتت ضئيلة بجانب الماسحات الأصلية.

أين يذهب الوقت

مرحلة whitebox

كان الافتراضي في v0.11 يُشغّل الأسرار فقط وينتهي في ~2 مللي ثانية. يضيف الافتراضي الحالي مرحلة whitebox وفحص اعتماديات (الـ ~40 مللي ثانية بين 'اكتمال الأسرار' و'اكتمال whitebox' في التتبّع). إنها تكلفة ثابتة لا تتناسب مع حجم المستودع، وليست semgrep (تُتخطّى إن غابت) — مرّر ‎--fast‎ لإسقاطها لسرعة ما قبل الالتزام.

حد الخروج في الـ CI

~11× أسرع

الهدف <500 مللي ثانية (p50) لفحوصات الشيفرة فقط. الافتراضي في v1.0.0 = 43 مللي ثانية p50 (الحد الأدنى 42)، ضمن الحد بأريحية.

المنهجية

نقيس التكلفة كما يُدركها المستخدم — الزمن الفعلي من كتابة fendix scan حتى استلام JSON. ستلتقط معايير الأداء الداخلية لـ Go منتصف هذا المسار فقط؛ أما أداة القياس فتستخدم دالة Python time.monotonic() حول subprocess.run بحيث يُحتسب إنشاء العملية وتحليل المعطيات وإعداد الفحص وتنفيذ الفحص وعرض JSON والخروج جميعها.

بيانات الاختبار

python/tests/fixtures/secrets_target/ — 5 ملفات صغيرة، و30 نتيجة أسرار. تَعزِل بيانات اختبار صغيرة التكلفةَ الثابتة للبدء على البارد عن التكلفة المتغيرة لفحص قاعدة كود كبيرة. ستُظهر قواعد الكود الأكبر أرقامًا مطلقة أكبر؛ أما الفارق بين PRE/POST فيبقى ثابتًا (وهو تكلفة بدء Python التي أزلناها).

حجم العينة

30 تشغيلًا لكل تهيئة. يُمسح الدليل ~/.fendix/engine قبل كل تشغيل بحيث يتحمّل كل استدعاء تكلفة البدء على البارد كاملةً (دون ذاكرة مؤقتة دافئة).

العتاد

معالج Apple M-series، وكِلا الملفين التنفيذيين مبنيّان بـ go build -ldflags="-s -w". ستتوسع الأرقام بشكل متوقع على x86_64 — تبقى الفوارق النسبية بين PRE/POST وبين الافتراضي/الاختياري ثابتة عبر مختلف المعماريات.

حجم الملف التنفيذي

البناءبايتΔ
PRE-TASK-118 (مع Python مضمّن)19,002,482
POST-TASK-118 (دون Python مضمّن)18,903,282−99,200 (−0.5 %)

الفارق في الحجم صغير لأن بناء Python للملف التنفيذي يضغط النص المضمّن بقوة. المكسب الحقيقي هو وضعية الاعتماديات — لم يعد fendix يتطلب مُفسّر Python على الإطلاق في المسار الافتراضي؛ يمكن للمستخدمين الآن تشغيل الفحوصات على أجهزة دون تثبيت Python (مشغّلات CI، حاويات distroless، الأنظمة المضمّنة).

إعادة الإنتاج محليًا

كل رقم في هذه الصفحة قابل لإعادة الإنتاج. استنسخ مستودع المحرّك وشغّل أداة القياس — بالمنهجية ذاتها، وبيانات الاختبار ذاتها، وأداة القياس ذاتها التي أنتجت الأرقام المنشورة.

terminal
# Build the binary then run the cold-start benchmark
make build
python3 scripts/bench/coldstart.py

# Output (v1.0.0, Apple M-series arm64, 2026-07-01; 30 runs, ~/.fendix/engine wiped per run):
#
#   binary:  ./bin/fendix
#   fixture: python/tests/fixtures/secrets_target
#   runs:    30
#
#   [default (no Python whitebox)] N=30  min=41.7 p50=42.9 p95=44.4 mean=43.3 (ms)
#   [--python-engine (opt-in)]     N=30  min=42.1 p50=43.2 p95=45.7 mean=43.5 (ms)
#
# Note: the default --code path runs the full native check suite (secrets,
# semgrep, deps, textscan, + DAST checks), so cold-start is higher than the
# v0.11 secrets-only path. With --python-engine ~on par with default, both
# stay an order of magnitude under the 500 ms CI gate.

جرّب المسار الاختياري

هل تريد فحوصات whitebox القديمة بلغة Python (المصادقة، الحقن، تحليل AST)؟ أضِف --python-engine — يتطلب شجرة python/ محلية أو FENDIX_ENGINE يشير إلى واحدة.

terminal
# Default — no Python required, fastest path
fendix scan --code ./src --format json

# Opt back into the Python whitebox engine
# (requires a local python/ tree or FENDIX_ENGINE pointing at one)
fendix scan --code ./src --python-engine --format json

للتعمّق أكثر

  • /accuracy — بطاقة درجات الدقة/الاستدعاء: F1 = 1.000 على المجموعة الاصطناعية المُوسومة، إضافةً إلى نتائج أهداف DAST وSAST الواقعية.
  • سجل تغييرات v0.9.0 — أعمال زمن البدء البارد من v0.9 إلى v0.11 (أسرار Go أصلية، غلاف Semgrep، دون Python مضمّن).
  • مرجع CLI — كل راية، بما في ذلك --python-engine و --no-native-deps.
  • البنية المعمارية — ADR-001 وملاحظة تطوّر المحرّك الأصلي.
  • docs/benchmarks.md — المصدر الأصلي للأرقام في هذه الصفحة (يُحافَظ على تزامنه).