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

الأداء

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

نطاق التنفيذ الحالي

بيئة التشغيل
لا تتطلب ملفات Go التنفيذية الجاهزة مترجم Go للفحص الأساسي. يتطلب البناء من المصدر Go 1.25+. لمحركات الفحص الاختيارية متطلبات تشغيل خاصة؛ راجع التغطية للتأكد من تنفيذها.
DAST
يفحص تحليل الروابط وواجهات API السلوك الظاهر أثناء التشغيل. تتطلب الاختبارات النشطة --enable-active. لا تثبت استجابة HTTP 200 وحدها الوصول إلى بيانات حساسة.
SAST
تغطي القواعد الساكنة الأصلية أنماطًا مدعومة في Go وJavaScript وJava والبنية التحتية. يوسع Semgrep ومحرك Python الاختياري الفحوصات المناسبة. دعم اللغة لا يعني تغطية جميع الأطر أو المسارات.
SCA
يستخدم تحليل Go أداة govulncheck. تستخدم محركات تبعيات Python وnpm ملفات التعريف والتثبيت المدعومة، ومنها poetry.lock وPipfile.lock وpackage-lock.json. قد تنقل استعلامات الثغرات أسماء الحزم وإصداراتها.
الأدلة والسياسة
يربط الترابط المشاهدات المتطابقة المدعومة؛ ليست لكل نتيجة مصادر متعددة. قد تكفي أدلة قوية من مصدر واحد. الشدة والثقة وحالة النتيجة وتوصية الإصدار مفاهيم منفصلة.
التغطية والمراجعة البشرية
قد يترك فشل محرك أو غياب أدلة مطلوبة الإصدار غير مكتمل. تعني PASS نتيجة وفق السياسة والتغطية المحددتين وليست ضمانًا للأمان أو موافقة بشرية.

جداول القياس أدناه ملاحظات تاريخية محددة النطاق. أعداد النتائج ودرجات الاختبارات الاصطناعية ليست مقاييس الدقة والاستدعاء في الإنتاج. لا ندعي وجود قياسات بديلة هنا.

اقرأ معالجة البيانات حسب طريقة النشر

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

الزمن من تنفيذ 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 القديم الاختياري (+ تغيير سابق لاجتياز المسارات)40.7 ms45.1 ms41.3 ms✅ أسرع بـ 12× من 500 ms
v0.9.0 الافتراضي— خط الأساس تغيير سابق5.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-تغيير سابق (مع Python مضمّن)19,002,482
POST-تغيير سابق (دون 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 — المصدر الأصلي للأرقام في هذه الصفحة (يُحافَظ على تزامنه).