Magit cực kỳ chậm trong Windows. Làm thế nào để tôi tối ưu hóa?


14

Tôi buộc phải sử dụng Windows 10 cho một dự án. Có, tôi muốn sử dụng GNU / Linux. Để giữ sự tỉnh táo của mình, tôi đã cố gắng coi Windows là bộ tải khởi động cho Emacs :)

Thật không may, Magit (một trong những phần yêu thích của Emacs, cũng bù cho việc thiếu một dòng lệnh tốt trên Windows) rất chậm. Tôi có ổ SSD, RAM 16 GB và i7 lõi ​​tứ nhưng phải mất tám giây để thực thi magit-statustrên một kho lưu trữ nhỏ. Sau đó, khi tôi muốn thực hiện một thay đổi khác, sẽ mất khoảng 5 giây cho mỗi tệp .

Đây là những gì tôi đã thử:

  • $ git config --global core.preloadindex true
  • $ git config --global core.fscache true
  • $ git config --global gc.auto 256
  • Thêm toàn bộ dự án vào danh sách loại trừ Windows Defender (AV duy nhất của tôi)
  • Đặt thành magit-git-executablemsysgit thông thường mà tôi đã tải xuống ( https://git-for-windows.github.io/ ). Tôi đã kiểm tra và git statusở đây mất <1 giây. Tôi biết đó là magit-statuscách nhiều hơn, nhưng điều này là quá nhiều.

Bất cứ ai có thể đề xuất cách để làm điều này nhanh hơn? Tôi không thể tưởng tượng bất cứ ai sử dụng Magit trên Windows như thế này.

Có ý kiến ​​cho rằng câu hỏi này là một bản sao, nhưng họ đã hỏi:

Tôi đang đấu tranh để hiểu tại sao Emacs có thời gian khởi động trên Ubuntu ngắn hơn đáng kể so với Windows. Có ai biết câu trả lời không?

Tôi biết ít nhất một số lý do tại sao Emacs, Git và Magit chậm hơn trên Windows. Tôi đang hỏi làm cách nào để tối ưu hóa Magit để thực hiện ít việc hơn, hoặc kết quả bộ đệm, hoặc một cái gì đó, ngay cả khi đó là chi phí của chức năng.


git-statusmất <1 giây? Nó cần phải là ngay lập tức. Có bất kỳ sự chậm trễ có thể nhận thấy ở tất cả?
PythonNut

Bạn có gặp vấn đề tương tự khi chạy các gitlệnh tương đương từ dòng lệnh không?
elethan

Tôi nghĩ rằng sự lựa chọn mặc định của magit magit-git-executablecó thể sẽ nhanh hơn một chút (những cái trong cmdbinthực sự là các hàm bao, nếu executable-findtrả về một trong số chúng, magit sẽ cố gắng đặt thành magit-git-executablegit "thực"). 8 giây cho một kho lưu trữ nhỏ nghe có vẻ như có gì đó không ổn, mất ~ 0,8 giây cho repo của pháp sư ở đây (Windows 8).
npostavs


1
Ngoài ra, để có thời gian chính xác hơn, bạn có thể đặt magit-refresh-verbosethành t.
mẫu

Câu trả lời:


10

Tôi thực sự đã thực hiện khá nhiều nghiên cứu về điều này và về cơ bản vấn đề là git cho windows hút

Đây là lỗi ngược dòng: https://github.com/git-for-windows/git/issues/596 và nó yêu cầu ai đó viết lại các tập lệnh shell trong C để không có thêm lệnh cấm. Đối với tôi, đó là cuộc nổi loạn tương tác mới là kẻ giết người thực sự (tôi có thể khởi động một cuộc nổi loạn tương tác, đi pha trà, quay lại, đọc một số tin tức, uống trà, và sau đó có lẽ nó đã kết thúc. nghĩ rằng nó là), nhưng các cuộc gọi giống như trạng thái chung cũng đủ để làm gián đoạn bước tiến công việc.

Một cách khác có thể là cập nhật jGit để hỗ trợ các lệnh mà magit sử dụng, sau đó chạy nó trong nailgun để giảm thời gian khởi động JVM, tôi bắt đầu một chủ đề để thảo luận về điều này: http://dev.eclipse.org/mhonarc/lists/ jgit-dev / dir03064.html

Bạn có thể muốn đọc /programming/4485059 cho một số tăng tốc tiềm năng, nhưng thành thật mà nói bạn sẽ hầu như không nhận thấy chúng.

Một cái gì đó bạn có thể làm trong phép thuật là làm theo lời khuyên của tác giả trong việc thiết lập tối thiểu magit-statuschỉ để dàn dựng

;; 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))

vì vậy, bạn có biết bất kỳ nhà phát triển C hoặc Java có kinh nghiệm nào có thể giúp đỡ với một trong các giải pháp để khắc phục git hoặc jGit không?


Tôi không chắc vấn đề là shell script so với C, bởi vì cũng magit-statusmất một thời gian rất dài và tôi không nghĩ trạng thái sử dụng nhiều script script.
mẫu

1
Và cảm ơn bạn vì magit-statusmã "tối thiểu" đó, nó dường như giúp tôi một chút (nó giảm magit-refreshthời gian của tôi xuống còn 2-3 giây).
mẫu

Đây chính xác là những gì tôi muốn. Cảm ơn!
Hut8

@ Hut8 dàn dựng ảo thuật cho bạn nhanh như thế nào với mã tối thiểu?
mẫu

1
Lý do tại sao magit-statuschậm là vì nó gọi gitcó thể 10 hoặc 20 lần. Bắt đầu các quy trình mới trên Windows cực kỳ chậm so với các nền tảng GNU. Các kịch bản shell là một trường hợp cực đoan của điều này (vì hầu như mọi tuyên bố đều là một quy trình mới)
fommil

2

Gần đây đã xem danh sách các call-processcuộc gọi từ magit-statusmột lý do khác, tôi nhận thấy rằng một số trong số chúng có thể được lưu trữ. Với lời khuyên sau đây magit-statusvề repo của Magit đi từ 1,9 đến 1,3 giây (số đo 0,8 trước đây của tôi được đề cập trong các nhận xét là dành cho một máy tính khác (nhanh hơn)). Nếu bạn đã sử dụng magit-stagingtừ câu trả lời khác thì có lẽ sẽ không giúp được gì nhiều: Tôi đã thấy giảm từ 0,16 đến 0,12 giây (nhưng nó chỉ lớn hơn tiếng ồn đo lường).

CẢNH BÁO: Điều này không quan tâm đến việc cập nhật bộ đệm, vì vậy mọi thứ có thể sai (đặc biệt nếu bạn đang thay đổi cấu hình git của mình).

(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)

Tại sao bạn không sử dụng gói melpa.org/#/memoize ?
fommil

1
@fommil: Tôi cần ghi nhớ rev-parse cho mỗi bộ đệm cho một số đối số . Tôi không thể thấy một cách để làm như vậy sau một cái nhìn khó hiểu về gói ghi nhớ. Ngoài ra, nó nói rằng nó không thể xử lý việc ghi nhớ nil.
npostavs
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.