زمن البدء البارد، وحجم الملف الثنائي، والمنهجية وراء كل رقم منشور. يضيف فحص --code الافتراضي مرحلة whitebox وفحص اعتماديات (govulncheck / ثغرات الحزم) فوق فحص الأسرار — تغطية أوسع جاهزة، بتكلفة بدء ثابتة ~40 مللي ثانية لم يدفعها مسار v0.11 المقتصر على الأسرار. استخدم --fast لتخطّيها.
الزمن من تنفيذ fendix scan حتى الخروج بإخراج JSON على stdout. يشمل إنشاء العملية، وتحليل المعطيات، وإعداد الفحص، وتنفيذ الفحص، وعرض JSON، والخروج. تُمسح الذاكرة المؤقتة بين كل تشغيل بحيث يتحمّل كل استدعاء تكلفة البدء على البارد كاملةً.
| التهيئة | p50 | p95 | المتوسط | حد الخروج في الـ CI |
|---|---|---|---|---|
| v1.0.0— الافتراضي الحالي؛ يضيف مرحلة whitebox وفحص اعتماديات بعد الأسرار (~40 مللي ثانية، ثابتة غالبًا) | 43 ms | 44 ms | 43 ms | ✅ 11× أسرع من حد 500 مللي ثانية |
v1.0.0 + --python-engine— محرّك whitebox اختياري؛ مقارِب للافتراضي، لأن الافتراضي يدفع بالفعل تكلفة مرحلة whitebox | 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 القديم الاختياري (+ TASK-134 لاجتياز المسارات) | 40.7 ms | 45.1 ms | 41.3 ms | ✅ أسرع بـ 12× من 500 ms |
| v0.9.0 الافتراضي— خط الأساس TASK-118 | 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 الافتراضي يفعل أكثر من البحث عن الأسرار: فهو يُشغّل مرحلة 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، الأنظمة المضمّنة).
كل رقم في هذه الصفحة قابل لإعادة الإنتاج. استنسخ مستودع المحرّك وشغّل أداة القياس — بالمنهجية ذاتها، وبيانات الاختبار ذاتها، وأداة القياس ذاتها التي أنتجت الأرقام المنشورة.
# 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 يشير إلى واحدة.
# 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--python-engine و --no-native-deps.