التخزين المؤقت والأداء
ذاكرة التخزين لكل commit، ومتى تُلغى، والتوازي، ونصائح السرعة
أين يذهب الوقت
| المرحلة | التكلفة | ملاحظات |
|---|---|---|
| فحوصات Git والإعدادات | لا تُذكر | |
قائمة المطورين (git log) | صغيرة | استدعاء واحد على السجل كله |
| فحص HEAD | تتناسب مع حجم الكود | مرور واحد لكل ملف + مرور واحد لكشف التكرار |
| مرور الـ commits | الأكبر | لكل commit: git diff واحد + git cat-file --batch واحد + تحليل الملفات المتغيرة قبل وبعد |
| التقييم | لا تُذكر |
الذاكرة المؤقتة لكل commit
منفّذة في src/cache/analysisCache.ts.
- المفتاح: معرّف الـ commit. القيمة:
CommitContributionالخاص بذلك الـ commit (الكاتب، والتاريخ، والأسطر المحللة، وسجلات ما أُدخل، وبصمات ما أُصلح، والأعداد). - محتوى الـ commit لا يتغير أبداً، فالنتيجة المخزنة صالحة ما دامت القواعد والإعدادات هي نفسها. عمليات التشغيل اللاحقة تحلل الـ commits الجديدة فقط.
- التخزين: ملف JSON واحد لكل مستودع،
commits-<hash of repo path>.json:
| الواجهة | المجلد |
|---|---|
| إضافة VS Code | مساحة التخزين العامة للإضافة (context.globalStorageUri) |
| أداة سطر الأوامر | <os.tmpdir()>/cleanlens-cache (مثلاً /tmp/cleanlens-cache) |
- يُكتب الملف مرة واحدة في نهاية التشغيل، وفقط إذا تغيّر شيء.
- فشل قراءة الذاكرة المؤقتة أو كتابتها يُتجاهل. الذاكرة المفقودة أو التالفة تعني فقط إعادة تحليل كاملة.
الإلغاء
تُلغى الذاكرة المؤقتة كاملة للمستودع عندما تتغير أي من القيمتين:
ENGINE_VERSION(فيscoringConfig.ts) — يُرفع كلما تغيّر منطق المحرّك.- بصمة إعدادات التحليل = قيمة FNV-1a لـ
{ engine, rules, sorted exclude list, scoring }. تغيير أي قاعدة، أو خطورة، أو حد، أو خيار، أو نمط استثناء (بما فيها المأخوذة من.gitignore/.gitattributes)، أو تخصيص للتقييم، يلغيها.
أشياء لا تلغي الذاكرة المؤقتة (ولا داعي لذلك): maxCommits وsince وdevelopers وmergeSameNameAuthors. هذه تحدد فقط أي الإدخالات المخزنة تُستخدم وكيف تُجمَّع.
إيقافها
- في الإضافة:
"cleanlens.cache.enabled": false. - في سطر الأوامر:
--no-cache. - لمسحها يدوياً، احذف ملف أو ملفات
commits-*.jsonفي المجلدات أعلاه.
التحسينات المدمجة
git diffواحد لكل commit لكل ملفاته، مع--unified=0(مخرجات صغيرة).git cat-file --batchواحد لكل commit لكل الـ blobs الخاصة به، بدلاً منgit showلكل ملف.- حفظ نتائج الـ blobs: تحليل الـ blob يُعاد استخدامه داخل التشغيل، فنسخة "ما بعد" في الـ commit رقم N ونسخة "ما قبل" في الـ commit رقم N+1 تُحلَّلان مرة واحدة.
- 12 commit بالتوازي (
COMMIT_CONCURRENCY). - التخطي المبكر: الملفات الثنائية وغير المدعومة والمستثناة وتعديلات المسافات فقط والمولَّدة لا تُحلَّل أبداً.
- الملفات الأكبر من 1 ميغابايت تُتخطى في فحص HEAD.
- المجلدات المستثناة لا تُدخَل أثناء استعراض الملفات.
نصائح للمستودعات الكبيرة
- أبقِ النافذة الافتراضية (500 commit) للاستخدام اليومي. تغطي معظم العمل النشط وهي سريعة.
- استخدم
analysis.since(مثلاً"12 months ago") لمراجعة محددة بفترة زمنية. - شغّل
--full-historyمن وقت لآخر (مثلاً مهمة CI ليلية). الذاكرة المؤقتة تجعل التشغيلات اللاحقة تزايدية. - استثنِ الكود المضمَّن من مكتبات خارجية والمولَّد وبيانات الاختبار. هذا يوفر الوقت ويجعل النتائج أعدل.
- أبقِ الذاكرة المؤقتة مفعّلة. بعد التشغيل الأول، فقط الـ commits الجديدة تستهلك وقتاً.
- تجنّب تغيير القواعد كثيراً أثناء فترة تقييم: كل تغيير يفرض إعادة تحليل كاملة.
مفاتيح الضبط على مستوى الكود
هذه ثوابت، وليست إعدادات. غيّرها في الكود وأعد البناء إذا احتجت:
| الثابت | الملف | الافتراضي |
|---|---|---|
COMMIT_CONCURRENCY | src/attribution/commitAttribution.ts | 12 |
MAX_FILE_BYTES | src/analyzers/fileScanner.ts | 1,000,000 |
DEFAULT_MAX_COMMITS | src/core/analyzeRepository.ts | 500 |
MAX_BUFFER (مخرجات git) | src/git/diffService.ts / commitHistory.ts | 512 MB / 128 MB |
| مهلة التنبيهات المباشرة | src/views/diagnostics.ts | 400 ms |
ارفع ENGINE_VERSION إذا كان التغيير يؤثر في نتائج كل commit، حتى تُلغى الذاكرة المؤقتة القديمة.