emacs-devel
[Top][All Lists]
Advanced

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

Re: follow-mode: extremely slow in combination with org-mode


From: Gerald Wildgruber
Subject: Re: follow-mode: extremely slow in combination with org-mode
Date: Sun, 17 Jun 2018 16:56:00 +0200
User-agent: mu4e 1.1.0; emacs 27.0.50

Thanks again  Eli and Alan for picking this up!

Eli: the patch didn't apply cleanly (with "patch -p1 <" or "git apply"),
but as it is so simple I applied it manually.

follow-calc-win-end now looks like that:

==================================================

(defun follow-calc-win-end (&optional win)
  "Calculate the end position for window WIN.
Return (END-POS END-OF-BUFFER).

Actually, the position returned is the start of the line after
the last fully-visible line in WIN.  END-OF-BUFFER is t when EOB
is fully-visible in WIN.  If WIN is nil, the selected window is
used."
  (or win (setq win (selected-window)))
  (with-selected-window win
    (let* ((wend (window-end win t))
           (endp (= wend (point-max))))
      (and (> wend (point-min))
           (setq wend (1- wend)))
      (setq wend
            (save-excursion
              (goto-char wend)
              (line-beginning-position)))
      (list wend endp))))

==================================================

I byte compiled the patched follow.el restarted emacs and began editing.

It actually seems somewhat faster, though not enormously; I will
continue working with this patched version to see how it goes; I have a
more problematic (=slower) machine in my office, and I'm am eager to
see, if it makes a difference there; at home, where I'm testing right
now, its a new quad core xeon with 64gb of ram, -- and it is kind of
strange that with such a machine fans start very audibly as soon as you
start TYPING (not video editing or the like) :-)

One more observation: it might be that the slowing down becomes more
noticeable, the closer point gets to the bottom of the last window
(lower right edge of my five-fold splitted emacs frame), but I couldn't
reproduce this consistently.

Please count on me for any other testing that might be necessary! I'm no
programmer but will do my best to deliver usable results.

Here's how the profile looks now, with the patched, uncompiled follow.el
loaded right before profiling:

- follow-post-command-hook                                      17642  40%
 - if                                                           17642  40%
  - let                                                         17642  40%
   - save-current-buffer                                        17642  40%
    - follow-adjust-window                                      17642  40%
     - if                                                       17642  40%
      - progn                                                   17642  40%
       - let                                                    17591  40%
        - let*                                                  17560  40%
         - progn                                                16733  38%
          - follow-windows-start-end                            16730  38%
           - if                                                 16730  38%
            - let                                               16730  38%
             - let                                              16730  38%
              - while                                           16730  38%
               - setq                                           16719  38%
                - cons                                          16564  37%
                 - cons                                         16560  37%
                  - cons                                        16560  37%
                   - follow-calc-win-end                        16557  37%
                    - let                                       16557  37%
                     - save-current-buffer                      16557  37%
                      - unwind-protect                          16557  37%
                       - progn                                  16551  37%
                          let*                                  16548  37%
                         internal--after-with-selected-window                  
3   0%
                + follow-windows-start-end                        155   0%
         + if                                                     827   1%
        + follow-all-followers                                     27   0%
       + follow-avoid-tail-recenter                                51   0%
+ command-execute                                               17015  38%


Gerald.




On So, Jun 17 2018, Eli Zaretskii <address@hidden> wrote:

> Gerald, could you try the following patch to follow-calc-win-end?
> Please first see if this makes it significantly faster in your use
> cases, and if so, please run with it for a while and see if there are
> some adverse effects.  (If this is not faster, it isn't worth testing
> it more.)
>
> diff --git a/lisp/follow.el b/lisp/follow.el
> index fd397c0..c99fc93 100644
> --- a/lisp/follow.el
> +++ b/lisp/follow.el
> @@ -925,14 +925,17 @@ follow-calc-win-end
>  the last fully-visible line in WIN.  END-OF-BUFFER is t when EOB
>  is fully-visible in WIN.  If WIN is nil, the selected window is
>  used."
> -  (let* ((win (or win (selected-window)))
> -      (edges (window-inside-pixel-edges win))
> -      (ht (- (nth 3 edges) (nth 1 edges)))
> -      (last-line-pos (posn-point (posn-at-x-y 0 (1- ht) win))))
> -    (if (pos-visible-in-window-p last-line-pos win)
> -     (let ((end (window-end win t)))
> -       (list end (pos-visible-in-window-p (point-max) win)))
> -      (list last-line-pos nil))))
> +  (or win (setq win (selected-window)))
> +  (with-selected-window win
> +    (let* ((wend (window-end win t))
> +           (endp (= wend (point-max))))
> +      (and (> wend (point-min))
> +           (setq wend (1- wend)))
> +      (setq wend
> +            (save-excursion
> +              (goto-char wend)
> +              (line-beginning-position)))
> +      (list wend endp))))
>
>  (defun follow-calc-win-start (windows pos win)
>    "Determine the start of window WIN in a Follow mode window chain.

---------------------
Sent with mu4e



reply via email to

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