الأداء
زمن البدء البارد، وحجم الملف التنفيذي، والمنهجية وراء كل رقم منشور. تحاول فحوصات --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، والخروج. تُمسح الذاكرة المؤقتة بين كل تشغيل بحيث يتحمّل كل استدعاء تكلفة البدء على البارد كاملةً.
| التهيئة | p50 | p95 | المتوسط | حد الخروج في الـ CI |
|---|---|---|---|---|
| v1.0.0— قياس افتراضي تاريخي للإصدار v1.0 مع مرحلة الصندوق الأبيض والاعتماديات الموسعة | 43 ms | 44 ms | 43 ms | ✅ 11× أسرع من حد 500 مللي ثانية |
v1.0.0 + --python-engine— قياس تاريخي للإصدار v1.0 مع اشتراط محرك Python؛ مقارب للافتراضي | 43 ms | 46 ms | 44 ms | ✅ 11× أسرع من حد 500 مللي ثانية |
| v0.11.0 الافتراضي— ما يأتي به الإصدار v0.11 | 6.1 ms | 7.0 ms | 6.1 ms | ✅ أسرع بـ 82× من 500 ms |
v0.11.0 + --python-engine— مسار whitebox القديم الاختياري (بما في ذلك فحص اجتياز المسارات) | 40.7 ms | 45.1 ms | 41.3 ms | ✅ أسرع بـ 12× من 500 ms |
| v0.9.0 الافتراضي— خط الأساس بعد إزالة بيئة Python المضمّنة | 5.6 ms | 6.3 ms | 5.6 ms | ✅ أسرع بـ 89× من 500 ms |
| v0.8.0— قبل المرحلة 17b، مع Python مضمّن | 7.3 ms | 8.1 ms | 7.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؛ ويسجّل فحص الشيفرة تعذّر تشغيل المحرك الضمني كفجوة تغطية ما لم تُعطّل المحاولة.
إعادة الإنتاج محليًا
كل رقم في هذه الصفحة قابل لإعادة الإنتاج. استنسخ مستودع المحرّك وشغّل أداة القياس — بالمنهجية ذاتها، وبيانات الاختبار ذاتها، وأداة القياس ذاتها التي أنتجت الأرقام المنشورة.
# 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 يشير إلى واحدة.
# 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 — المصدر الأصلي للأرقام في هذه الصفحة (يُحافَظ على تزامنه).