GNU bug report logs - #25706
26.0.50; Slow C file fontification

Previous Next

Packages: cc-mode, emacs;

Reported by: Sujith <m.sujith <at> gmail.com>

Date: Mon, 13 Feb 2017 18:41:01 UTC

Severity: normal

Tags: moreinfo

Found in version 26.0.50

Done: Alan Mackenzie <acm <at> muc.de>

Bug is archived. No further changes may be made.

Full log


Message #83 received at 25706 <at> debbugs.gnu.org (full text, mbox):

From: Alan Mackenzie <acm <at> muc.de>
To: Mattias EngdegÄrd <mattiase <at> acm.org>
Cc: Lars Ingebrigtsen <larsi <at> gnus.org>, 25706 <at> debbugs.gnu.org
Subject: Re: bug#25706: 26.0.50; Slow C file fontification
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 <acm <at> muc.de>:

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




This bug report was last modified 4 years and 213 days ago.

Previous Next


GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997,2003 nCipher Corporation Ltd, 1994-97 Ian Jackson.