Magit ช้ามากใน Windows ฉันจะเพิ่มประสิทธิภาพได้อย่างไร


15

ฉันถูกบังคับให้ใช้ Windows 10 สำหรับโครงการ ใช่ฉันต้องการใช้ GNU / Linux เพื่อรักษาสติของฉันฉันพยายามที่จะถือว่า Windows เป็น bootloader สำหรับ Emacs :)

น่าเสียดายที่ Magit (หนึ่งในส่วนที่ชื่นชอบของ Emacs ซึ่งประกอบขึ้นด้วยการขาดบรรทัดคำสั่งที่ดีใน Windows) ก็ช้าเหลือเกิน ฉันมี SSD, RAM 16 GB และ i7 แบบ quad-core แต่ใช้เวลาแปดวินาทีในการดำเนินการmagit-statusบนพื้นที่เก็บข้อมูลขนาดเล็ก จากนั้นเมื่อฉันต้องการที่จะทำการเปลี่ยนแปลงอีกก็จะใช้เวลาประมาณ 5 วินาทีต่อไฟล์

นี่คือสิ่งที่ฉันได้ลอง:

  • $ git config --global core.preloadindex true
  • $ git config --global core.fscache true
  • $ git config --global gc.auto 256
  • การเพิ่มโครงการทั้งหมดลงในรายการยกเว้นของ Windows Defender
  • การตั้งค่าmagit-git-executableเป็น msysgit ปกติที่ฉันดาวน์โหลด ( https://git-for-windows.github.io/ ) ฉันตรวจสอบแล้วและgit statusนี่ใช้เวลา <1 วินาที ฉันรู้ว่าmagit-statusมันทำได้มากกว่านี้ แต่มันมากเกินไป

ใครช่วยแนะนำวิธีทำให้เร็วขึ้นได้ไหม ฉันนึกภาพไม่ออกว่ามีใครใช้ Magit บน Windows เช่นนี้

มีข้อเสนอแนะว่าคำถามนี้ซ้ำกัน แต่พวกเขาถามว่า:

ฉันพยายามที่จะเข้าใจว่าทำไม Emacs ถึงมีเวลาเริ่มต้นสั้นลงอย่างเห็นได้ชัดบน Ubuntu มากกว่า Windows ใครรู้คำตอบ?

ฉันรู้เหตุผลอย่างน้อยว่าทำไม Emacs, Git, และ Magit ถึงช้ากว่า Windows ฉันกำลังถามฉันจะปรับ Magitให้ทำสิ่งต่าง ๆ น้อยลงหรือผลลัพธ์แคชหรือบางสิ่งบางอย่างได้อย่างไรแม้ว่าจะมีค่าใช้จ่ายในการใช้งาน


git-statusใช้เวลา <1 วินาที? มันควรจะเป็นหลักทันที มีความล่าช้าที่เห็นได้หรือไม่?
PythonNut

คุณมีปัญหาเดียวกันกับที่เรียกใช้gitคำสั่งที่เทียบเท่าจากบรรทัดคำสั่งหรือไม่?
elethan

ฉันคิดว่าตัวเลือกเริ่มต้นของ magit สำหรับmagit-git-executableอาจจะเร็วขึ้นเล็กน้อย (ตัวเลือกในcmdและbinจริง ๆ แล้วห่อหุ้มถ้าexecutable-findส่งคืนหนึ่ง magit จะพยายามตั้งค่าmagit-git-executableเป็น git "ของจริง") 8 วินาทีสำหรับที่เก็บขนาดเล็กฟังดูเหมือนว่ามีสิ่งอื่นผิดปกติใช้เวลา ~ 0.8 วินาทีสำหรับ repo ของ magit ที่นี่ (Windows 8)
npostavs


1
นอกจากนี้ยังเป็นเวลาที่ถูกต้องมากขึ้นคุณสามารถตั้งค่าการmagit-refresh-verbose t
พี่เลี้ยง

คำตอบ:


11

จริง ๆ แล้วฉันได้ทำการวิจัยค่อนข้างมากเกี่ยวกับเรื่องนี้และพื้นฐานปัญหาคือ git สำหรับ windows sucks

นี่คือข้อผิดพลาดอัปสตรีม: https://github.com/git-for-windows/git/issues/596และต้องการให้ผู้อื่นเขียนเชลล์สคริปต์ใน C เพื่อให้ไม่มีคำสั่งการฟอร์กอีกต่อไป สำหรับฉันมันเป็น rebase เชิงโต้ตอบที่เป็นฆาตกรตัวจริง (ฉันสามารถเริ่มต้น rebase เชิงโต้ตอบไปทำชากลับมาอ่านข่าวดื่มชาแล้วก็อาจจะเสร็จแล้วมันแย่กว่าคนเยอะมาก คิดว่ามันเป็น) แต่การโทรที่เหมือนสถานะทั่วไปก็เพียงพอที่จะขัดจังหวะการทำงาน

อีกทางเลือกหนึ่งอาจจะปรับปรุง jGit เพื่อสนับสนุนคำสั่งที่ magit ใช้แล้วเรียกใช้ใน nailgun เพื่อลดเวลาเริ่มต้นของ JVM ฉันเริ่มเธรดเพื่อพูดคุยเรื่องนี้: http://dev.eclipse.org/mhonarc/lists/ jgit-dev / msg03064.html

คุณอาจต้องการอ่าน/programming/4485059สำหรับการเร่งความเร็วที่เป็นไปได้ แต่จริงๆแล้วคุณแทบจะไม่สังเกตเห็นเลย

สิ่งที่คุณสามารถทำได้ใน magit คือการทำตามคำแนะนำของผู้เขียนในการตั้งค่าmagit-statusเพียงเล็กน้อยสำหรับการจัดเตรียม

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

ดังนั้นคุณรู้หรือไม่ว่านักพัฒนา C หรือ Java ที่มีประสบการณ์ซึ่งสามารถช่วยเหลือด้วยวิธีแก้ไขปัญหาอย่างใดอย่างหนึ่งเพื่อแก้ไข git หรือ jGit ได้


ฉันไม่แน่ใจว่าปัญหาคือเชลล์สคริปต์เทียบกับ C เนื่องจากmagit-statusใช้เวลานานเช่นกันและฉันไม่คิดว่าสถานะใช้เชลล์สคริปต์จำนวนมาก
พี่เลี้ยง

1
และขอขอบคุณสำหรับmagit-statusรหัส"ขั้นต่ำ" ที่ดูเหมือนจะช่วยฉันสักเล็กน้อย (มันลดmagit-refreshเวลาของฉันลงเหลือ 2-3 วินาที)
พี่เลี้ยง

นี่คือสิ่งที่ฉันต้องการ ขอบคุณ!
ฮัท 8

1
ใช่magit-stagingใช้เวลาสองสามวินาทีสำหรับฉันด้วย เพียงพอที่จะขัดจังหวะการคิดของฉัน แต่ไม่เพียงพอที่จะทำลายวันของฉัน
fommil

2
เหตุผลที่magit-statusช้าคือเพราะมันgitอาจจะเรียกได้ว่า10 หรือ 20 ครั้ง การเริ่มต้นกระบวนการใหม่บน Windows นั้นช้ามากเมื่อเทียบกับแพลตฟอร์ม GNU สคริปต์เปลือกเป็นกรณีที่รุนแรงนี้ (เพราะสวยมากทุกคำสั่งเป็นกระบวนการใหม่)
fommil

2

เมื่อไม่นานมานี้ได้ดูรายการcall-processโทรจากmagit-statusอีกสาเหตุหนึ่งเกิดขึ้นกับฉันว่าบางคนสามารถถูกแคชได้ ด้วยคำแนะนำต่อไปนี้เกี่ยวmagit-statusกับ repo ของ Magit เปลี่ยนจาก 1.9 เป็น 1.3 วินาที (การวัดก่อนหน้าของฉันที่ 0.8s ที่กล่าวถึงในความคิดเห็นนั้นสำหรับคอมพิวเตอร์ที่แตกต่างกัน (เร็วขึ้น)) หากคุณใช้magit-stagingคำตอบอื่นอยู่แล้วอาจไม่ช่วยอะไรได้มาก: ฉันเห็นการลดลงจาก 0.16 เป็น 0.12 วินาที (แต่นั่นก็ใหญ่กว่าเสียงรบกวนการวัด)

คำเตือน: สิ่งนี้ไม่ได้ดูแลการอัพเดทแคชดังนั้นสิ่งต่าง ๆ อาจผิดปกติ (โดยเฉพาะถ้าคุณเล่นซอกับการตั้งค่า git ของคุณ)

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

ทำไมคุณไม่ใช้แพ็คเกจmelpa.org/#/memoize ?
fommil

1
@fommil: ฉันต้องการบันทึกการ rev-parse ต่อ buffer สำหรับargs บางตัว ฉันไม่เห็นวิธีที่จะทำหลังจากดูคร่าวๆที่แพ็คเกจบันทึกช่วยจำ นอกจากนี้ยังระบุว่าไม่สามารถจัดการการจำnilได้
npostavs
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.