09

Önbellek ve performans

Commit başına önbellek, geçersiz kılma, eşzamanlılık, hız ipuçları

3 dk okuma5 bölüm

Zaman nereye gidiyor

AşamaMaliyetNotlar
Git kontrolleri, yapılandırmaihmal edilebilir
Geliştirici listesi (git log)küçükTü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ınCommit başına: 1 git diff + 1 git cat-file --batch + değişen dosyaların önce ve sonra analizi
Puanlamaihmal edilebilir

Commit başına önbellek

src/cache/analysisCache.ts içinde uygulanmıştır.

  • Anahtar: commit hash'i. Değer: o commit'in CommitContribution kaydı (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üzDizin
VS Code eklentisieklentinin 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:

  1. ENGINE_VERSION (scoringConfig.ts içinde) — motorun mantığı her değiştiğinde artırılır.
  2. 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 / .gitattributes kaynaklı 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-*.json dosya(lar)ını silin.

Yerleşik optimizasyonlar

  • Tüm dosyaları için commit başına tek git diff, --unified=0 ile (küçük çıktı).
  • Dosya başına bir git show yerine, tüm blob'ları için commit başına tek git 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ı

  1. Günlük kullanım için varsayılan pencereyi koruyun (500 commit). Etkin işin çoğunu kapsar ve hızlıdır.
  2. Zamanla sınırlı bir inceleme için analysis.since kullanın (örn. "12 months ago").
  3. Arada bir --full-history çalıştırın (örn. gece çalışan bir CI işi). Önbellek sonraki çalıştırmaları artımlı yapar.
  4. Dışarıdan alınmış (vendored), üretilmiş ve test verisi kodunu hariç tutun. Zaman kazandırır ve sonuçları daha adil yapar.
  5. Önbelleği açık tutun. İlk çalıştırmadan sonra yalnızca yeni commit'ler zaman alır.
  6. 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:

SabitDosyaVarsayılan
COMMIT_CONCURRENCYsrc/attribution/commitAttribution.ts12
MAX_FILE_BYTESsrc/analyzers/fileScanner.ts1,000,000
DEFAULT_MAX_COMMITSsrc/core/analyzeRepository.ts500
MAX_BUFFER (git çıktısı)src/git/diffService.ts / commitHistory.ts512 MB / 128 MB
Canlı tanı gecikmesisrc/views/diagnostics.ts400 ms

Bir değişiklik commit başına sonuçları etkiliyorsa, eski önbelleklerin atılması için ENGINE_VERSION değerini artırın.