Git将Emacs减速到死亡 - 如何解决这个问题?

时间:2011-07-17 14:29:16

标签: git emacs cygwin

打开文件(通过键入Ctrl-x f,AKA Find File)或在f模式下在该文件上键入Dired),工作目录的速度非常慢有一个.git子目录。

即使是最简单的文件(50行(主要是评论)也可能需要 8秒才能打开。

同一个文件,在不受Git管理的不同目录中,立即以快捷方式打开。

为什么会发生这种情况?如何在没有 禁用vc-mode的情况下修复此 ? (因为我使用Emacs的主要原因之一是M-x ediff-revision

更新1:感谢@ sanityinc的回答,我运行了ELP Profiling,这是我收到的(对于一个非常小的文件,69行,其中59行是简单的注释):

Function Name                       Call Count   Elapsed Time  Average Time
-------------                       ----------   ------------  ------------
vc-call-backend                      11          23.023        2.093
vc-find-file-hook                    1           8.757         8.757
vc-mode-line                         1           7.812         7.812
vc-default-mode-line-string          1           7.345         7.345
vc-state-refresh                     1           6.921         6.921
vc-state                             1           6.921         6.921
vc-default-state-heuristic           1           6.921         6.921
vc-registered                        1           0.945         0.945
vc-backend                           1           0.945         0.945
vc-git-registered                    1           0.912         0.912
vc-working-revision                  1           0.4240000000  0.4240000000
vc-find-root                         4           0.0990000000  0.0247500000
vconcat                              623         0.0220000000  3.53...e-005
vc-bzr-registered                    1           0.016         0.016
vc-check-master-templates            2           0.014         0.007
vc-default-registered                2           0.014         0.007
vc-rcs-registered                    1           0.008         0.008
vc-sccs-registered                   1           0.006         0.006
vc-svn-registered                    1           0.002         0.002
vc-cvs-registered                    1           0.001         0.001
vc-sccs-search-project-dir           1           0.0           0.0
vc-kill-buffer-hook                  6           0.0           0.0
vc-find-backend-function             11          0.0           0.0
vc-default-find-file-hook            1           0.0           0.0
vc-possible-master                   6           0.0           0.0
vc-file-clearprops                   1           0.0           0.0
vc-file-setprop                      3           0.0           0.0
vc-file-getprop                      5           0.0           0.0
vc-make-backend-sym                  15          0.0           0.0

这是很好的信息,但我不是Emacs / elisp专家,那么我该如何从这里出发?

更新2 :将此问题暂时搁置后,我发现了这篇精彩的博文:Cygwin slow start up: the culprit discovered!,其中主要建议在后台启动bash完成。我很快实现了它并重新运行了ELP分析测试:

vc-call-backend                      11          14.489        1.317
vc-find-file-hook                    1           5.488         5.488
vc-mode-line                         1           5.118         5.118
vc-default-mode-line-string          1           4.719         4.719
vc-state-refresh                     1           4.282         4.282
vc-state                             1           4.282         4.282
vc-default-state-heuristic           1           4.282         4.282
vc-working-revision                  1           0.437         0.437
vc-registered                        1           0.37          0.37
vc-backend                           1           0.37          0.37
vc-git-registered                    1           0.34          0.34
vc-find-root                         4           0.088         0.022
vc-bzr-registered                    1           0.015         0.015
vc-check-master-templates            2           0.013         0.0065 
vc-default-registered                2           0.013         0.0065 
vc-rcs-registered                    1           0.007         0.007
vc-sccs-registered                   1           0.006         0.006
vc-cvs-registered                    1           0.001         0.001
vconcat                              623         0.001         1.60...e-006
vc-svn-registered                    1           0.001         0.001
vc-sccs-search-project-dir           1           0.0           0.0
vc-kill-buffer-hook                  6           0.0           0.0
vc-find-backend-function             11          0.0           0.0
vc-default-find-file-hook            1           0.0           0.0
vc-possible-master                   6           0.0           0.0
vc-file-clearprops                   1           0.0           0.0
vc-file-setprop                      3           0.0           0.0
vc-file-getprop                      5           0.0           0.0
vc-make-backend-sym                  15          0.0           0.0

很高兴看到vc-call-backend从23秒减少到14秒,但这仍然是不可接受的(找到一个CVS控制的文件需要不到一秒钟!)。

更新3:无法解开谜团,我通过升级到最新的cygwin(1.7.9-1)来试试运气。这没有用。

因此,我决定尝试将沙箱(及其.git子目录)从Samba共享移动到本地存储(C:\Users\WinWin\Documents)。然后我重新运行了ELP分析测试:

vc-call-backend                           11          2.082         0.1892727272
vc-find-file-hook                         1           0.897         0.897
vc-git--call                              7           0.8929999999  0.1275714285
vc-git-mode-line-string                   1           0.78          0.78
vc-mode-line                              1           0.78          0.78
vc-default-mode-line-string               1           0.655         0.655
vc-git--out-ok                            5           0.6519999999  0.1304
vc-git-state                              1           0.53          0.53
vc-state-refresh                          1           0.53          0.53
vc-state                                  1           0.53          0.53
vc-default-state-heuristic                1           0.53          0.53
vc-git-working-revision                   2           0.25          0.125
vc-git-registered                         2           0.2239999999  0.1119999999
vc-git--run-command-string                1           0.18          0.18
vc-working-revision                       1           0.125         0.125
vc-registered                             1           0.1169999999  0.1169999999
vc-backend                                2           0.1169999999  0.0584999999
vc-git--empty-db-p                        1           0.11          0.11
vc-find-root                              3           0.003         0.001
vc-git-root                               2           0.002         0.001
vc-check-master-templates                 2           0.001         0.0005
vc-sccs-registered                        1           0.001         0.001
vc-default-registered                     2           0.001         0.0005
vc-bzr-registered                         1           0.001         0.001
vc-rcs-registered                         1           0.0           0.0
vc-sccs-search-project-dir                1           0.0           0.0
vc-kill-buffer-hook                       5           0.0           0.0
vc-default-find-file-hook                 1           0.0           0.0
vc-possible-master                        6           0.0           0.0
vc-cvs-registered                         1           0.0           0.0
vc-file-clearprops                        1           0.0           0.0
vc-file-setprop                           3           0.0           0.0
vc-file-getprop                           5           0.0           0.0
vc-svn-registered                         1           0.0           0.0
vc-make-backend-sym                       2           0.0           0.0

哇!将vc-call-backend从14秒降低到2秒。这很棒,但并不精彩,因为使用Emacs / CVS ,我可以访问小于35毫秒的文件 - 在沙箱最初所在的Samba共享中:

vc-call-backend                           5           0.031         0.0062
vc-find-file-hook                         1           0.031         0.031
vc-registered                             1           0.031         0.031
vc-backend                                1           0.031         0.031
vc-rcs-registered                         1           0.016         0.016
vc-check-master-templates                 1           0.016         0.016
vc-default-registered                     1           0.016         0.016
vc-insert-file                            1           0.015         0.015
vc-cvs-get-entries                        1           0.015         0.015
vc-cvs-registered                         1           0.015         0.015
vc-cvs-state-heuristic                    1           0.0           0.0
vc-cvs-parse-sticky-tag                   1           0.0           0.0
vc-kill-buffer-hook                       1           0.0           0.0
vc-find-backend-function                  1           0.0           0.0
vc-cvs-parse-entry                        1           0.0           0.0
vc-mode-line                              1           0.0           0.0
vc-default-find-file-hook                 1           0.0           0.0
vc-possible-master                        3           0.0           0.0
vc-cvs-mode-line-string                   1           0.0           0.0
vc-default-mode-line-string               1           0.0           0.0
vc-state-refresh                          1           0.0           0.0
vc-working-revision                       1           0.0           0.0
vc-state                                  1           0.0           0.0
vc-file-clearprops                        1           0.0           0.0
vc-file-setprop                           5           0.0           0.0
vc-file-getprop                           7           0.0           0.0
vc-make-backend-sym                       2           0.0           0.0

这提出了两个问题:

  1. git + cygwin的组合使它对它如此敏感 网络速度?
  2. 如何让git下降到不到50毫秒?毕竟,这是电话 “ 快速 版本控制系统”
  3. 使用msysgit时更新1.7.8:

    vc-call-backend                      11          0.626         0.0569090909
    vc-find-file-hook                    1           0.281         0.281
    vc-mode-line                         1           0.2189999999  0.2189999999
    vc-default-mode-line-string          1           0.1879999999  0.1879999999
    vc-state-refresh                     1           0.157         0.157
    vc-state                             1           0.157         0.157
    vc-default-state-heuristic           1           0.157         0.157
    vc-registered                        1           0.062         0.062
    vc-backend                           1           0.062         0.062
    vc-git-registered                    1           0.062         0.062
    vc-working-revision                  1           0.0310000000  0.0310000000
    vc-rcs-registered                    1           0.0           0.0
    vc-sccs-search-project-dir           1           0.0           0.0
    vc-kill-buffer-hook                  6           0.0           0.0
    vc-find-backend-function             11          0.0           0.0
    vc-default-find-file-hook            1           0.0           0.0
    vc-possible-master                   6           0.0           0.0
    vc-check-master-templates            2           0.0           0.0
    vc-cvs-registered                    1           0.0           0.0
    vc-sccs-registered                   1           0.0           0.0
    vc-file-clearprops                   1           0.0           0.0
    vconcat                              623         0.0           0.0
    vc-default-registered                2           0.0           0.0
    vc-file-setprop                      3           0.0           0.0
    vc-find-root                         4           0.0           0.0
    vc-file-getprop                      5           0.0           0.0
    vc-bzr-registered                    1           0.0           0.0
    vc-svn-registered                    1           0.0           0.0
    vc-make-backend-sym                  15          0.0           0.0
    

    你能分辨出来吗? :)

    现在,Emacs下的Git速度更快,但它仍然比Emacs下的CVS慢很多。所以我不知道为什么Git被称为“快速版本控制系统”。它可能比CVS更好,但更快?

3 个答案:

答案 0 :(得分:43)

有一个名为ELP的内置分析器。您可以尝试M-x elp-instrument-package之类的内容,输入“vc”,然后尝试查找文件。之后,M-x elp-results会向您显示个人资料报告。

(请注意,如果将时间用于非vc相关功能,则此技术不会显示,但如果您愿意,可以使用其他包。)

答案 1 :(得分:4)

您可以尝试profile打开文件,看看究竟需要花费多少时间。

答案 2 :(得分:2)

您可以vc-handled-backendsnil设置为.emacs中的{{1}}。