tramp-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: File path completions: strange speed discrepancy


From: JD Smith
Subject: Re: File path completions: strange speed discrepancy
Date: Sun, 19 Sep 2021 13:55:18 -0400

Quite interesting, I can try with an Emacs 28.  But I wonder if you found the same discrepancy with Emacs v27.2 I did?  

In the meantime I’ve searched down many rabbit holes and zeroed in on tramp’s file handlers.  I am using:

(require 'tramp-sh)
(defun my/test ()
  (interactive)
  (progn
    (tramp-cleanup-all-connections)
    (elp-instrument-list
     '(file-remote-p
       tramp-file-name-handler
       completion-file-name-table
       tramp-handle-substitute-in-file-name
       substitute-in-file-name
       completion--sifn-requote
       file-name-completion
       file-name-all-completions
       completion--file-name-table
       file-exists-p
       completing-read
       read-file-name-internal
       read-file-name-default
       tramp-handle-file-name-completion
       tramp-sh-handle-file-name-all-completions))
    (setq unread-command-events
 (mapcar 'identity "///ssh:datpi:/home/pi/no\tex\t/do\tma\tce\t\n"))
    (call-interactively #'find-file)
    (let ((elp-recycle-buffers-p nil))
      (elp-results)
      (elp-reset-all))))

;; first browse to remote directory (here "pi")
(progn
  (with-current-buffer "pi"
    (my/test))
  (my/test))

For me this implicates file-remote-p and tramp-file-name-handler, which again exhibit 10x differences between starting in a local or remote buffer.  If this is fixed in Emacs 28 that’s wonderful, but it may be several years before everyone has migrated.  

Results:

Starting in *scratch*:

Tramp-file-name-handler                    607         19.486156000  0.0321023986
read-file-name-default                     1           6.738599      6.738599
completing-read                            1           6.643299      6.643299
substitute-in-file-name                    396         5.9316180000  0.0149788333
file-remote-p                              1569        5.9054120000  0.0037638062
tramp-handle-substitute-in-file-name       90          5.8898210000  0.0654424555
read-file-name-internal                    17          1.420594      0.0835643529
completion--file-name-table                17          1.420297      0.0835468823
completion--sifn-requote                   5           1.3667250000  0.2733450000
completion-file-name-table                 22          0.767013      0.0348642272
file-name-completion                       6           0.733239      0.1222065
tramp-handle-file-name-completion          6           0.7313359999  0.1218893333
file-name-all-completions                  6           0.7093809999  0.1182301666
tramp-sh-handle-file-name-all-completions  6           0.7077049999  0.1179508333
file-exists-p                              16          0.037264      0.002329

Starting in remote dired buffer “pi”:

tramp-file-name-handler                    1429        3.1352620000  0.0021940251
read-file-name-default                     1           0.953455      0.953455
completing-read                            1           0.94828       0.94828
completion-file-name-table                 22          0.7587730000  0.0344896818
file-name-completion                       6           0.7366199999  0.1227699999
tramp-handle-file-name-completion          6           0.734705      0.1224508333
file-name-all-completions                  6           0.7178499999  0.1196416666
tramp-sh-handle-file-name-all-completions  6           0.7160390000  0.1193398333
substitute-in-file-name                    482         0.3317939999  0.0006883692
tramp-handle-substitute-in-file-name       167         0.2854299999  0.0017091616
file-remote-p                              4088        0.1552450000  3.797...e-05
read-file-name-internal                    17          0.08041       0.00473
completion--file-name-table                17          0.080114      0.0047125882
file-exists-p                              101         0.0680669999  0.0006739306
completion--sifn-requote                   5           0.019765      0.003953


On Sep 19, 2021, at 12:55 PM, Michael Albinus <michael.albinus@gmx.de> wrote:

JD Smith <jdtsmith@gmail.com> writes:

Hi,

Thanks very much for this much improved testing code (which also saves
the tedium of slowly retyping!).  I altered it slightly to include a
few more function, and target my local wired server:

(progn
(require 'tramp-sh)
(tramp-cleanup-all-connections)
(elp-instrument-list '(file-exists-p completing-read
read-file-name-internal read-file-name-default
tramp-handle-file-name-completion
tramp-sh-handle-file-name-all-completions))
(setq unread-command-events (mapcar 'identity
"///ssh:datpi:/home/pi/no\tex\t/do\tma\tce\t\n"))
(call-interactively #'find-file)
(elp-results)
(elp-reset-all))

I've applied the same, except the remote file name.

My timing results (emacs -Q, v28.0.50):

From *scratch*:

read-file-name-default                     1           9.064781548   9.064781548
completing-read                            1           9.057834631   9.057834631
tramp-handle-file-name-completion          3           8.331385864   2.7771286213
tramp-sh-handle-file-name-all-completions  4           7.290909892   1.822727473
file-exists-p                              45          1.7296832099  0.0384374046
read-file-name-internal                    13          0.4099991600  0.0315383969

From remote dired:

read-file-name-default                     1           8.23891833    8.23891833
completing-read                            1           8.228419034   8.228419034
tramp-handle-file-name-completion          3           7.4998795480  2.4999598493
tramp-sh-handle-file-name-all-completions  4           6.463144493   1.6157861232
file-exists-p                              45          1.6901479139  0.0375588425
read-file-name-internal                    13          0.3952138859  0.0304010681

So really only very little difference inside the tramp completion
functions; they seem to be doing the same job independent of the
starting point.  But the completing-read itself, which is where
find-file is spending its time, is taking 8x longer!  And
read-file-name-internal is 35x slower.  Do you find this as well?
I’ll dig a bit deeper and see if I can narrow it down further.

With Emacs 28, the differences aren't so relevant. The absolute time is
much higher than in your case, but I have taken "savannah" as test host
which is "far from me".

Do you have a chance to compile Emacs from git, and run the test?

Best regards, Michael.


reply via email to

[Prev in Thread] Current Thread [Next in Thread]