Önbellek ve performans
Commit başına önbellek, geçersiz kılma, eşzamanlılık, hız ipuçları
Zaman nereye gidiyor
| Aşama | Maliyet | Notlar |
|---|---|---|
| Git kontrolleri, yapılandırma | ihmal edilebilir | |
Geliştirici listesi (git log) | küçük | Tüm geçmiş üzerinde tek çağrı |
| HEAD taraması | kod boyutuyla orantılı | Dosya başına bir geçiş + bir tekrar geçişi |
| Commit yürüyüşü | baskın | Commit başına: 1 git diff + 1 git cat-file --batch + değişen dosyaların önce ve sonra analizi |
| Puanlama | ihmal edilebilir |
Commit başına önbellek
src/cache/analysisCache.ts içinde uygulanmıştır.
- Anahtar: commit hash'i. Değer: o commit'in
CommitContributionkaydı (yazar, tarih, analiz edilen satırlar, eklenen kayıtlar, düzeltilen parmak izleri, sayılar). - Bir commit'in içeriği asla değişmez; bu yüzden önbelleğe alınmış sonuç, kurallar ve ayarlar aynı kaldıkça geçerlidir. Tekrar çalıştırmalar yalnızca yeni commit'leri analiz eder.
- Depolama: depo başına bir JSON dosyası,
commits-<hash of repo path>.json:
| Arayüz | Dizin |
|---|---|
| VS Code eklentisi | eklentinin genel depolama alanı (context.globalStorageUri) |
| CLI | <os.tmpdir()>/cleanlens-cache (örn. /tmp/cleanlens-cache) |
- Dosya, çalıştırmanın sonunda bir kez ve yalnızca bir şey değiştiyse yazılır.
- Önbelleği okuma veya yazma hataları yok sayılır. Eksik veya bozuk önbellek yalnızca tam bir yeniden analiz anlamına gelir.
Geçersiz kılma
Bir depo için önbelleğin tamamı, şu değerlerden herhangi biri değiştiğinde atılır:
ENGINE_VERSION(scoringConfig.tsiçinde) — motorun mantığı her değiştiğinde artırılır.- Analiz yapılandırma hash'i =
{ engine, rules, sorted exclude list, scoring }değerinin FNV-1a'sı. Herhangi bir kuralı, önem derecesini, sınırı, seçeneği, hariç tutma kalıbını (.gitignore/.gitattributeskaynaklı olanlar dahil) veya puanlama geçersiz kılmasını değiştirmek onu geçersiz kılar.
Önbelleği geçersiz kılmayan (ve kılması gerekmeyen) şeyler: maxCommits, since, developers, mergeSameNameAuthors. Bunlar yalnızca hangi önbellek girdilerinin kullanılacağını ve nasıl gruplanacağını seçer.
Kapatmak
- Eklenti:
"cleanlens.cache.enabled": false. - CLI:
--no-cache. - Elle temizlemek için yukarıdaki dizinlerdeki
commits-*.jsondosya(lar)ını silin.
Yerleşik optimizasyonlar
- Tüm dosyaları için commit başına tek
git diff,--unified=0ile (küçük çıktı). - Dosya başına bir
git showyerine, tüm blob'ları için commit başına tekgit cat-file --batch. - Blob düzeyinde hafızalama: bir blob'un analizi çalıştırma içinde yeniden kullanılır; böylece N. commit'in "sonrası" ile N+1. commit'in "öncesi" bir kez ayrıştırılır.
- 12 commit paralel (
COMMIT_CONCURRENCY). - Erken atlama: ikili, desteklenmeyen, hariç tutulmuş, yalnızca boşluk değişikliği olan ve üretilmiş dosyalar asla analiz edilmez.
- 1 MB'tan büyük dosyalar HEAD taramasında atlanır.
- Hariç tutulan dizinlere dosya gezintisi sırasında girilmez.
Büyük depolar için ipuçları
- Günlük kullanım için varsayılan pencereyi koruyun (500 commit). Etkin işin çoğunu kapsar ve hızlıdır.
- Zamanla sınırlı bir inceleme için
analysis.sincekullanın (örn."12 months ago"). - Arada bir
--full-historyçalıştırın (örn. gece çalışan bir CI işi). Önbellek sonraki çalıştırmaları artımlı yapar. - Dışarıdan alınmış (vendored), üretilmiş ve test verisi kodunu hariç tutun. Zaman kazandırır ve sonuçları daha adil yapar.
- Önbelleği açık tutun. İlk çalıştırmadan sonra yalnızca yeni commit'ler zaman alır.
- Bir değerlendirme döneminde kuralları sık değiştirmekten kaçının: her değişiklik tam bir yeniden analizi zorunlu kılar.
Kaynak kod düzeyindeki ayarlar
Bunlar ayar değil, sabittir. Gerekirse kaynak kodda değiştirip yeniden derleyin:
| Sabit | Dosya | Varsayılan |
|---|---|---|
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 çıktısı) | src/git/diffService.ts / commitHistory.ts | 512 MB / 128 MB |
| Canlı tanı gecikmesi | src/views/diagnostics.ts | 400 ms |
Bir değişiklik commit başına sonuçları etkiliyorsa, eski önbelleklerin atılması için ENGINE_VERSION değerini artırın.