Magit Windows'da son derece yavaş. Nasıl optimize edebilirim?


15

Bir proje için Windows 10'u kullanmak zorundayım. Evet, GNU / Linux kullanmayı tercih ederim. Aklımı korumak için Windows'u Emacs için bir önyükleyici olarak görmeye çalıştım :)

Ne yazık ki, Magit (Emacs'ın en sevdiğim parçalarından biri, aynı zamanda Windows'ta iyi bir komut satırı eksikliğini de telafi ediyor) dayanılmaz derecede yavaş. Bir SSD, 16 GB RAM ve dört çekirdekli i7'm var, ancak küçük bir depoda yürütmek sekiz saniye sürüyor magit-status. Sonra, başka bir değişiklik yapmak istediğimde, dosya başına yaklaşık 5 saniye sürer .

İşte denedim:

  • $ git config --global core.preloadindex true
  • $ git config --global core.fscache true
  • $ git config --global gc.auto 256
  • Tüm projeyi Windows Defender (benim tek AV) hariç tutma listesine ekleme
  • Ayar magit-git-executableBen indirilen düzenli msysgit biri (için https://git-for-windows.github.io/ ). Kontrol ettim ve git statusburada <1 saniye sürüyor. Bunun magit-statusdaha fazlasını yaptığını biliyorum , ama bu çok fazla.

Herkes bunu daha hızlı hale getirmenin yollarını önerebilir mi? Windows'ta Magit'i böyle kullanan birisini hayal edemiyorum.

Bu sorunun yinelenmesi önerildi , ancak sordular:

Emacs'ın neden Ubuntu'da Windows'tan fark edilir derecede daha kısa bir başlangıç ​​süresine sahip olduğunu anlamak için uğraşıyorum. Cevabı bilen var mı?

Emacs, Git ve Magit'in Windows'ta daha yavaş olmasının en azından bazı nedenlerini biliyorum. Magit'i işlevsellik pahasına olsa bile daha az şey veya önbellek sonuçları veya bir şey yapmak için nasıl optimize edeceğimi soruyorum .


git-status<1 saniye sürer? Aslında anlık olmalı. Hiç algılanabilir bir gecikme var mı?
PythonNut

gitKomut satırından eşdeğer komutları çalıştırırken aynı sorunlarınız mı var ?
elethan

Magit için varsayılan seçim magit-git-executablemuhtemelen biraz daha hızlı olacağını düşünüyorum (olanlar cmdve binaslında sarmalayıcılar, eğer executable-findbunlardan biri magit magit-git-executable"gerçek" git ayarlamaya çalışacağız ). Küçük bir depo için 8 saniye başka bir şey yanlış gibi geliyor, ancak magit repo için ~ 0.8 saniye sürer (Windows 8).
npostavs


1
Ayrıca, daha doğru bir süre için, size ayarlayabilirsiniz magit-refresh-verboseiçin t.
dadı

Yanıtlar:


11

Aslında bu konuda çok araştırma yaptım ve temelde sorun windows berbat için git

Bu yukarı akış hatasıdır: https://github.com/git-for-windows/git/issues/596 ve bir başkasının komut dosyalarını çatalla yazmaması için kabuk komut dosyalarını yeniden yazması gerekir. Benim için, gerçek katil olan interaktif rebase (Etkileşimli bir rebase başlatabilir, çay yapabilir, geri dönebilir, bazı haberleri okuyabilir, çayı içebilir ve belki de bitmiş olabilir. Bir çok insandan çok daha kötü düşünün), ancak iş adımlarını kesmek için genel durum benzeri çağrılar da yeterlidir.

Bir alternatif, magit'in kullandığı komutları desteklemek için jGit'i güncellemek ve daha sonra JVM başlangıç ​​süresini azaltmak için nailgun'da çalıştırmak olabilir, bunu tartışmak için bir konu başlattım: http://dev.eclipse.org/mhonarc/lists/ jgit-dev / msg03064.html

Bazı potansiyel hızlandırmalar için /programming/4485059 adresini okumak isteyebilirsiniz , ancak dürüst olmak gerekirse bunları zar zor fark edeceksiniz.

Magit içinde yapabileceğiniz bir şey, magit-statussadece sahneleme için minimal bir kurulumda yazarın tavsiyelerini takip etmektir.

;; WORKAROUND https://github.com/magit/magit/issues/2395
(define-derived-mode magit-staging-mode magit-status-mode "Magit staging"
  "Mode for showing staged and unstaged changes."
  :group 'magit-status)
(defun magit-staging-refresh-buffer ()
  (magit-insert-section (status)
    (magit-insert-untracked-files)
    (magit-insert-unstaged-changes)
    (magit-insert-staged-changes)))
(defun magit-staging ()
  (interactive)
  (magit-mode-setup #'magit-staging-mode))

Peki, git veya jGit'i düzeltmek için çözümlerden herhangi birinde yardımcı olabilecek deneyimli C veya Java geliştiricileri biliyor musunuz?


Sorunun kabuk komut dosyaları vs C olduğundan o kadar emin değilim, çünkü magit-statusçok uzun zaman alıyor ve durumun kabuk komut dosyalarının çoğunu kullandığını düşünmüyorum.
Dadı

1
Ve bu "minimal" magit-statuskod için teşekkür ederim , bana biraz yardımcı gibi görünüyor ( magit-refreshzamanımı 2-3 saniyeye düşürür).
dadı

Bu tam olarak istediğim şey. Teşekkürler!
8

1
evet, magit-stagingbenim için de birkaç saniye sürüyor. Düşüncemi kesmek için yeterli, ama günümü yok etmek için yeterli değil.
fommil

2
magit-statusyavaş olmasının nedeni , gitbelki 10 veya 20 kez seslenmesidir . Windows'da yeni işlemlere başlamak GNU platformlarına kıyasla son derece yavaştır. Kabuk betikleri bunun aşırı bir örneğidir (çünkü hemen hemen her ifade yeni bir süreçtir)
fommil

2

Son zamanlarda başka bir nedenden call-processgelen çağrı listesine baktıktan sonra, magit-statusbazılarının önbelleğe alınabileceği ortaya çıktı. magit-statusMagit'in repo ile ilgili aşağıdaki tavsiyeyle 1.9 ila 1.3 saniye arasında gidiyorum (yorumlarda bahsedilen 0.8 saniyelik önceki ölçümüm farklı (daha hızlı) bir bilgisayar içindi). Zaten magit-stagingdiğer cevaptan kullanıyorsanız , muhtemelen çok yardımcı olmayacaktır: 0.16'dan 0.12 saniyeye kadar bir azalma gördüm (ancak bu, ölçüm gürültüsünden çok daha büyük).

UYARI: Bu, önbelleğin güncellenmesi ile ilgilenmez, bu nedenle işler ters gidebilir (özellikle git yapılandırmanızla uğraşıyorsanız).

(defvar-local magit-git--git-dir-cache nil)
(defvar-local magit-git--toplevel-cache nil)
(defvar-local magit-git--cdup-cache nil)

(defun memoize-rev-parse (fun &rest args)
  (pcase (car args)
    ("--git-dir"
     (unless magit-git--git-dir-cache
       (setq magit-git--git-dir-cache (apply fun args)))
     magit-git--git-dir-cache)
    ("--show-toplevel"
     (unless magit-git--toplevel-cache
       (setq magit-git--toplevel-cache (apply fun args)))
     magit-git--toplevel-cache)
    ("--show-cdup"
     (let ((cdup (assoc default-directory magit-git--cdup-cache)))
       (unless cdup
         (setq cdup (cons default-directory (apply fun args)))
         (push cdup magit-git--cdup-cache))
       (cdr cdup)))
    (_ (apply fun args))))

(advice-add 'magit-rev-parse-safe :around #'memoize-rev-parse)

(defvar-local magit-git--config-cache (make-hash-table :test 'equal))

(defun memoize-git-config (fun &rest keys)
  (let ((val (gethash keys magit-git--config-cache :nil)))
    (when (eq val :nil)
      (setq val (puthash keys (apply fun keys) magit-git--config-cache)))
    val))

(advice-add 'magit-get :around #'memoize-git-config)
(advice-add 'magit-get-boolean :around #'memoize-git-config)


1
@fommil: Bazı argümanlar için arabellek başına devir ayrışmasını hatırlatmam gerekiyordu . Memoize paketine bir cursory bakışından sonra bunu yapmanın bir yolunu göremedim. Ayrıca hatırlamayı kaldıramayacağını söylüyor nil.
npostavs
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.