Subject: Re: bug#25706: 26.0.50; Slow C file fontification

From: Alan Mackenzie <[email-masked]>
Date: Thu, 3 Dec 2020 10:48:23 +0000

Hello, Mattias.

On Wed, Dec 02, 2020 at 16:06:43 +0100, Mattias Engdegård wrote:
> 2 dec. 2020 kl. 11.15 skrev Alan Mackenzie <[email-masked]>:

> > I spent yesterday evening investigating the "CC Mode state cache", i.e.
> > the thing that keeps track of braces and open parens/brackets.  I found a
> > place where it was unnecessarily causing scanning from BOB, and fixed it
> > provisionally.  On doing a (time-scroll) on the entire monster buffer, it
> > saved ~25% of the run time.  There is definitely something else scanning
> > repeatedly from BOB - the screen scrolling was more sluggish near the end
> > of the buffer than half way through.

I've found it.  There was a "harmless" c-backward-syntactic-ws invocation
in c-determine-limit.  This macro moves back over syntactic whitespace,
which includes macros.  So this was going back all the way to BOB, from
which we scanned forward again.

In the enclosed patch (which includes my previous amendment) I've removed
this.

There are many other places which invoke c-backward-syntactic-ws without
giving the limit argument, and these slow down CC Mode too, though not as
dramatically as the removed one.  I have given limits arguments to two of
these in c-font-complex-decl-prepare, which reduce the (time-scroll) time
for the last 10% of the entire monster file from ~77s to ~44s.

I intend to instrument c-backward-sws to determine which of the other
invocations of c-backward-syntactic-ws are most time consuming.  There
are around 90 such calls in CC Mode.  :-(

It now takes me just under 6 minutes to (time-scroll) through the entire
buffer, compared with a previous hour.  As already mentioned, it is still
slightly more sluggish near the end of the buffer than near the start.

> > Here's that provisional patch, if you'd like to try it:

So, here's another provisional patch:

diff -r 863d08a1858a cc-engine.el
--- a/cc-engine.el	Thu Nov 26 11:27:52 2020 +0000
+++ b/cc-engine.el	Thu Dec 03 10:43:45 2020 +0000
@@ -3672,9 +3672,7 @@
 	    how-far 0))
      ((<= good-pos here)
       (setq strategy 'forward
-	    start-point (if changed-macro-start
-			    cache-pos
-			  (max good-pos cache-pos))
+	    start-point (max good-pos cache-pos)
 	    how-far (- here start-point)))
      ((< (- good-pos here) (- here cache-pos)) ; FIXME!!! ; apply some sort of weighting.
       (setq strategy 'backward
@@ -5778,8 +5776,6 @@
   ;; Get a "safe place" approximately TRY-SIZE characters before START.
   ;; This defsubst doesn't preserve point.
   (goto-char start)
-  (c-backward-syntactic-ws)
-  (setq start (point))
   (let* ((pos (max (- start try-size) (point-min)))
 	 (s (c-semi-pp-to-literal pos))
 	 (cand (or (car (cddr s)) pos)))
diff -r 863d08a1858a cc-fonts.el
--- a/cc-fonts.el	Thu Nov 26 11:27:52 2020 +0000
+++ b/cc-fonts.el	Thu Dec 03 10:43:45 2020 +0000
@@ -948,7 +948,7 @@
     ;; closest token before the region.
     (save-excursion
       (let ((pos (point)))
-	(c-backward-syntactic-ws)
+	(c-backward-syntactic-ws (max (- (point) 500) (point-min)))
 	(c-clear-char-properties
 	 (if (and (not (bobp))
 		  (memq (c-get-char-property (1- (point)) 'c-type)
@@ -970,7 +970,7 @@
     ;; The declared identifiers are font-locked correctly as types, if
     ;; that is what they are.
     (let ((prop (save-excursion
-		  (c-backward-syntactic-ws)
+		  (c-backward-syntactic-ws (max (- (point) 500) (point-min)))
 		  (unless (bobp)
 		    (c-get-char-property (1- (point)) 'c-type)))))
       (when (memq prop '(c-decl-id-start c-decl-type-start))

[ .... ]

-- 
Alan Mackenzie (Nuremberg, Germany).