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

الأداء

زمن البدء البارد، وحجم الملف التنفيذي، والمنهجية وراء كل رقم منشور. تحاول فحوصات --code الحالية تشغيل محرك Python تلقائيًا. تتخطى --fast كلًا من Semgrep وSCA الأصلي، لكنها لا تمنع تلك المحاولة؛ أضف --python-engine=false للمسار الأصلي السريع.

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

بيئة التشغيل
لا تتطلب ملفات 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— قياس افتراضي تاريخي للإصدار v1.0 مع مرحلة الصندوق الأبيض والاعتماديات الموسعة43 ms44 ms43 ms✅ ‎11× أسرع من حد 500 مللي ثانية
v1.0.0 + --python-engine— قياس تاريخي للإصدار v1.0 مع اشتراط محرك Python؛ مقارب للافتراضي43 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 الافتراضي— خط الأساس بعد إزالة بيئة Python المضمّنة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 أكثر من البحث عن الأسرار: تغطي المحللات الأصلية أنماط النص وSemgrep وثغرات الاعتماديات، ويضيف محرك Python تحليل AST وProven Path عند توفره. يقع قياس الحزمة الموسعة التاريخي قرب ~43 مللي ثانية، ويبقى ضمن حد CI البالغ 500 مللي ثانية بـ 11 ضعفًا. تتخطى --fast كلًا من Semgrep وSCA الأصلي؛ وأضف --python-engine=false عندما تحتاج المسار الأصلي السريع فقط.

v1.0.0 الافتراضي مقابل اشتراط Python

≈ متقارب

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

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

مرحلة whitebox

يضيف تتبّع v1.0 التاريخي مرحلة للصندوق الأبيض والاعتماديات بعد الأسرار. تتخطى ‎--fast‎ الحالية كلًا من Semgrep وSCA الأصلي، لكن فحص الشيفرة قد يظل يحاول تشغيل Python؛ أضف ‎--python-engine=false‎ للمسار الأصلي السريع.

حد الخروج في الـ 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". لم تُقَس معماريات أخرى.

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

البناءبايتΔ
قبل: مع بيئة Python مضمّنة19,002,482—
بعد: دون بيئة Python مضمّنة18,903,282−99,200 (−0.5 %)

الفارق في الحجم صغير لأن بناء Go يضغط النص المضمّن بكفاءة. لم تعد الملفات التنفيذية المستقلة تضمّن شجرة Python. تظل المحللات الأصلية تعمل دون Python؛ ويسجّل فحص الشيفرة تعذّر تشغيل المحرك الضمني كفجوة تغطية ما لم تُعطّل المحاولة.

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

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

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
#
#   [historical v1.0 default]      N=30  min=41.7 p50=42.9 p95=44.4 mean=43.3 (ms)
#   [v1.0 + --python-engine]       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. The explicit Python run was on par; both
# stay an order of magnitude under the 500 ms CI gate.

اشترط مسار Python

تحاول فحوصات الشيفرة تشغيل فحوصات Python تلقائيًا. لجعل غياب المحرك خطأً مانعًا، أضف --python-engine — يتطلب شجرة python/ محلية أو FENDIX_ENGINE يشير إلى واحدة.

terminal
# Current --code scans attempt the Python engine automatically
fendix scan --code ./src --format json

# Require Python (missing engine exits 2)
fendix scan --code ./src --python-engine --format json

# Native-only path for a standalone binary without the Python tree
fendix scan --code ./src --python-engine=false --format json

للتعمّق أكثر

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