unofficial mirror of bug-gnu-emacs@gnu.org 
 help / color / mirror / code / Atom feed
* bug#56682: Fix the long lines font locking related slowdowns
@ 2022-07-21 18:00 Gregory Heytings
  2022-07-21 18:04 ` Eli Zaretskii
  2022-08-01 16:34 ` Eli Zaretskii
  0 siblings, 2 replies; 685+ messages in thread
From: Gregory Heytings @ 2022-07-21 18:00 UTC (permalink / raw)
  To: 56682


New bug number and thread to discuss the next chapter of the long lines 
slowdowns.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-21 18:00 bug#56682: Fix the long lines font locking related slowdowns Gregory Heytings
@ 2022-07-21 18:04 ` Eli Zaretskii
  2022-07-22 10:16   ` Gregory Heytings
  2022-07-22 23:25   ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-08-01 16:34 ` Eli Zaretskii
  1 sibling, 2 replies; 685+ messages in thread
From: Eli Zaretskii @ 2022-07-21 18:04 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682

> Date: Thu, 21 Jul 2022 18:00:37 +0000
> From: Gregory Heytings <gregory@heytings.org>
> 
> New bug number and thread to discuss the next chapter of the long lines 
> slowdowns.

Thanks.

FTR, I repeat here the recipe from
https://debbugs.gnu.org/cgi/bugreport.cgi?bug=56393#425:

  emacs -Q
  C-x C-f long-line.xml RET

Now, do NOT disable font-lock, and wait for Emacs to say "Valid" in
the mode line (to get nXML mode out of the way).  Then:

  M-x toggle-truncate-lines RET

Now simple cursor motion commands that use redisplay optimizations are
fast, but commands that cause more thorough redisplay are as slow as
on master.  As a simple example, try just "M-x" and wait until the
"M-x" prompt appears in the minibuffer -- here it takes much longer,
basically as long as the version on master.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-21 18:04 ` Eli Zaretskii
@ 2022-07-22 10:16   ` Gregory Heytings
  2022-07-22 14:11     ` Eli Zaretskii
                       ` (2 more replies)
  2022-07-22 23:25   ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  1 sibling, 3 replies; 685+ messages in thread
From: Gregory Heytings @ 2022-07-22 10:16 UTC (permalink / raw)
  To: 56682; +Cc: Eli Zaretskii


The first step of the font locking related improvements was easier than I 
thought.

Two following commands:

1. C-x C-f dictionary.json RET y

2. C-e

on my laptop, with Emacs from master from a week ago, take respectively 
150 seconds and 40 seconds.  With the improvements on master, 1 is 
instantaneous but 2 still takes about 5 seconds.  Now, with the changes in 
the feature/long-lines-and-font-locking branch, both are instantaneous. 
The price of that speedup is that some portions of the buffer will be 
mis-highlighted, which is unavoidable.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-22 10:16   ` Gregory Heytings
@ 2022-07-22 14:11     ` Eli Zaretskii
  2022-07-22 14:44       ` Lars Ingebrigtsen
  2022-07-22 14:51     ` Eli Zaretskii
  2022-07-23  6:10     ` Eli Zaretskii
  2 siblings, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-07-22 14:11 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682

> Date: Fri, 22 Jul 2022 10:16:52 +0000
> From: Gregory Heytings <gregory@heytings.org>
> cc: Eli Zaretskii <eliz@gnu.org>
> 
> 
> The first step of the font locking related improvements was easier than I 
> thought.
> 
> Two following commands:
> 
> 1. C-x C-f dictionary.json RET y
> 
> 2. C-e
> 
> on my laptop, with Emacs from master from a week ago, take respectively 
> 150 seconds and 40 seconds.  With the improvements on master, 1 is 
> instantaneous but 2 still takes about 5 seconds.  Now, with the changes in 
> the feature/long-lines-and-font-locking branch, both are instantaneous. 
> The price of that speedup is that some portions of the buffer will be 
> mis-highlighted, which is unavoidable.

Thanks.  This is indeed the immediate idea for that aspect, but I
wonder what would developers of some major modes which widen the
buffer say about this.  Some of them were very much against such
restrictions in the past.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-22 14:11     ` Eli Zaretskii
@ 2022-07-22 14:44       ` Lars Ingebrigtsen
  2022-07-25 20:59         ` Gregory Heytings
  0 siblings, 1 reply; 685+ messages in thread
From: Lars Ingebrigtsen @ 2022-07-22 14:44 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, Gregory Heytings, Stefan Monnier

Eli Zaretskii <eliz@gnu.org> writes:

> Thanks.  This is indeed the immediate idea for that aspect, but I
> wonder what would developers of some major modes which widen the
> buffer say about this.  Some of them were very much against such
> restrictions in the past.

This reminds me of something I meant to mention -- Stefan M. once
proposed that there should be two kinds of narrowing (I think?).  The
first is the one that the user sets with `C-x n n', which says "the user
is only interested in this bit of the buffer", but programs are
"allowed" to remove that restriction when doing stuff (like font
locking).  The second type should be a strict one, where modes are not
allowed to widen the region.

Looking briefly at Gregory's new branch, it seems like that (sort of)
introduces this idea, but in a non-explicit way (i.e., by having an
inhibit-widen variable).

And, yes, some major mode authors were against this idea, but I think it
sounds like a sound idea.  And perhaps it'd make sense to implement it
like Stefan suggested, instead of `inhibit-widen'.

I've added Stefan to the CCs; perhaps he has some comments.

-- 
(domestic pets only, the antidote for overdose, milk.)
   bloggy blog: http://lars.ingebrigtsen.no





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-22 10:16   ` Gregory Heytings
  2022-07-22 14:11     ` Eli Zaretskii
@ 2022-07-22 14:51     ` Eli Zaretskii
  2022-07-22 15:06       ` Eli Zaretskii
  2022-07-23  6:10     ` Eli Zaretskii
  2 siblings, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-07-22 14:51 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682

> Date: Fri, 22 Jul 2022 10:16:52 +0000
> From: Gregory Heytings <gregory@heytings.org>
> cc: Eli Zaretskii <eliz@gnu.org>
> 
> 
> on my laptop, with Emacs from master from a week ago, take respectively 
> 150 seconds and 40 seconds.  With the improvements on master, 1 is 
> instantaneous but 2 still takes about 5 seconds.  Now, with the changes in 
> the feature/long-lines-and-font-locking branch, both are instantaneous. 
> The price of that speedup is that some portions of the buffer will be 
> mis-highlighted, which is unavoidable.

The assertion below can now be violated:

      if (it->narrowed_begv)
	{
	  record_unwind_protect (unwind_narrowed_begv, Fpoint_min ());
	  record_unwind_protect (unwind_narrowed_zv, Fpoint_max ());
	  SET_BUF_BEGV (current_buffer, it->narrowed_begv);
	  SET_BUF_ZV (current_buffer, it->narrowed_zv);
	  specbind (Qinhibit_widen, Qt);
	}

      val = Vfontification_functions;
      specbind (Qfontification_functions, Qnil);

      eassert (it->end_charpos == ZV);  <<<<<<<<<<<<<<<<<

because of the "narrowing".  (I actually saw this assertion violation
once on the branch, but I cannot reproduce it.)





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-22 14:51     ` Eli Zaretskii
@ 2022-07-22 15:06       ` Eli Zaretskii
  2022-07-22 19:25         ` Eli Zaretskii
  0 siblings, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-07-22 15:06 UTC (permalink / raw)
  To: gregory; +Cc: 56682

> Cc: 56682@debbugs.gnu.org
> Date: Fri, 22 Jul 2022 17:51:33 +0300
> From: Eli Zaretskii <eliz@gnu.org>
> 
> > Date: Fri, 22 Jul 2022 10:16:52 +0000
> > From: Gregory Heytings <gregory@heytings.org>
> > cc: Eli Zaretskii <eliz@gnu.org>
> > 
> > 
> > on my laptop, with Emacs from master from a week ago, take respectively 
> > 150 seconds and 40 seconds.  With the improvements on master, 1 is 
> > instantaneous but 2 still takes about 5 seconds.  Now, with the changes in 
> > the feature/long-lines-and-font-locking branch, both are instantaneous. 
> > The price of that speedup is that some portions of the buffer will be 
> > mis-highlighted, which is unavoidable.
> 
> The assertion below can now be violated:
> 
>       if (it->narrowed_begv)
> 	{
> 	  record_unwind_protect (unwind_narrowed_begv, Fpoint_min ());
> 	  record_unwind_protect (unwind_narrowed_zv, Fpoint_max ());
> 	  SET_BUF_BEGV (current_buffer, it->narrowed_begv);
> 	  SET_BUF_ZV (current_buffer, it->narrowed_zv);
> 	  specbind (Qinhibit_widen, Qt);
> 	}
> 
>       val = Vfontification_functions;
>       specbind (Qfontification_functions, Qnil);
> 
>       eassert (it->end_charpos == ZV);  <<<<<<<<<<<<<<<<<
> 
> because of the "narrowing".  (I actually saw this assertion violation
> once on the branch, but I cannot reproduce it.)

Sorry, it's very easy to reproduce: visit dictionary.josn, and then
type C-v several times until it happens.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-22 15:06       ` Eli Zaretskii
@ 2022-07-22 19:25         ` Eli Zaretskii
  0 siblings, 0 replies; 685+ messages in thread
From: Eli Zaretskii @ 2022-07-22 19:25 UTC (permalink / raw)
  To: gregory; +Cc: 56682

> Cc: 56682@debbugs.gnu.org
> Date: Fri, 22 Jul 2022 18:06:44 +0300
> From: Eli Zaretskii <eliz@gnu.org>
> 
> > The assertion below can now be violated:
> > 
> >       if (it->narrowed_begv)
> > 	{
> > 	  record_unwind_protect (unwind_narrowed_begv, Fpoint_min ());
> > 	  record_unwind_protect (unwind_narrowed_zv, Fpoint_max ());
> > 	  SET_BUF_BEGV (current_buffer, it->narrowed_begv);
> > 	  SET_BUF_ZV (current_buffer, it->narrowed_zv);
> > 	  specbind (Qinhibit_widen, Qt);
> > 	}
> > 
> >       val = Vfontification_functions;
> >       specbind (Qfontification_functions, Qnil);
> > 
> >       eassert (it->end_charpos == ZV);  <<<<<<<<<<<<<<<<<
> > 
> > because of the "narrowing".  (I actually saw this assertion violation
> > once on the branch, but I cannot reproduce it.)
> 
> Sorry, it's very easy to reproduce: visit dictionary.josn, and then
> type C-v several times until it happens.

I installed a fix.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-21 18:04 ` Eli Zaretskii
  2022-07-22 10:16   ` Gregory Heytings
@ 2022-07-22 23:25   ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-07-23  6:41     ` Eli Zaretskii
  2022-07-25 21:23     ` Gregory Heytings
  1 sibling, 2 replies; 685+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2022-07-22 23:25 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, Gregory Heytings

Before using a blunt tool like the forced-narrowing now in
`feature/long-lines-and-font-locking`, I think we should try and figure
out *why* the recipe below is so slow.

For example, the behavior surprises me because I can't see why `M-x`
should cause any font-locking at all in the `long-line.xml` file.

[ Other side note: IIRC `nxml-mode` uses font-lock and syntax-propertize
  in somewhat unusual ways (it started doing all of that work "by hand"
  in its own way, and only later was it coerced to try and play along
  with that "standard" infrastructure), so the problem may be specific to
  nxml-mode.  ]


        Stefan






^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-22 10:16   ` Gregory Heytings
  2022-07-22 14:11     ` Eli Zaretskii
  2022-07-22 14:51     ` Eli Zaretskii
@ 2022-07-23  6:10     ` Eli Zaretskii
  2022-07-23  7:07       ` Gerd Möllmann
  2 siblings, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-07-23  6:10 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, Stefan Monnier

> Date: Fri, 22 Jul 2022 10:16:52 +0000
> From: Gregory Heytings <gregory@heytings.org>
> cc: Eli Zaretskii <eliz@gnu.org>
> 
> on my laptop, with Emacs from master from a week ago, take respectively 
> 150 seconds and 40 seconds.  With the improvements on master, 1 is 
> instantaneous but 2 still takes about 5 seconds.  Now, with the changes in 
> the feature/long-lines-and-font-locking branch, both are instantaneous. 
> The price of that speedup is that some portions of the buffer will be 
> mis-highlighted, which is unavoidable.

The branch is much faster, indeed, but still font-lock imposes a
significant penalty on commands that needs to redisplay.  For example,
running the following simple benchmark:

  (defun scroll-up-benchmark ()
    (interactive)
    (let ((oldgc gcs-done)
	  (oldtime (float-time)))
      (condition-case nil (while t (scroll-up) (redisplay))
	(error (message "GCs: %d Elapsed time: %f seconds"
			(- gcs-done oldgc) (- (float-time) oldtime))))))

on long-line.xml produces a 15-fold slowdown with font-lock turned on
as compared to its being turned off (203 sec vs 13 sec).

This is an unoptimized build, so you will probably see times that are
4 times faster, but I'd be interested in the relative times on your
system.  Any explanations of the slowdown are also welcome.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-22 23:25   ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2022-07-23  6:41     ` Eli Zaretskii
  2022-07-23 14:07       ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-07-25 21:23     ` Gregory Heytings
  1 sibling, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-07-23  6:41 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: 56682, gregory

> From: Stefan Monnier <monnier@iro.umontreal.ca>
> Cc: Gregory Heytings <gregory@heytings.org>,  56682@debbugs.gnu.org
> Date: Fri, 22 Jul 2022 19:25:47 -0400
> 
> For example, the behavior surprises me because I can't see why `M-x`
> should cause any font-locking at all in the `long-line.xml` file.

Any command that enters the minibuffer causes a thorough redisplay of
the windows on that frame (because more than one window has to be
updated).  What does that have to do with font-lock is a separate
question (but you are the best person to answer it).





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-23  6:10     ` Eli Zaretskii
@ 2022-07-23  7:07       ` Gerd Möllmann
  2022-07-23  7:12         ` Eli Zaretskii
  2022-07-23  7:18         ` Gerd Möllmann
  0 siblings, 2 replies; 685+ messages in thread
From: Gerd Möllmann @ 2022-07-23  7:07 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, Gregory Heytings, Stefan Monnier

Eli Zaretskii <eliz@gnu.org> writes:

> on long-line.xml produces a 15-fold slowdown with font-lock turned on
> as compared to its being turned off (203 sec vs 13 sec).
>
> This is an unoptimized build, so you will probably see times that are
> 4 times faster, but I'd be interested in the relative times on your
> system.  Any explanations of the slowdown are also welcome.

MacOS 12.5, M1 chip
Head: 792734a6e2cd5558debc8d9fe95d34cb3e809fa4 Improve efficiency of DND
tooltip movement
./configure --with-native-compilation

The long-lines.xml is 313295 bytes.  Hope that's the right one.

Font-lock       Output
------------------------------------------------------------
on              GCs: 14 Elapsed time: 7.880788 seconds
off             GCs: 2 Elapsed time: 0.885791 seconds





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-23  7:07       ` Gerd Möllmann
@ 2022-07-23  7:12         ` Eli Zaretskii
  2022-07-23  7:30           ` Gerd Möllmann
  2022-07-23  7:18         ` Gerd Möllmann
  1 sibling, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-07-23  7:12 UTC (permalink / raw)
  To: Gerd Möllmann; +Cc: 56682, gregory, monnier

> From: Gerd Möllmann <gerd.moellmann@gmail.com>
> Cc: Gregory Heytings <gregory@heytings.org>,  56682@debbugs.gnu.org,  Stefan
>  Monnier <monnier@iro.umontreal.ca>
> Date: Sat, 23 Jul 2022 09:07:53 +0200
> 
> Eli Zaretskii <eliz@gnu.org> writes:
> 
> > on long-line.xml produces a 15-fold slowdown with font-lock turned on
> > as compared to its being turned off (203 sec vs 13 sec).
> >
> > This is an unoptimized build, so you will probably see times that are
> > 4 times faster, but I'd be interested in the relative times on your
> > system.  Any explanations of the slowdown are also welcome.
> 
> MacOS 12.5, M1 chip
> Head: 792734a6e2cd5558debc8d9fe95d34cb3e809fa4 Improve efficiency of DND
> tooltip movement
> ./configure --with-native-compilation
> 
> The long-lines.xml is 313295 bytes.  Hope that's the right one.
> 
> Font-lock       Output
> ------------------------------------------------------------
> on              GCs: 14 Elapsed time: 7.880788 seconds
> off             GCs: 2 Elapsed time: 0.885791 seconds

Thanks.  This is still an order-of-magnitude slowdown, so the question
about the reasons is still relevant.

One thing we do under font-lock is merging faces, but that's supposed
to be very fast nowadays, given that faces are kept in a hash-table.
And what jit-lock does when the text is already fontified should be
negligible, right?





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-23  7:07       ` Gerd Möllmann
  2022-07-23  7:12         ` Eli Zaretskii
@ 2022-07-23  7:18         ` Gerd Möllmann
  2022-07-23  8:00           ` Gerd Möllmann
  1 sibling, 1 reply; 685+ messages in thread
From: Gerd Möllmann @ 2022-07-23  7:18 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, Gregory Heytings, Stefan Monnier

Gerd Möllmann <gerd.moellmann@gmail.com> writes:

> Font-lock       Output
> ------------------------------------------------------------
> on              GCs: 14 Elapsed time: 7.880788 seconds
  on, and large gc-const-threshold
                  GCs: 0 Elapsed time: 7.720531 seconds
> off             GCs: 2 Elapsed time: 0.885791 seconds







^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-23  7:12         ` Eli Zaretskii
@ 2022-07-23  7:30           ` Gerd Möllmann
  0 siblings, 0 replies; 685+ messages in thread
From: Gerd Möllmann @ 2022-07-23  7:30 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, gregory, monnier

Eli Zaretskii <eliz@gnu.org> writes:

> And what jit-lock does when the text is already fontified should be
> negligible, right?

The iterator doesn't even stop and call jit-lock on regions with
'fontified' property, i.e. after font-lock.  I can't imagine ATM why
somone would have changed that.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-23  7:18         ` Gerd Möllmann
@ 2022-07-23  8:00           ` Gerd Möllmann
  2022-07-23  8:04             ` Gerd Möllmann
  0 siblings, 1 reply; 685+ messages in thread
From: Gerd Möllmann @ 2022-07-23  8:00 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, Gregory Heytings, Stefan Monnier

[-- Attachment #1: Type: text/plain, Size: 636 bytes --]

> Gerd Möllmann <gerd.moellmann@gmail.com> writes:
>
>> Font-lock       Output
>> ------------------------------------------------------------
>> on              GCs: 14 Elapsed time: 7.880788 seconds
>   on, and large gc-const-threshold
>                   GCs: 0 Elapsed time: 7.720531 seconds
>> off             GCs: 2 Elapsed time: 0.885791 seconds

I've profiled this.  The result looks sensible, but I have to add that I
had mixed results with profiling optimized builds, so maybe...  Just
saying.

Sorry for posting an image.  I haven't found a way to get that info from
Instruments as text (pointers welcome).


[-- Attachment #2: Instrumens profile --]
[-- Type: image/png, Size: 209471 bytes --]

^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-23  8:00           ` Gerd Möllmann
@ 2022-07-23  8:04             ` Gerd Möllmann
  2022-07-23  8:11               ` Gerd Möllmann
  0 siblings, 1 reply; 685+ messages in thread
From: Gerd Möllmann @ 2022-07-23  8:04 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, Gregory Heytings, Stefan Monnier

Gerd Möllmann <gerd.moellmann@gmail.com> writes:

>> Gerd Möllmann <gerd.moellmann@gmail.com> writes:
>>
>>> Font-lock       Output
>>> ------------------------------------------------------------
>>> on              GCs: 14 Elapsed time: 7.880788 seconds
>>   on, and large gc-const-threshold
>>                  GCs: 0 Elapsed time: 7.720531 seconds
    on, without scroll-bar
                    GCs: 15 Elapsed time: 5.574946 seconds
>>> off             GCs: 2 Elapsed time: 0.885791 seconds






^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-23  8:04             ` Gerd Möllmann
@ 2022-07-23  8:11               ` Gerd Möllmann
  2022-07-23 13:42                 ` Eli Zaretskii
  0 siblings, 1 reply; 685+ messages in thread
From: Gerd Möllmann @ 2022-07-23  8:11 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, Gregory Heytings, Stefan Monnier

Gerd Möllmann <gerd.moellmann@gmail.com> writes:

> Gerd Möllmann <gerd.moellmann@gmail.com> writes:
>
>>> Gerd Möllmann <gerd.moellmann@gmail.com> writes:
>>>
>>>> Font-lock       Output
>>>> ------------------------------------------------------------
>>>> on              GCs: 14 Elapsed time: 7.880788 seconds
>>>   on, and large gc-const-threshold
>>>                  GCs: 0 Elapsed time: 7.720531 seconds
>     on, without scroll-bar
>                    GCs: 15 Elapsed time: 5.574946 seconds
      on without scroll-bar, auto-composition-mode off
                     GCs: 15 Elapsed time: 4.166101 seconds
>>>> off             GCs: 2 Elapsed time: 0.885791 seconds

Hm.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-23  8:11               ` Gerd Möllmann
@ 2022-07-23 13:42                 ` Eli Zaretskii
  2022-07-23 14:25                   ` Gerd Möllmann
                                     ` (3 more replies)
  0 siblings, 4 replies; 685+ messages in thread
From: Eli Zaretskii @ 2022-07-23 13:42 UTC (permalink / raw)
  To: Gerd Möllmann; +Cc: 56682, gregory, monnier

> From: Gerd Möllmann <gerd.moellmann@gmail.com>
> Cc: 56682@debbugs.gnu.org,  Gregory Heytings <gregory@heytings.org>,  Stefan
>  Monnier <monnier@iro.umontreal.ca>
> Date: Sat, 23 Jul 2022 10:11:04 +0200
> 
> Gerd Möllmann <gerd.moellmann@gmail.com> writes:
> 
> > Gerd Möllmann <gerd.moellmann@gmail.com> writes:
> >
> >>> Gerd Möllmann <gerd.moellmann@gmail.com> writes:
> >>>
> >>>> Font-lock       Output
> >>>> ------------------------------------------------------------
> >>>> on              GCs: 14 Elapsed time: 7.880788 seconds
> >>>   on, and large gc-const-threshold
> >>>                  GCs: 0 Elapsed time: 7.720531 seconds
> >     on, without scroll-bar
> >                    GCs: 15 Elapsed time: 5.574946 seconds
>       on without scroll-bar, auto-composition-mode off
>                      GCs: 15 Elapsed time: 4.166101 seconds
> >>>> off             GCs: 2 Elapsed time: 0.885791 seconds
> 
> Hm.

scroll-bar could be an issue only if we enter the new code that
doesn't use window_end_pos if it cannot be trusted.  Perhaps when
long-line optimizations are turned on for a buffer, we shouldn't try
to be holier than the Pope, and should use window_end_pos even if not
reliable?

And I've found a serious sink of CPU cycles under truncate-lines, and
installed a fix on the feature branch.  Gerd, if you have time to
eyeball the fix and comment on it, I'd appreciate.  It's commit
350e97d on the branch.  (I can post a more detailed explanation of
what I did and why, if that would help, because the code and the
functions it calls are somewhat tricky.)

After these changes, display of very long lines is quite reasonable,
when truncate-lines or truncate-partial-width-windows is in effect,
even without turning off font-lock and even in an unoptimized build.
Amusingly enough, show-paren-mode is now a serious performance killer
in these cases, because it puts overlays on buffer text, and that
disables a shortcut in the code that finds the next visible line
start, which is called a lot when lines are truncated.  Maybe we need
a smarter optimization there, one that doesn't immediately give up as
soon as it sees an overlay.  Hmm...





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-23  6:41     ` Eli Zaretskii
@ 2022-07-23 14:07       ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-07-23 15:29         ` Eli Zaretskii
  0 siblings, 1 reply; 685+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2022-07-23 14:07 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, gregory

>> From: Stefan Monnier <monnier@iro.umontreal.ca>
>> Cc: Gregory Heytings <gregory@heytings.org>,  56682@debbugs.gnu.org
>> Date: Fri, 22 Jul 2022 19:25:47 -0400
>> 
>> For example, the behavior surprises me because I can't see why `M-x`
>> should cause any font-locking at all in the `long-line.xml` file.
>
> Any command that enters the minibuffer causes a thorough redisplay of
> the windows on that frame (because more than one window has to be
> updated).  What does that have to do with font-lock is a separate
> question (but you are the best person to answer it).

AFAIK if the buffer has not been modified (including things like
changing `window-start` or `point`), then a redisplay will just not
run jit-lock (and hence font-lock) at all, no matter how thorough.


        Stefan






^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-23 13:42                 ` Eli Zaretskii
@ 2022-07-23 14:25                   ` Gerd Möllmann
  2022-07-23 14:33                     ` Gerd Möllmann
                                       ` (2 more replies)
  2022-07-23 14:47                   ` Eli Zaretskii
                                     ` (2 subsequent siblings)
  3 siblings, 3 replies; 685+ messages in thread
From: Gerd Möllmann @ 2022-07-23 14:25 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, gregory, monnier

Eli Zaretskii <eliz@gnu.org> writes:

> And I've found a serious sink of CPU cycles under truncate-lines, and
> installed a fix on the feature branch.  Gerd, if you have time to
> eyeball the fix and comment on it, I'd appreciate.  It's commit
> 350e97d on the branch.  (I can post a more detailed explanation of
> what I did and why, if that would help, because the code and the
> functions it calls are somewhat tricky.)

I'll look at it and come back.

BTW, does feature/long-lines-and-font-locking] build for you?  I'm getting

In toplevel form:
cedet/semantic/symref/list.el:35:2: Error: Wrong type argument: number-or-marker-p, nil
make[2]: *** [cedet/semantic/symref/list.elc] Error 1
make[2]: *** Waiting for unfinished jobs....
make[1]: *** [compile-main] Error 2
make: *** [lisp] Error 2

Configured --with-native-compilation.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-23 14:25                   ` Gerd Möllmann
@ 2022-07-23 14:33                     ` Gerd Möllmann
  2022-07-23 15:43                       ` Eli Zaretskii
  2022-07-23 14:35                     ` Visuwesh
  2022-07-23 14:35                     ` Gerd Möllmann
  2 siblings, 1 reply; 685+ messages in thread
From: Gerd Möllmann @ 2022-07-23 14:33 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, gregory, monnier

Gerd Möllmann <gerd.moellmann@gmail.com> writes:

> Eli Zaretskii <eliz@gnu.org> writes:
>
>> And I've found a serious sink of CPU cycles under truncate-lines, and
>> installed a fix on the feature branch.  Gerd, if you have time to
>> eyeball the fix and comment on it, I'd appreciate.  It's commit
>> 350e97d on the branch.  (I can post a more detailed explanation of
>> what I did and why, if that would help, because the code and the
>> functions it calls are somewhat tricky.)
>
> I'll look at it and come back.

modified   src/xdisp.c
@@ -7153,10 +7153,10 @@ forward_to_next_line_start (struct it *it, bool *skipped_p,
 	  || ((pos = Fnext_single_property_change (make_fixnum (start),
 						   Qdisplay, Qnil,
 						   make_fixnum (limit)),
-	       NILP (pos))
+	       (NILP (pos) || XFIXNAT (pos) == limit))
 	      && next_overlay_change (start) == ZV))
 	{
-	  if (!it->bidi_p)
+	  if (!it->bidi_p || !bidi_it_prev)
 	    {
 	      IT_CHARPOS (*it) = limit;
 	      IT_BYTEPOS (*it) = bytepos;

I understand the first diff, which makes a lot of sense, but I'm afraid
I don't know enough about bidi to be of any help.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-23 14:25                   ` Gerd Möllmann
  2022-07-23 14:33                     ` Gerd Möllmann
@ 2022-07-23 14:35                     ` Visuwesh
  2022-07-23 14:46                       ` Gerd Möllmann
  2022-07-23 14:35                     ` Gerd Möllmann
  2 siblings, 1 reply; 685+ messages in thread
From: Visuwesh @ 2022-07-23 14:35 UTC (permalink / raw)
  To: Gerd Möllmann; +Cc: 56682, Eli Zaretskii, gregory, monnier

[சனி ஜூலை 23, 2022] Gerd Möllmann wrote:

> Eli Zaretskii <eliz@gnu.org> writes:
>
>> And I've found a serious sink of CPU cycles under truncate-lines, and
>> installed a fix on the feature branch.  Gerd, if you have time to
>> eyeball the fix and comment on it, I'd appreciate.  It's commit
>> 350e97d on the branch.  (I can post a more detailed explanation of
>> what I did and why, if that would help, because the code and the
>> functions it calls are somewhat tricky.)
>
> I'll look at it and come back.
>
> BTW, does feature/long-lines-and-font-locking] build for you?  I'm getting
>
> In toplevel form:
> cedet/semantic/symref/list.el:35:2: Error: Wrong type argument: number-or-marker-p, nil
> make[2]: *** [cedet/semantic/symref/list.elc] Error 1
> make[2]: *** Waiting for unfinished jobs....
> make[1]: *** [compile-main] Error 2
> make: *** [lisp] Error 2
>
> Configured --with-native-compilation.

I think Eli fixed it in the master branch in commit 4a4fcf628e1e4c8db47cd62fa5617b662fa8b5d6.

https://git.savannah.gnu.org/cgit/emacs.git/commit/?id=4a4fcf628e1e4c8db47cd62fa5617b662fa8b5d6





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-23 14:25                   ` Gerd Möllmann
  2022-07-23 14:33                     ` Gerd Möllmann
  2022-07-23 14:35                     ` Visuwesh
@ 2022-07-23 14:35                     ` Gerd Möllmann
  2 siblings, 0 replies; 685+ messages in thread
From: Gerd Möllmann @ 2022-07-23 14:35 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, gregory, monnier

Gerd Möllmann <gerd.moellmann@gmail.com> writes:

> BTW, does feature/long-lines-and-font-locking] build for you?  I'm getting
>
> In toplevel form:
> cedet/semantic/symref/list.el:35:2: Error: Wrong type argument: number-or-marker-p, nil
> make[2]: *** [cedet/semantic/symref/list.elc] Error 1
> make[2]: *** Waiting for unfinished jobs....
> make[1]: *** [compile-main] Error 2
> make: *** [lisp] Error 2
>
> Configured --with-native-compilation.

Same without native compilation.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-23 14:35                     ` Visuwesh
@ 2022-07-23 14:46                       ` Gerd Möllmann
  2022-07-23 15:01                         ` Gerd Möllmann
  0 siblings, 1 reply; 685+ messages in thread
From: Gerd Möllmann @ 2022-07-23 14:46 UTC (permalink / raw)
  To: Visuwesh; +Cc: 56682, Eli Zaretskii, gregory, monnier

Visuwesh <visuweshm@gmail.com> writes:

> I think Eli fixed it in the master branch in commit 4a4fcf628e1e4c8db47cd62fa5617b662fa8b5d6.

Yup that worked.  Thanks!





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-23 13:42                 ` Eli Zaretskii
  2022-07-23 14:25                   ` Gerd Möllmann
@ 2022-07-23 14:47                   ` Eli Zaretskii
  2022-07-23 15:04                   ` Gerd Möllmann
  2022-07-25 21:47                   ` Gregory Heytings
  3 siblings, 0 replies; 685+ messages in thread
From: Eli Zaretskii @ 2022-07-23 14:47 UTC (permalink / raw)
  To: gregory; +Cc: gerd.moellmann, 56682, monnier

Another observation: any command that calls current_column, directly
or indirectly, will be very slow with long lines.  This includes
"C-x =" and column-number-mode, for example.

I installed a change to avoid calling current_column where possible,
but the problem is we have a bytecode which calls it, and it is
impossible to avoid the call because it could break some callers.
Perhaps we should expose the long-line-optimization flag to Lisp, so
that commands like what-cursor-position could refrain from calling
current-column.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-23 14:46                       ` Gerd Möllmann
@ 2022-07-23 15:01                         ` Gerd Möllmann
  2022-07-23 16:02                           ` Eli Zaretskii
  0 siblings, 1 reply; 685+ messages in thread
From: Gerd Möllmann @ 2022-07-23 15:01 UTC (permalink / raw)
  To: Visuwesh; +Cc: 56682, Eli Zaretskii, gregory, monnier

And the new lottery numbers on the feature branch are:

Font-lock Scroll-bar Composition Output
------------------------------------------------------------
on	  on	     on		 GCs: 14 Elapsed time: 7.276626 seconds
on	  off	     on		 GCs: 1 Elapsed time: 5.363002 seconds
on	  off	     off	 GCs: 1 Elapsed time: 3.967520 seconds





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-23 13:42                 ` Eli Zaretskii
  2022-07-23 14:25                   ` Gerd Möllmann
  2022-07-23 14:47                   ` Eli Zaretskii
@ 2022-07-23 15:04                   ` Gerd Möllmann
  2022-07-23 16:03                     ` Eli Zaretskii
  2022-07-25 21:47                   ` Gregory Heytings
  3 siblings, 1 reply; 685+ messages in thread
From: Gerd Möllmann @ 2022-07-23 15:04 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, gregory, monnier

Eli Zaretskii <eliz@gnu.org> writes:

> Perhaps when
> long-line optimizations are turned on for a buffer, we shouldn't try
> to be holier than the Pope, and should use window_end_pos even if not
> reliable?

I don't think anyone would complain.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-23 14:07       ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2022-07-23 15:29         ` Eli Zaretskii
  2022-07-23 15:46           ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  0 siblings, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-07-23 15:29 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: 56682, gregory

> From: Stefan Monnier <monnier@iro.umontreal.ca>
> Cc: gregory@heytings.org,  56682@debbugs.gnu.org
> Date: Sat, 23 Jul 2022 10:07:29 -0400
> 
> >> From: Stefan Monnier <monnier@iro.umontreal.ca>
> >> Cc: Gregory Heytings <gregory@heytings.org>,  56682@debbugs.gnu.org
> >> Date: Fri, 22 Jul 2022 19:25:47 -0400
> >> 
> >> For example, the behavior surprises me because I can't see why `M-x`
> >> should cause any font-locking at all in the `long-line.xml` file.
> >
> > Any command that enters the minibuffer causes a thorough redisplay of
> > the windows on that frame (because more than one window has to be
> > updated).  What does that have to do with font-lock is a separate
> > question (but you are the best person to answer it).
> 
> AFAIK if the buffer has not been modified (including things like
> changing `window-start` or `point`), then a redisplay will just not
> run jit-lock (and hence font-lock) at all, no matter how thorough.

But the fact is without font-lock the response is faster by a large
factor.  So something, somewhere, still depends on font-lock.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-23 14:33                     ` Gerd Möllmann
@ 2022-07-23 15:43                       ` Eli Zaretskii
  0 siblings, 0 replies; 685+ messages in thread
From: Eli Zaretskii @ 2022-07-23 15:43 UTC (permalink / raw)
  To: Gerd Möllmann; +Cc: 56682, gregory, monnier

> From: Gerd Möllmann <gerd.moellmann@gmail.com>
> Cc: 56682@debbugs.gnu.org,  gregory@heytings.org,  monnier@iro.umontreal.ca
> Date: Sat, 23 Jul 2022 16:33:28 +0200
> 
> Gerd Möllmann <gerd.moellmann@gmail.com> writes:
> 
> > Eli Zaretskii <eliz@gnu.org> writes:
> >
> >> And I've found a serious sink of CPU cycles under truncate-lines, and
> >> installed a fix on the feature branch.  Gerd, if you have time to
> >> eyeball the fix and comment on it, I'd appreciate.  It's commit
> >> 350e97d on the branch.  (I can post a more detailed explanation of
> >> what I did and why, if that would help, because the code and the
> >> functions it calls are somewhat tricky.)
> >
> > I'll look at it and come back.
> 
> modified   src/xdisp.c
> @@ -7153,10 +7153,10 @@ forward_to_next_line_start (struct it *it, bool *skipped_p,
>  	  || ((pos = Fnext_single_property_change (make_fixnum (start),
>  						   Qdisplay, Qnil,
>  						   make_fixnum (limit)),
> -	       NILP (pos))
> +	       (NILP (pos) || XFIXNAT (pos) == limit))
>  	      && next_overlay_change (start) == ZV))
>  	{
> -	  if (!it->bidi_p)
> +	  if (!it->bidi_p || !bidi_it_prev)
>  	    {
>  	      IT_CHARPOS (*it) = limit;
>  	      IT_BYTEPOS (*it) = bytepos;
> 
> I understand the first diff, which makes a lot of sense

Thanks, this was the main part.  From what I see, this code never
really worked correctly, since Emacs 21, because
Fnext_single_property_change can never return nil when called like
that.  IOW, we never took the shortcut there, and probably didn't
notice it because 500-character lines are rare.

> but I'm afraid I don't know enough about bidi to be of any help.

The idea is that since the value of BIDI_IT_PREV is never used by the
caller when ON_NEWLINE_P is zero, we don't need to compute it when
ON_NEWLINE_P is zero, something that would have precluded us from
taking the shortcut.  Not taking the shortcut is very expensive when
we have very long lines, of course.

Btw, one quirk of the code in forward_to_next_line_start (which took
me some time to take in and convince myself it's okay) is that it
returns non-zero when it didn't find any new newlines till ZV.  This
is not very clean, but I guess we don't care in that case, since the
iterator will be moved to ZV, and from there there's not much we need
to do...





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-23 15:29         ` Eli Zaretskii
@ 2022-07-23 15:46           ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-07-23 16:15             ` Eli Zaretskii
  0 siblings, 1 reply; 685+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2022-07-23 15:46 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, gregory

>> AFAIK if the buffer has not been modified (including things like
>> changing `window-start` or `point`), then a redisplay will just not
>> run jit-lock (and hence font-lock) at all, no matter how thorough.
> But the fact is without font-lock the response is faster by a large
> factor.  So something, somewhere, still depends on font-lock.

Yes, that's the part that we need to explore.
Maybe font-lock *is* run somehow?
Or maybe it's just the mere presence of text properties?  (Or overlays?)


        Stefan






^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-23 15:01                         ` Gerd Möllmann
@ 2022-07-23 16:02                           ` Eli Zaretskii
  2022-07-23 17:23                             ` Gerd Möllmann
  0 siblings, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-07-23 16:02 UTC (permalink / raw)
  To: Gerd Möllmann; +Cc: 56682, gregory, monnier, visuweshm

> From: Gerd Möllmann <gerd.moellmann@gmail.com>
> Cc: 56682@debbugs.gnu.org,  Eli Zaretskii <eliz@gnu.org>,
>   gregory@heytings.org,  monnier@iro.umontreal.ca
> Date: Sat, 23 Jul 2022 17:01:02 +0200
> 
> And the new lottery numbers on the feature branch are:
> 
> Font-lock Scroll-bar Composition Output
> ------------------------------------------------------------
> on	  on	     on		 GCs: 14 Elapsed time: 7.276626 seconds
> on	  off	     on		 GCs: 1 Elapsed time: 5.363002 seconds
> on	  off	     off	 GCs: 1 Elapsed time: 3.967520 seconds

Thanks.  How about now, after I installed the last change?





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-23 15:04                   ` Gerd Möllmann
@ 2022-07-23 16:03                     ` Eli Zaretskii
  0 siblings, 0 replies; 685+ messages in thread
From: Eli Zaretskii @ 2022-07-23 16:03 UTC (permalink / raw)
  To: Gerd Möllmann; +Cc: 56682, gregory, monnier

> From: Gerd Möllmann <gerd.moellmann@gmail.com>
> Cc: 56682@debbugs.gnu.org,  gregory@heytings.org,  monnier@iro.umontreal.ca
> Date: Sat, 23 Jul 2022 17:04:39 +0200
> 
> Eli Zaretskii <eliz@gnu.org> writes:
> 
> > Perhaps when
> > long-line optimizations are turned on for a buffer, we shouldn't try
> > to be holier than the Pope, and should use window_end_pos even if not
> > reliable?
> 
> I don't think anyone would complain.

I agree, and so I've now done so on the branch.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-23 15:46           ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2022-07-23 16:15             ` Eli Zaretskii
  2022-07-23 16:19               ` Eli Zaretskii
  2022-07-23 19:05               ` Gregory Heytings
  0 siblings, 2 replies; 685+ messages in thread
From: Eli Zaretskii @ 2022-07-23 16:15 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: 56682, gregory

> From: Stefan Monnier <monnier@iro.umontreal.ca>
> Cc: gregory@heytings.org,  56682@debbugs.gnu.org
> Date: Sat, 23 Jul 2022 11:46:37 -0400
> 
> >> AFAIK if the buffer has not been modified (including things like
> >> changing `window-start` or `point`), then a redisplay will just not
> >> run jit-lock (and hence font-lock) at all, no matter how thorough.
> > But the fact is without font-lock the response is faster by a large
> > factor.  So something, somewhere, still depends on font-lock.
> 
> Yes, that's the part that we need to explore.
> Maybe font-lock *is* run somehow?
> Or maybe it's just the mere presence of text properties?  (Or overlays?)

My bet is indeed on the mere presence of text properties, plus the
fact that we need to merge faces.  But I could well be wrong.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-23 16:15             ` Eli Zaretskii
@ 2022-07-23 16:19               ` Eli Zaretskii
  2022-07-24  5:50                 ` Gerd Möllmann
  2022-07-23 19:05               ` Gregory Heytings
  1 sibling, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-07-23 16:19 UTC (permalink / raw)
  To: monnier; +Cc: 56682, gregory

> Cc: 56682@debbugs.gnu.org, gregory@heytings.org
> Date: Sat, 23 Jul 2022 19:15:26 +0300
> From: Eli Zaretskii <eliz@gnu.org>
> 
> > From: Stefan Monnier <monnier@iro.umontreal.ca>
> > Cc: gregory@heytings.org,  56682@debbugs.gnu.org
> > Date: Sat, 23 Jul 2022 11:46:37 -0400
> > 
> > >> AFAIK if the buffer has not been modified (including things like
> > >> changing `window-start` or `point`), then a redisplay will just not
> > >> run jit-lock (and hence font-lock) at all, no matter how thorough.
> > > But the fact is without font-lock the response is faster by a large
> > > factor.  So something, somewhere, still depends on font-lock.
> > 
> > Yes, that's the part that we need to explore.
> > Maybe font-lock *is* run somehow?
> > Or maybe it's just the mere presence of text properties?  (Or overlays?)
> 
> My bet is indeed on the mere presence of text properties, plus the
> fact that we need to merge faces.  But I could well be wrong.

Btw, I think the best tool for determining this is run-time profiling,
such as with perf on GNU/Linux.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-23 16:02                           ` Eli Zaretskii
@ 2022-07-23 17:23                             ` Gerd Möllmann
  2022-07-23 17:44                               ` Eli Zaretskii
  0 siblings, 1 reply; 685+ messages in thread
From: Gerd Möllmann @ 2022-07-23 17:23 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, gregory, monnier, visuweshm

Eli Zaretskii <eliz@gnu.org> writes:

>> Font-lock Scroll-bar Composition Output
>> ------------------------------------------------------------
>> on	  on	     on		 GCs: 14 Elapsed time: 7.276626 seconds
>> on	  off	     on		 GCs: 1 Elapsed time: 5.363002 seconds
>> on	  off	     off	 GCs: 1 Elapsed time: 3.967520 seconds
>
> Thanks.  How about now, after I installed the last change?

Font-lock Scroll-bar Composition Output
------------------------------------------------------------
on	  on	     on		 GCs: 16 Elapsed time: 5.496764 seconds
on	  off	     on		 GCs: 1 Elapsed time: 5.362916 seconds
on	  off	     off	 GCs: 1 Elapsed time: 3.947306 seconds

That's with
280b8c96cc origin/feature/long-lines-and-font-locking Improve display of columns on mode-lin





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-23 17:23                             ` Gerd Möllmann
@ 2022-07-23 17:44                               ` Eli Zaretskii
  2022-07-23 17:49                                 ` Eli Zaretskii
  0 siblings, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-07-23 17:44 UTC (permalink / raw)
  To: Gerd Möllmann; +Cc: 56682, gregory, monnier, visuweshm

> From: Gerd Möllmann <gerd.moellmann@gmail.com>
> Cc: 56682@debbugs.gnu.org,  gregory@heytings.org,  monnier@iro.umontreal.ca,
>   visuweshm@gmail.com
> Date: Sat, 23 Jul 2022 19:23:40 +0200
> 
> Eli Zaretskii <eliz@gnu.org> writes:
> 
> >> Font-lock Scroll-bar Composition Output
> >> ------------------------------------------------------------
> >> on	  on	     on		 GCs: 14 Elapsed time: 7.276626 seconds
> >> on	  off	     on		 GCs: 1 Elapsed time: 5.363002 seconds
> >> on	  off	     off	 GCs: 1 Elapsed time: 3.967520 seconds
> >
> > Thanks.  How about now, after I installed the last change?
> 
> Font-lock Scroll-bar Composition Output
> ------------------------------------------------------------
> on	  on	     on		 GCs: 16 Elapsed time: 5.496764 seconds
> on	  off	     on		 GCs: 1 Elapsed time: 5.362916 seconds
> on	  off	     off	 GCs: 1 Elapsed time: 3.947306 seconds
> 
> That's with
> 280b8c96cc origin/feature/long-lines-and-font-locking Improve display of columns on mode-lin

Thanks.  So the scroll-bar effect is largely gone, and font-lock is
now just 25% slower than no-font-lock.  Which I think is reasonable,
given that there's a face change every 10 to 20 characters?





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-23 17:44                               ` Eli Zaretskii
@ 2022-07-23 17:49                                 ` Eli Zaretskii
  2022-07-23 17:59                                   ` Eli Zaretskii
  0 siblings, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-07-23 17:49 UTC (permalink / raw)
  To: gerd.moellmann; +Cc: 56682, gregory, monnier, visuweshm

> Cc: 56682@debbugs.gnu.org, gregory@heytings.org, monnier@iro.umontreal.ca,
>  visuweshm@gmail.com
> Date: Sat, 23 Jul 2022 20:44:43 +0300
> From: Eli Zaretskii <eliz@gnu.org>
> 
> > Font-lock Scroll-bar Composition Output
> > ------------------------------------------------------------
> > on	  on	     on		 GCs: 16 Elapsed time: 5.496764 seconds
> > on	  off	     on		 GCs: 1 Elapsed time: 5.362916 seconds
> > on	  off	     off	 GCs: 1 Elapsed time: 3.947306 seconds
> > 
> > That's with
> > 280b8c96cc origin/feature/long-lines-and-font-locking Improve display of columns on mode-lin
> 
> Thanks.  So the scroll-bar effect is largely gone, and font-lock is
> now just 25% slower than no-font-lock.  Which I think is reasonable,
> given that there's a face change every 10 to 20 characters?

Oops, I was confused: font-lock OFF is not in the table, so with it
we're still 4 to 5 times slower than without it.  It's
auto-composition mode that costs us 25% slowdown.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-23 17:49                                 ` Eli Zaretskii
@ 2022-07-23 17:59                                   ` Eli Zaretskii
  2022-07-24  6:16                                     ` Gerd Möllmann
  0 siblings, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-07-23 17:59 UTC (permalink / raw)
  To: gerd.moellmann, 56682; +Cc: gregory, monnier, visuweshm

> Cc: 56682@debbugs.gnu.org, gregory@heytings.org, monnier@iro.umontreal.ca,
>  visuweshm@gmail.com
> Date: Sat, 23 Jul 2022 20:49:39 +0300
> From: Eli Zaretskii <eliz@gnu.org>
> 
> > > Font-lock Scroll-bar Composition Output
> > > ------------------------------------------------------------
> > > on	  on	     on		 GCs: 16 Elapsed time: 5.496764 seconds
> > > on	  off	     on		 GCs: 1 Elapsed time: 5.362916 seconds
> > > on	  off	     off	 GCs: 1 Elapsed time: 3.947306 seconds
> > > 
> > > That's with
> > > 280b8c96cc origin/feature/long-lines-and-font-locking Improve display of columns on mode-lin
> > 
> > Thanks.  So the scroll-bar effect is largely gone, and font-lock is
> > now just 25% slower than no-font-lock.  Which I think is reasonable,
> > given that there's a face change every 10 to 20 characters?
> 
> Oops, I was confused: font-lock OFF is not in the table, so with it
> we're still 4 to 5 times slower than without it.  It's
> auto-composition mode that costs us 25% slowdown.

Which seems to be similar to slowdown due to font-lock in other cases?
For example, scrolling with the same benchmark through xdisp.c takes
190 sec for the first time and 40 for the second time (when everything
is already fontified); whereas without font-lock it takes 20.  So it
sounds like font-lock generally slows down redisplay by such small
factors?





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-23 16:15             ` Eli Zaretskii
  2022-07-23 16:19               ` Eli Zaretskii
@ 2022-07-23 19:05               ` Gregory Heytings
  2022-07-23 19:12                 ` Eli Zaretskii
  1 sibling, 1 reply; 685+ messages in thread
From: Gregory Heytings @ 2022-07-23 19:05 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, monnier


>
> My bet is indeed on the mere presence of text properties, plus the fact 
> that we need to merge faces.
>

That's precisely what I've been investigating during the last day.  I 
probably need two or three more days to reach a conclusion, so please tell 
me if you're doing that in parallel.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-23 19:05               ` Gregory Heytings
@ 2022-07-23 19:12                 ` Eli Zaretskii
  2022-07-23 19:21                   ` Gregory Heytings
  0 siblings, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-07-23 19:12 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, monnier

> Date: Sat, 23 Jul 2022 19:05:54 +0000
> From: Gregory Heytings <gregory@heytings.org>
> cc: Stefan Monnier <monnier@iro.umontreal.ca>, bug-gnu-emacs@gnu.org
> 
> > My bet is indeed on the mere presence of text properties, plus the fact 
> > that we need to merge faces.
> 
> That's precisely what I've been investigating during the last day.  I 
> probably need two or three more days to reach a conclusion, so please tell 
> me if you're doing that in parallel.

I'm not.  I did the measurements, and so did Gerd, but I'm not looking
into the font-lock influence any deeper than that.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-23 19:12                 ` Eli Zaretskii
@ 2022-07-23 19:21                   ` Gregory Heytings
  0 siblings, 0 replies; 685+ messages in thread
From: Gregory Heytings @ 2022-07-23 19:21 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, monnier

[-- Attachment #1: Type: text/plain, Size: 418 bytes --]


>> That's precisely what I've been investigating during the last day.  I 
>> probably need two or three more days to reach a conclusion, so please 
>> tell me if you're doing that in parallel.
>
> I'm not.  I did the measurements, and so did Gerd, but I'm not looking 
> into the font-lock influence any deeper than that.
>

Okay, thanks; I can continue without fearing that I might be wasting my 
time 😉

^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-23 16:19               ` Eli Zaretskii
@ 2022-07-24  5:50                 ` Gerd Möllmann
  2022-07-24 14:35                   ` Dmitry Gutov
  0 siblings, 1 reply; 685+ messages in thread
From: Gerd Möllmann @ 2022-07-24  5:50 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, gregory, monnier

Eli Zaretskii <eliz@gnu.org> writes:

>> My bet is indeed on the mere presence of text properties, plus the
>> fact that we need to merge faces.  But I could well be wrong.

Can't say something about face merging, but "frequent" changes of faces
certainly have an effect on iterator performance.  It stops, looks up
properties again to determine the next stop pos, does what has to be
done for current properties...

> Btw, I think the best tool for determining this is run-time profiling,
> such as with perf on GNU/Linux.

Yes, I don't think there is something comparable on macOS.  Or I simply
can't find it.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-23 17:59                                   ` Eli Zaretskii
@ 2022-07-24  6:16                                     ` Gerd Möllmann
  2022-07-24  6:52                                       ` Eli Zaretskii
  2022-07-24 14:34                                       ` bug#56682: Interval tree balance (was: Fix the long lines font locking related slowdowns) Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  0 siblings, 2 replies; 685+ messages in thread
From: Gerd Möllmann @ 2022-07-24  6:16 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, gregory, monnier, visuweshm

Eli Zaretskii <eliz@gnu.org> writes:

> Which seems to be similar to slowdown due to font-lock in other cases?
> For example, scrolling with the same benchmark through xdisp.c takes
> 190 sec for the first time and 40 for the second time (when everything
> is already fontified); whereas without font-lock it takes 20.  So it
> sounds like font-lock generally slows down redisplay by such small
> factors?

Alas, I don't remember much about the exact figures I got when I
profiled this pre-21.  But a doubling of run time--after font-lock has
finished--doesn't appear to me to be entirely unplausible.

BTW, a memory that re-emerged right now: Interestingly, the number of
different text properties that the iterator checks, i.e. the number of
text property names like face, fontified, display, invisible, etc. that
the iterator checks, played on astonishing role back then.  And the
relation to performance wasn't linear either.  Which is why there's one
display property now, subsuming different subtypes.  Originally, the
subtypes were distinct properties, and display didn't exist.  Way before
Emacs 21.

Don't know if this is relevant for anything in this case.  I thought I
just mention that the interval tree might also have a potential for
improvement, if you will.  Amd another BTW: I was never 100% certain if
the interval tree is really always balanced because it didn't use an
algorithm that I knew and could recognize.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-24  6:16                                     ` Gerd Möllmann
@ 2022-07-24  6:52                                       ` Eli Zaretskii
  2022-07-24 14:36                                         ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-07-24 14:34                                       ` bug#56682: Interval tree balance (was: Fix the long lines font locking related slowdowns) Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  1 sibling, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-07-24  6:52 UTC (permalink / raw)
  To: Gerd Möllmann; +Cc: 56682, gregory, monnier, visuweshm

> From: Gerd Möllmann <gerd.moellmann@gmail.com>
> Cc: 56682@debbugs.gnu.org,  gregory@heytings.org,  monnier@iro.umontreal.ca,
>   visuweshm@gmail.com
> Date: Sun, 24 Jul 2022 08:16:33 +0200
> 
> And another BTW: I was never 100% certain if the interval tree is
> really always balanced because it didn't use an algorithm that I
> knew and could recognize.

AFAIU, we balance on-the-fly (see find_interval, which calls
balance_possible_root_interval).

> "frequent" changes of faces certainly have an effect on iterator
> performance.  It stops, looks up properties again to determine the
> next stop pos, does what has to be done for current properties...

To be more accurate: changes in text properties that are not relevant
to display basically affect the iterator performance in only one way:
they make the search for the next change in _relevant_ properties more
expensive.  See the last part of compute_stop_pos for the gory
details.  In a nutshell, we check one by one the intervals following
the interval of the current iterator position, until we find an
interval whose values for one or more of the properties of interest to
redisplay are different.  When we find one such interval, it is
guaranteed to have changes only in the text properties that are of
interest to redisplay, but the search could take more time if there
are many text properties that are not interesting, because there are
more intervals to check.

Btw, it might be interesting to measure the effect of enlarging
TEXT_PROP_DISTANCE_LIMIT, currently 100 character positions, on the
performance.  Looking at the code, it is not clear to me whether it
could affect the performance in any significant ways, but maybe I'm
wrong.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Interval tree balance (was: Fix the long lines font locking related slowdowns)
  2022-07-24  6:16                                     ` Gerd Möllmann
  2022-07-24  6:52                                       ` Eli Zaretskii
@ 2022-07-24 14:34                                       ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-07-24 15:47                                         ` bug#56682: Interval tree balance Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-07-25  6:23                                         ` bug#56682: Fix the long lines font locking related slowdowns Gerd Möllmann
  1 sibling, 2 replies; 685+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2022-07-24 14:34 UTC (permalink / raw)
  To: Gerd Möllmann; +Cc: 56682, Eli Zaretskii, gregory, visuweshm

> Don't know if this is relevant for anything in this case.  I thought I
> just mention that the interval tree might also have a potential for
> improvement, if you will.  And another BTW: I was never 100% certain if
> the interval tree is really always balanced because it didn't use an
> algorithm that I knew and could recognize.

I can answer this one: no it's not always balanced (tho in practice
it is most of the time).  We could make it use a more standard
algorithm, but I have not been able to measure any impact on performance
(I also played with a splay-tree alternative, under the assumption that
we mostly consult the tree "locally" (within the visible part of the
buffer, basically), so a splay-tree could turn the O(log N) into an O(n)
where `N` is the buffer-size and `n` is the distance between
window-start and window-end).


        Stefan






^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-24  5:50                 ` Gerd Möllmann
@ 2022-07-24 14:35                   ` Dmitry Gutov
  2022-07-24 15:05                     ` Eli Zaretskii
  0 siblings, 1 reply; 685+ messages in thread
From: Dmitry Gutov @ 2022-07-24 14:35 UTC (permalink / raw)
  To: Gerd Möllmann, Eli Zaretskii; +Cc: 56682, gregory, monnier

On 24.07.2022 08:50, Gerd Möllmann wrote:
> Eli Zaretskii<eliz@gnu.org>  writes:
> 
>>> My bet is indeed on the mere presence of text properties, plus the
>>> fact that we need to merge faces.  But I could well be wrong.
> Can't say something about face merging, but "frequent" changes of faces
> certainly have an effect on iterator performance.  It stops, looks up
> properties again to determine the next stop pos, does what has to be
> done for current properties...

But the problem is contingent on having long lines, isn't it?

There must be some interplay between those circumstances. Not just 
having to look up faces (relatively) a lot.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-24  6:52                                       ` Eli Zaretskii
@ 2022-07-24 14:36                                         ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-07-24 15:07                                           ` Eli Zaretskii
  0 siblings, 1 reply; 685+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2022-07-24 14:36 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: Gerd Möllmann, 56682, gregory, visuweshm

> redisplay are different.  When we find one such interval, it is
> guaranteed to have changes only in the text properties that are of
> interest to redisplay, but the search could take more time if there
> are many text properties that are not interesting, because there are
> more intervals to check.

Not only more intervals, but also more elements in the `plist`s of
each interval.


        Stefan






^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-24 14:35                   ` Dmitry Gutov
@ 2022-07-24 15:05                     ` Eli Zaretskii
  2022-07-25 23:23                       ` Dmitry Gutov
  0 siblings, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-07-24 15:05 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: gerd.moellmann, 56682, gregory, monnier

> Date: Sun, 24 Jul 2022 17:35:19 +0300
> Cc: 56682@debbugs.gnu.org, gregory@heytings.org, monnier@iro.umontreal.ca
> From: Dmitry Gutov <dgutov@yandex.ru>
> 
> On 24.07.2022 08:50, Gerd Möllmann wrote:
> > Eli Zaretskii<eliz@gnu.org>  writes:
> > 
> >>> My bet is indeed on the mere presence of text properties, plus the
> >>> fact that we need to merge faces.  But I could well be wrong.
> > Can't say something about face merging, but "frequent" changes of faces
> > certainly have an effect on iterator performance.  It stops, looks up
> > properties again to determine the next stop pos, does what has to be
> > done for current properties...
> 
> But the problem is contingent on having long lines, isn't it?

Not necessarily, see the times I measured scrolling through xdisp.c,
which I posted earlier.  It could be that with long lines font-lock
just makes it slower still, to the point where it becomes unbearable.

> There must be some interplay between those circumstances. Not just 
> having to look up faces (relatively) a lot.

What else did you have in mind?





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-24 14:36                                         ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2022-07-24 15:07                                           ` Eli Zaretskii
  2022-07-24 15:48                                             ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  0 siblings, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-07-24 15:07 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: gerd.moellmann, 56682, gregory, visuweshm

> From: Stefan Monnier <monnier@iro.umontreal.ca>
> Cc: Gerd Möllmann <gerd.moellmann@gmail.com>,
>   56682@debbugs.gnu.org,
>   gregory@heytings.org,  visuweshm@gmail.com
> Date: Sun, 24 Jul 2022 10:36:41 -0400
> 
> > redisplay are different.  When we find one such interval, it is
> > guaranteed to have changes only in the text properties that are of
> > interest to redisplay, but the search could take more time if there
> > are many text properties that are not interesting, because there are
> > more intervals to check.
> 
> Not only more intervals, but also more elements in the `plist`s of
> each interval.

Could be, if there are many different properties.  But since we are
talking about font-lock, there's only one we are talking about:
'face'.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Interval tree balance
  2022-07-24 14:34                                       ` bug#56682: Interval tree balance (was: Fix the long lines font locking related slowdowns) Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2022-07-24 15:47                                         ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-07-25  6:23                                         ` bug#56682: Fix the long lines font locking related slowdowns Gerd Möllmann
  1 sibling, 0 replies; 685+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2022-07-24 15:47 UTC (permalink / raw)
  To: Gerd Möllmann; +Cc: 56682, Eli Zaretskii, gregory, visuweshm

> buffer, basically), so a splay-tree could turn the O(log N) into an O(n)
                                                                        ^
                                                                      log n

> where `N` is the buffer-size and `n` is the distance between
> window-start and window-end).


        Stefan






^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-24 15:07                                           ` Eli Zaretskii
@ 2022-07-24 15:48                                             ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-07-24 16:18                                               ` Eli Zaretskii
  2022-07-24 16:26                                               ` Lars Ingebrigtsen
  0 siblings, 2 replies; 685+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2022-07-24 15:48 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: gerd.moellmann, 56682, gregory, visuweshm

>> Not only more intervals, but also more elements in the `plist`s of
>> each interval.
> Could be, if there are many different properties.  But since we are
> talking about font-lock, there's only one we are talking about: 'face'.

`face` may be the one we care about, but there will be others
(especially in the case you were talking about, i.e. the impact of
non-display-related faces)


        Stefan






^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-24 15:48                                             ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2022-07-24 16:18                                               ` Eli Zaretskii
  2022-07-24 16:26                                               ` Lars Ingebrigtsen
  1 sibling, 0 replies; 685+ messages in thread
From: Eli Zaretskii @ 2022-07-24 16:18 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: gerd.moellmann, 56682, gregory, visuweshm

> From: Stefan Monnier <monnier@iro.umontreal.ca>
> Cc: gerd.moellmann@gmail.com,  56682@debbugs.gnu.org,  gregory@heytings.org,
>   visuweshm@gmail.com
> Date: Sun, 24 Jul 2022 11:48:35 -0400
> 
> >> Not only more intervals, but also more elements in the `plist`s of
> >> each interval.
> > Could be, if there are many different properties.  But since we are
> > talking about font-lock, there's only one we are talking about: 'face'.
> 
> `face` may be the one we care about, but there will be others
> (especially in the case you were talking about, i.e. the impact of
> non-display-related faces)

In general, sure.  But this particular discussion is about the
difference in performance between font-lock being on and off, and in
that case the only property that counts is 'face'.

If you are thinking about non-display-related properties, you are in
the wrong thread ;-)  That one was raised by João in another
discussion.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-24 15:48                                             ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-07-24 16:18                                               ` Eli Zaretskii
@ 2022-07-24 16:26                                               ` Lars Ingebrigtsen
  2022-07-24 16:33                                                 ` Eli Zaretskii
  1 sibling, 1 reply; 685+ messages in thread
From: Lars Ingebrigtsen @ 2022-07-24 16:26 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: gerd.moellmann, 56682, gregory, Stefan Monnier, visuweshm

Stefan Monnier via "Bug reports for GNU Emacs, the Swiss army knife of
text editors" <bug-gnu-emacs@gnu.org> writes:

> `face` may be the one we care about, but there will be others
> (especially in the case you were talking about, i.e. the impact of
> non-display-related faces)

Random thought: Would it make sense to make `put-text-property' (and
friends) try to ensure that `face' (and `font-lock-face'?) are towards
the start of the plists?

That wouldn't help with intervals that don't have a `face' at all, but
should speed up the ones that have, and would be relatively low impact.

I don't think we guarantee anything about the order, so it might not
break anything.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-24 16:26                                               ` Lars Ingebrigtsen
@ 2022-07-24 16:33                                                 ` Eli Zaretskii
  0 siblings, 0 replies; 685+ messages in thread
From: Eli Zaretskii @ 2022-07-24 16:33 UTC (permalink / raw)
  To: Lars Ingebrigtsen; +Cc: gerd.moellmann, 56682, gregory, monnier, visuweshm

> From: Lars Ingebrigtsen <larsi@gnus.org>
> Cc: Stefan Monnier <monnier@iro.umontreal.ca>,  gerd.moellmann@gmail.com,
>   56682@debbugs.gnu.org,  gregory@heytings.org,  visuweshm@gmail.com
> Date: Sun, 24 Jul 2022 18:26:38 +0200
> 
> Random thought: Would it make sense to make `put-text-property' (and
> friends) try to ensure that `face' (and `font-lock-face'?) are towards
> the start of the plists?

The display code doesn't care only about 'face', it also cares for
'invisible' and 'display' properties.  And only one of them can be
"the first" ;-)





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-24 14:34                                       ` bug#56682: Interval tree balance (was: Fix the long lines font locking related slowdowns) Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-07-24 15:47                                         ` bug#56682: Interval tree balance Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2022-07-25  6:23                                         ` Gerd Möllmann
  2022-07-25 20:49                                           ` Gregory Heytings
  1 sibling, 1 reply; 685+ messages in thread
From: Gerd Möllmann @ 2022-07-25  6:23 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: 56682, Eli Zaretskii, gregory, visuweshm

Stefan Monnier <monnier@iro.umontreal.ca> writes:

>> Don't know if this is relevant for anything in this case.  I thought I
>> just mention that the interval tree might also have a potential for
>> improvement, if you will.  And another BTW: I was never 100% certain if
>> the interval tree is really always balanced because it didn't use an
>> algorithm that I knew and could recognize.
>
> I can answer this one: no it's not always balanced (tho in practice
> it is most of the time).  We could make it use a more standard
> algorithm, but I have not been able to measure any impact on performance
> (I also played with a splay-tree alternative, under the assumption that
> we mostly consult the tree "locally" (within the visible part of the
> buffer, basically), so a splay-tree could turn the O(log N) into an O(n)
> where `N` is the buffer-size and `n` is the distance between
> window-start and window-end).

Thanks.  And too bad.

But I'd really prefer a standard algorithm with formally proven
properties anyway.  Call me German.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-25  6:23                                         ` bug#56682: Fix the long lines font locking related slowdowns Gerd Möllmann
@ 2022-07-25 20:49                                           ` Gregory Heytings
  2022-07-26  6:32                                             ` Gerd Möllmann
  0 siblings, 1 reply; 685+ messages in thread
From: Gregory Heytings @ 2022-07-25 20:49 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: Gerd Möllmann, 56682, Stefan Monnier, visuweshm


I pushed another improvement to the branch.  Now motion in a font-locked 
buffer is almost as fast as in a non font-locked one; I don't think it's 
possible to make further significant improvements.

It turns out that the motion slowdowns in font locked-buffers were caused 
only indirectly by font locking.  What happens is that in a font-locked 
buffer, get_next_display_element calls next_element_from_buffer which uses 
handle_stop (and therefore compute_stop_pos) to position the iterator on 
the next element.  In a file such as long-line.xml, there are many more 
stop positions when the buffer is font locked, roughly 100 times more. 
The solution is to make back_to_previous_visible_line_start do something 
closer to what it promises, namely "Set IT's current position to the 
previous visible line start."  Previously it moved IT to the beginning of 
the (temporarily narrowed) buffer, which was already much better than 
moving it to the beginning of the line, but not enough to make motion 
commands fast.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-22 14:44       ` Lars Ingebrigtsen
@ 2022-07-25 20:59         ` Gregory Heytings
  0 siblings, 0 replies; 685+ messages in thread
From: Gregory Heytings @ 2022-07-25 20:59 UTC (permalink / raw)
  To: Lars Ingebrigtsen; +Cc: 56682, Eli Zaretskii, Stefan Monnier


>
> This reminds me of something I meant to mention -- Stefan M. once 
> proposed that there should be two kinds of narrowing (I think?).  The 
> first is the one that the user sets with `C-x n n', which says "the user 
> is only interested in this bit of the buffer", but programs are 
> "allowed" to remove that restriction when doing stuff (like font 
> locking).  The second type should be a strict one, where modes are not 
> allowed to widen the region.
>
> Looking briefly at Gregory's new branch, it seems like that (sort of) 
> introduces this idea, but in a non-explicit way (i.e., by having an 
> inhibit-widen variable).
>

Thanks for the idea!  I think this could be useful in other contexts, so 
I'll try to implement that.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-22 23:25   ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-07-23  6:41     ` Eli Zaretskii
@ 2022-07-25 21:23     ` Gregory Heytings
  2022-07-26 21:17       ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  1 sibling, 1 reply; 685+ messages in thread
From: Gregory Heytings @ 2022-07-25 21:23 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: 56682, Eli Zaretskii


>
> Before using a blunt tool like the forced-narrowing now in 
> `feature/long-lines-and-font-locking`, I think we should try and figure 
> out *why* the recipe below is so slow.
>

It's not a blunt tool, it's an appropriate tool to help making sure that 
Emacs remains responsive when large files are visited.  Think of it as 
POSIX's ulimits.  Allowing fontification-functions to search for 
arbitrarily complex regexpes in an arbitrarily large buffer, each and 
every time they are asked to to highlight a small chunk of the said 
buffer, is a recipe for disaster.  If for some reason modes really need to 
go through to the whole buffer to decide which highlighting to use, they 
should to do so outside of fontification-functions, and ideally once, for 
example, when the file is loaded.

(Note that at the moment that tool is enabled only when files with long 
lines are visited.)





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-23 13:42                 ` Eli Zaretskii
                                     ` (2 preceding siblings ...)
  2022-07-23 15:04                   ` Gerd Möllmann
@ 2022-07-25 21:47                   ` Gregory Heytings
  2022-07-26  6:51                     ` Gerd Möllmann
  2022-07-26 11:37                     ` Eli Zaretskii
  3 siblings, 2 replies; 685+ messages in thread
From: Gregory Heytings @ 2022-07-25 21:47 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: Gerd Möllmann, 56682, monnier


>
> And I've found a serious sink of CPU cycles under truncate-lines, and 
> installed a fix on the feature branch.  Gerd, if you have time to 
> eyeball the fix and comment on it, I'd appreciate.  It's commit 350e97d 
> on the branch.  (I can post a more detailed explanation of what I did 
> and why, if that would help, because the code and the functions it calls 
> are somewhat tricky.)
>

Hmmm...  After 350e97d78e, Isearch locks Emacs with toggle-truncate-lines. 
Recipe:

C-x C-f long-line.xml
C-x x t
C-s </

You have to kill Emacs, C-g does not work.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-24 15:05                     ` Eli Zaretskii
@ 2022-07-25 23:23                       ` Dmitry Gutov
  2022-07-26  6:52                         ` Gregory Heytings
  2022-07-26 11:45                         ` Eli Zaretskii
  0 siblings, 2 replies; 685+ messages in thread
From: Dmitry Gutov @ 2022-07-25 23:23 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: gerd.moellmann, 56682, gregory, monnier

On 24.07.2022 18:05, Eli Zaretskii wrote:
>> Date: Sun, 24 Jul 2022 17:35:19 +0300
>> Cc: 56682@debbugs.gnu.org, gregory@heytings.org, monnier@iro.umontreal.ca
>> From: Dmitry Gutov <dgutov@yandex.ru>
>>
>> On 24.07.2022 08:50, Gerd Möllmann wrote:
>>> Eli Zaretskii<eliz@gnu.org>  writes:
>>>
>>>>> My bet is indeed on the mere presence of text properties, plus the
>>>>> fact that we need to merge faces.  But I could well be wrong.
>>> Can't say something about face merging, but "frequent" changes of faces
>>> certainly have an effect on iterator performance.  It stops, looks up
>>> properties again to determine the next stop pos, does what has to be
>>> done for current properties...
>>
>> But the problem is contingent on having long lines, isn't it?
> 
> Not necessarily, see the times I measured scrolling through xdisp.c,
> which I posted earlier.  It could be that with long lines font-lock
> just makes it slower still, to the point where it becomes unbearable.

Why with long lines, though?

>> There must be some interplay between those circumstances. Not just
>> having to look up faces (relatively) a lot.
> 
> What else did you have in mind?

Some operation dependent on the length of the current line?

With font-lock, it seems to get progressively slower the farther you get 
along the current (long line).

E.g. you can have a long line spanning several screenfuls without line 
breaks. When the window is scrolled to the beginning, redisplay is 
relatively fast (I can press up/down arrows, and they seem responsive).

But if I scroll the window to the end of said long line, up/down 
commands become much less responsive.

Tested that with today's master and js-mode visiting a minified JS file.

Perhaps it's due to font-lock logic in that it has to match from the 
beginning of a line (not sure we'd want to abandon that promise, 
though). Or maybe something else.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-25 20:49                                           ` Gregory Heytings
@ 2022-07-26  6:32                                             ` Gerd Möllmann
  2022-07-26  6:53                                               ` Gregory Heytings
  0 siblings, 1 reply; 685+ messages in thread
From: Gerd Möllmann @ 2022-07-26  6:32 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, Eli Zaretskii, Stefan Monnier, visuweshm

Gregory Heytings <gregory@heytings.org> writes:

> I pushed another improvement to the branch.  Now motion in a
> font-locked buffer is almost as fast as in a non font-locked one; I
> don't think it's possible to make further significant improvements.

Font-lock Scroll-bar Composition Output
------------------------------------------------------------
on	  on	     on		 GCs: 13 Elapsed time: 1.632215 seconds
on	  off	     on		 GCs: 1 Elapsed time: 1.433515 seconds
on	  off	     off	 GCs: 2 Elapsed time: 1.209662 seconds
off	  off	     off	 GCs: 2 Elapsed time: 0.524913 seconds





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-25 21:47                   ` Gregory Heytings
@ 2022-07-26  6:51                     ` Gerd Möllmann
  2022-07-26  7:08                       ` Gerd Möllmann
  2022-07-26 12:12                       ` Eli Zaretskii
  2022-07-26 11:37                     ` Eli Zaretskii
  1 sibling, 2 replies; 685+ messages in thread
From: Gerd Möllmann @ 2022-07-26  6:51 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, Eli Zaretskii, monnier

Gregory Heytings <gregory@heytings.org> writes:

> Hmmm...  After 350e97d78e, Isearch locks Emacs with
> toggle-truncate-lines. Recipe:
>
> C-x C-f long-line.xml
> C-x x t
> C-s </
>
> You have to kill Emacs, C-g does not work.

That's kind of funny :-):

(setq isearch-lazy-highlight nil)





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-25 23:23                       ` Dmitry Gutov
@ 2022-07-26  6:52                         ` Gregory Heytings
       [not found]                           ` <addcac7f-cb95-c433-58e5-e2d525582613@yandex.ru>
  2022-07-26 11:45                         ` Eli Zaretskii
  1 sibling, 1 reply; 685+ messages in thread
From: Gregory Heytings @ 2022-07-26  6:52 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: gerd.moellmann, 56682, Eli Zaretskii, monnier


>
> With font-lock, it seems to get progressively slower the farther you get 
> along the current (long line).
>
> E.g. you can have a long line spanning several screenfuls without line 
> breaks. When the window is scrolled to the beginning, redisplay is 
> relatively fast (I can press up/down arrows, and they seem responsive).
>
> But if I scroll the window to the end of said long line, up/down 
> commands become much less responsive.
>
> Tested that with today's master and js-mode visiting a minified JS file.
>

You should have tried the feature/long-lines-and-font-locking branch 
instead, where that problem has been fixed a few hours ago.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-26  6:32                                             ` Gerd Möllmann
@ 2022-07-26  6:53                                               ` Gregory Heytings
  0 siblings, 0 replies; 685+ messages in thread
From: Gregory Heytings @ 2022-07-26  6:53 UTC (permalink / raw)
  To: Gerd Möllmann; +Cc: 56682, Eli Zaretskii, Stefan Monnier, visuweshm


>> I pushed another improvement to the branch.  Now motion in a 
>> font-locked buffer is almost as fast as in a non font-locked one; I 
>> don't think it's possible to make further significant improvements.
>
> Font-lock Scroll-bar Composition Output
> ------------------------------------------------------------
> on	  on	     on		 GCs: 13 Elapsed time: 1.632215 seconds
> on	  off	     on		 GCs: 1 Elapsed time: 1.433515 seconds
> on	  off	     off	 GCs: 2 Elapsed time: 1.209662 seconds
> off	  off	     off	 GCs: 2 Elapsed time: 0.524913 seconds
>

Thanks, this confirms my "almost as fast" feeling and measurements.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-26  6:51                     ` Gerd Möllmann
@ 2022-07-26  7:08                       ` Gerd Möllmann
  2022-07-26 12:12                       ` Eli Zaretskii
  1 sibling, 0 replies; 685+ messages in thread
From: Gerd Möllmann @ 2022-07-26  7:08 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, Eli Zaretskii, monnier

Gerd Möllmann <gerd.moellmann@gmail.com> writes:

> Gregory Heytings <gregory@heytings.org> writes:
>
>> Hmmm...  After 350e97d78e, Isearch locks Emacs with
>> toggle-truncate-lines. Recipe:
>>
>> C-x C-f long-line.xml
>> C-x x t
>> C-s </
>>
>> You have to kill Emacs, C-g does not work.
>
> That's kind of funny :-):
>
> (setq isearch-lazy-highlight nil)

I eventually finishes, sort of.  The many '<' in the XML lead to a stop
every few characters for drawing highlights.  Like a train that stops at
every trash can along the tracks.  That's more stops than with
font-lock.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-25 21:47                   ` Gregory Heytings
  2022-07-26  6:51                     ` Gerd Möllmann
@ 2022-07-26 11:37                     ` Eli Zaretskii
  2022-07-26 11:53                       ` Gregory Heytings
  1 sibling, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-07-26 11:37 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: gerd.moellmann, 56682, monnier

> Date: Mon, 25 Jul 2022 21:47:55 +0000
> From: Gregory Heytings <gregory@heytings.org>
> cc: Gerd Möllmann <gerd.moellmann@gmail.com>, 
>     56682@debbugs.gnu.org, monnier@iro.umontreal.ca
> 
> > And I've found a serious sink of CPU cycles under truncate-lines, and 
> > installed a fix on the feature branch.  Gerd, if you have time to 
> > eyeball the fix and comment on it, I'd appreciate.  It's commit 350e97d 
> > on the branch.  (I can post a more detailed explanation of what I did 
> > and why, if that would help, because the code and the functions it calls 
> > are somewhat tricky.)
> 
> Hmmm...  After 350e97d78e, Isearch locks Emacs with toggle-truncate-lines. 
> Recipe:
> 
> C-x C-f long-line.xml
> C-x x t
> C-s </
> 
> You have to kill Emacs, C-g does not work.

I see the same on master, where that change is not yet installed.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-25 23:23                       ` Dmitry Gutov
  2022-07-26  6:52                         ` Gregory Heytings
@ 2022-07-26 11:45                         ` Eli Zaretskii
  2022-07-26 20:52                           ` Dmitry Gutov
  1 sibling, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-07-26 11:45 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: gerd.moellmann, 56682, gregory, monnier

> Date: Tue, 26 Jul 2022 02:23:42 +0300
> Cc: gerd.moellmann@gmail.com, 56682@debbugs.gnu.org, gregory@heytings.org,
>  monnier@iro.umontreal.ca
> From: Dmitry Gutov <dgutov@yandex.ru>
> 
> >> But the problem is contingent on having long lines, isn't it?
> > 
> > Not necessarily, see the times I measured scrolling through xdisp.c,
> > which I posted earlier.  It could be that with long lines font-lock
> > just makes it slower still, to the point where it becomes unbearable.
> 
> Why with long lines, though?

Because they are long.  So there's more faces to encounter when going
from one line to another.

> >> There must be some interplay between those circumstances. Not just
> >> having to look up faces (relatively) a lot.
> > 
> > What else did you have in mind?
> 
> Some operation dependent on the length of the current line?
> 
> With font-lock, it seems to get progressively slower the farther you get 
> along the current (long line).
> 
> E.g. you can have a long line spanning several screenfuls without line 
> breaks. When the window is scrolled to the beginning, redisplay is 
> relatively fast (I can press up/down arrows, and they seem responsive).
> 
> But if I scroll the window to the end of said long line, up/down 
> commands become much less responsive.
> 
> Tested that with today's master and js-mode visiting a minified JS file.
> 
> Perhaps it's due to font-lock logic in that it has to match from the 
> beginning of a line (not sure we'd want to abandon that promise, 
> though). Or maybe something else.

It isn't font-lock, at least not in all major modes.  It's the display
engine itself that sometimes needs to go to the beginning of the line.
When it does, going back gets slower with font-lock than without.
This is why you see slower redisplay when you go deeper into a long
line.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-26 11:37                     ` Eli Zaretskii
@ 2022-07-26 11:53                       ` Gregory Heytings
  2022-07-26 12:09                         ` Eli Zaretskii
  0 siblings, 1 reply; 685+ messages in thread
From: Gregory Heytings @ 2022-07-26 11:53 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: gerd.moellmann, 56682, monnier


>> Hmmm...  After 350e97d78e, Isearch locks Emacs with 
>> toggle-truncate-lines. Recipe:
>>
>> C-x C-f long-line.xml
>> C-x x t
>> C-s </
>>
>> You have to kill Emacs, C-g does not work.
>
> I see the same on master, where that change is not yet installed.
>

Are you sure?  I don't see the same at 304e2a3a05.  C-s is slow, but it 
does not hang Emacs, and the effect of C-s </ is visible within a couple 
of seconds.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-26 11:53                       ` Gregory Heytings
@ 2022-07-26 12:09                         ` Eli Zaretskii
  2022-07-26 12:34                           ` Gregory Heytings
  0 siblings, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-07-26 12:09 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: gerd.moellmann, 56682, monnier

> Date: Tue, 26 Jul 2022 11:53:28 +0000
> From: Gregory Heytings <gregory@heytings.org>
> cc: gerd.moellmann@gmail.com, 56682@debbugs.gnu.org, monnier@iro.umontreal.ca
> 
> 
> >> Hmmm...  After 350e97d78e, Isearch locks Emacs with 
> >> toggle-truncate-lines. Recipe:
> >>
> >> C-x C-f long-line.xml
> >> C-x x t
> >> C-s </
> >>
> >> You have to kill Emacs, C-g does not work.
> >
> > I see the same on master, where that change is not yet installed.
> 
> Are you sure?  I don't see the same at 304e2a3a05.  C-s is slow, but it 
> does not hang Emacs, and the effect of C-s </ is visible within a couple 
> of seconds.

I don't know the difference between "slow" and "hang".  Gerd says it
eventually finishes, so it isn't a "hang" at least on his machine.
And my build is unoptimized, so what is "slow" for you probably
qualifies as "hang" for me.

If you disable lazy-highlighting, does the problem go away?

And if you customize lazy-highlight-interval and
lazy-highlight-max-at-a-time to reasonable values, doesn't the "hang"
becomes much shorter?





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-26  6:51                     ` Gerd Möllmann
  2022-07-26  7:08                       ` Gerd Möllmann
@ 2022-07-26 12:12                       ` Eli Zaretskii
  2022-07-26 12:22                         ` Gerd Möllmann
  1 sibling, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-07-26 12:12 UTC (permalink / raw)
  To: Gerd Möllmann; +Cc: 56682, gregory, monnier

> From: Gerd Möllmann <gerd.moellmann@gmail.com>
> Cc: Eli Zaretskii <eliz@gnu.org>,  56682@debbugs.gnu.org,
>   monnier@iro.umontreal.ca
> Date: Tue, 26 Jul 2022 08:51:54 +0200
> 
> Gregory Heytings <gregory@heytings.org> writes:
> 
> > Hmmm...  After 350e97d78e, Isearch locks Emacs with
> > toggle-truncate-lines. Recipe:
> >
> > C-x C-f long-line.xml
> > C-x x t
> > C-s </
> >
> > You have to kill Emacs, C-g does not work.
> 
> That's kind of funny :-):
> 
> (setq isearch-lazy-highlight nil)

Did you try this on master or on the feature branch?

And I found that customizing lazy-highlight-max-at-a-time and
lazy-highlight-interval can alleviate the problem to some extent.

The reason seems to be that lazy-highlighting tries to highlight every
match "in th window", but its interpretation of "in the window" seems
to be "buffer position before window-end position".  Which of course
includes a lot of stuff in a window with truncate-lines.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-26 12:12                       ` Eli Zaretskii
@ 2022-07-26 12:22                         ` Gerd Möllmann
  0 siblings, 0 replies; 685+ messages in thread
From: Gerd Möllmann @ 2022-07-26 12:22 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, Gregory Heytings, Stefan Monnier

[-- Attachment #1: Type: text/plain, Size: 1133 bytes --]

This is on Gregory's branch.

On Tue, 26 Jul 2022, 14:12 Eli Zaretskii, <eliz@gnu.org> wrote:

> > From: Gerd Möllmann <gerd.moellmann@gmail.com>
> > Cc: Eli Zaretskii <eliz@gnu.org>,  56682@debbugs.gnu.org,
> >   monnier@iro.umontreal.ca
> > Date: Tue, 26 Jul 2022 08:51:54 +0200
> >
> > Gregory Heytings <gregory@heytings.org> writes:
> >
> > > Hmmm...  After 350e97d78e, Isearch locks Emacs with
> > > toggle-truncate-lines. Recipe:
> > >
> > > C-x C-f long-line.xml
> > > C-x x t
> > > C-s </
> > >
> > > You have to kill Emacs, C-g does not work.
> >
> > That's kind of funny :-):
> >
> > (setq isearch-lazy-highlight nil)
>
> Did you try this on master or on the feature branch?
>
> And I found that customizing lazy-highlight-max-at-a-time and
> lazy-highlight-interval can alleviate the problem to some extent.
>
> The reason seems to be that lazy-highlighting tries to highlight every
> match "in th window", but its interpretation of "in the window" seems
> to be "buffer position before window-end position".  Which of course
> includes a lot of stuff in a window with truncate-lines.
>

[-- Attachment #2: Type: text/html, Size: 1968 bytes --]

^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-26 12:09                         ` Eli Zaretskii
@ 2022-07-26 12:34                           ` Gregory Heytings
  2022-07-26 12:41                             ` Eli Zaretskii
  0 siblings, 1 reply; 685+ messages in thread
From: Gregory Heytings @ 2022-07-26 12:34 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: gerd.moellmann, 56682, monnier


>
> I don't know the difference between "slow" and "hang".  Gerd says it 
> eventually finishes, so it isn't a "hang" at least on his machine. And 
> my build is unoptimized, so what is "slow" for you probably qualifies as 
> "hang" for me.
>

I just tried again, and on my machine with an optimized build C-s </ RET 
takes 220 seconds to finish (and cannot be interrupted).  That's what I 
call "hang".  With 350e97d78e, C-s </ RET takes about 1 second.  That's 
what I call "slow" (without truncate-lines C-s </ RET is instantaneous).

>
> If you disable lazy-highlighting, does the problem go away?
>

Yes, as I said to Gerd, with (setq isearch-lazy-highlight nil) the problem 
goes away (and C-s </ RET is instantaneous).

>
> And if you customize lazy-highlight-interval and 
> lazy-highlight-max-at-a-time to reasonable values, doesn't the "hang" 
> becomes much shorter?
>

With (setq lazy-highlight-interval 5) the problem does not go away.  With 
(setq lazy-highlight-max-at-a-time 10) the problem goes away, C-s </ RET 
takes about 1 second.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-26 12:34                           ` Gregory Heytings
@ 2022-07-26 12:41                             ` Eli Zaretskii
  2022-07-26 13:08                               ` Gerd Möllmann
  2022-07-26 17:46                               ` Eli Zaretskii
  0 siblings, 2 replies; 685+ messages in thread
From: Eli Zaretskii @ 2022-07-26 12:41 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: gerd.moellmann, 56682, monnier

> Date: Tue, 26 Jul 2022 12:34:30 +0000
> From: Gregory Heytings <gregory@heytings.org>
> cc: gerd.moellmann@gmail.com, 56682@debbugs.gnu.org, monnier@iro.umontreal.ca
> 
> > I don't know the difference between "slow" and "hang".  Gerd says it 
> > eventually finishes, so it isn't a "hang" at least on his machine. And 
> > my build is unoptimized, so what is "slow" for you probably qualifies as 
> > "hang" for me.
> 
> I just tried again, and on my machine with an optimized build C-s </ RET 
> takes 220 seconds to finish (and cannot be interrupted).  That's what I 
> call "hang".  With 350e97d78e, C-s </ RET takes about 1 second.  That's 
> what I call "slow" (without truncate-lines C-s </ RET is instantaneous).

OK, I will take a look soon.  That change makes us use a branch of
code that AFAIU was never used since it was written, so some kind of
trouble can be expected.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-26 12:41                             ` Eli Zaretskii
@ 2022-07-26 13:08                               ` Gerd Möllmann
  2022-07-26 17:29                                 ` Eli Zaretskii
  2022-07-26 17:46                               ` Eli Zaretskii
  1 sibling, 1 reply; 685+ messages in thread
From: Gerd Möllmann @ 2022-07-26 13:08 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, Gregory Heytings, monnier

What about the following idea, in general.  Sorry if that is in the
wrong sub-thread, I'm beginning to loose orientation a bit.

While iterating,

- remmember where we started, say it's 'start_pos'.

- when reaching start_pos + X, without reaching a line end, refuse to do
  any complex stuff, no faces, invisible text and so on.

I could think of numerous variations of that theme.

I just loaded long-lines.xml in VSCode, and it seems to do something
like that.  It says that "tokenization has been disabled" in the long
line.  The long line doesn't have the highlighting that the shorter ones
have, and VSCode also wraps the long line instead of truncating it.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-26 13:08                               ` Gerd Möllmann
@ 2022-07-26 17:29                                 ` Eli Zaretskii
  0 siblings, 0 replies; 685+ messages in thread
From: Eli Zaretskii @ 2022-07-26 17:29 UTC (permalink / raw)
  To: Gerd Möllmann; +Cc: 56682, gregory, monnier

> From: Gerd Möllmann <gerd.moellmann@gmail.com>
> Cc: Gregory Heytings <gregory@heytings.org>,  56682@debbugs.gnu.org,
>   monnier@iro.umontreal.ca
> Date: Tue, 26 Jul 2022 15:08:18 +0200
> 
> What about the following idea, in general.  Sorry if that is in the
> wrong sub-thread, I'm beginning to loose orientation a bit.
> 
> While iterating,
> 
> - remmember where we started, say it's 'start_pos'.
> 
> - when reaching start_pos + X, without reaching a line end, refuse to do
>   any complex stuff, no faces, invisible text and so on.
> 
> I could think of numerous variations of that theme.
> 
> I just loaded long-lines.xml in VSCode, and it seems to do something
> like that.  It says that "tokenization has been disabled" in the long
> line.  The long line doesn't have the highlighting that the shorter ones
> have, and VSCode also wraps the long line instead of truncating it.

We keep this possibility in mind all the time, you can see it in, for
example, the discussion whether to turn off line truncation.  But, as
I explained a minute ago, I think we haven't yet exhausted less
drastic measures, and there could still be opportunities for speedup
in the basic display code or thereabouts.  Our display is different
from that of VSCode, so the trade-offs are different as well.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-26 12:41                             ` Eli Zaretskii
  2022-07-26 13:08                               ` Gerd Möllmann
@ 2022-07-26 17:46                               ` Eli Zaretskii
  2022-07-26 20:55                                 ` Gregory Heytings
  2022-07-27  2:33                                 ` Eli Zaretskii
  1 sibling, 2 replies; 685+ messages in thread
From: Eli Zaretskii @ 2022-07-26 17:46 UTC (permalink / raw)
  To: gregory, gerd.moellmann; +Cc: 56682, monnier

> Cc: gerd.moellmann@gmail.com, 56682@debbugs.gnu.org, monnier@iro.umontreal.ca
> Date: Tue, 26 Jul 2022 15:41:49 +0300
> From: Eli Zaretskii <eliz@gnu.org>
> 
> > I just tried again, and on my machine with an optimized build C-s </ RET 
> > takes 220 seconds to finish (and cannot be interrupted).  That's what I 
> > call "hang".  With 350e97d78e, C-s </ RET takes about 1 second.  That's 
> > what I call "slow" (without truncate-lines C-s </ RET is instantaneous).
> 
> OK, I will take a look soon.  That change makes us use a branch of
> code that AFAIU was never used since it was written, so some kind of
> trouble can be expected.

Heh, it's a case of "better is worse".  There's nothing wrong with the
change in commit 350e97d78e: it does indeed make redisplay of
long-and-truncated lines significantly faster.  And that speedup is
what's causing the problem: because the initial redisplay of the
buffer, before the results of C-s are displayed, is much faster, the
lazy-highlighting starts very soon, and it inserts thousands of
overlays into the buffer (because it by default highlights all the
matches till window-end, which is EOB in this case).  And once it
inserts enough overlays, we are dead in the water: the shortcut in
forward_to_next_line_start can no longer be taken, and we instead
iterate the slow way, one character at a time, all the way to EOB, and
on top of that need on the way to examine every one of the overlays
inserted by lazy-highlighting.

If I revert commit 350e97d78e, redisplay of long-and-truncated lines
becomes much slower, but because of that, lazy-highlighting doesn't
have time to highlight anything before you hit C-s for repeated
search, and thus there are no overlays in the buffer, and on the
average the responses are faster.

I tried to limit the lazy-highlighting by long-line-threshold, but the
speedup due to that is not significant enough (because even a single
overlay in the long line disables the shortcut in
forward_to_next_line_start).  Only limiting
lazy-highlight-initial-delay to, say, 1 sec and
lazy-highlight-max-at-a-time to a small number (like 2 or 5) makes the
problem go away because lazy-highlighting doesn't have enough time to
highlight too much.  And even then once you go deep enough into the
file, the problem comes back.

At this point, I think the only way to produce reasonable performance
from C-s in this case is to turn off lazy-highlighting when lines are
truncated and the buffer has long lines.  Which means we need to
expose the value of long_line_optimizations_p to Lisp, via an accessor
function.  I already have one other use for this: "C-x =", which
attempts to report the column of the character, something that is very
slow in a long-and-truncated line.  And I think we will see more cases
where Lisp code needs to know about this in order to adapt itself to
long lines.

Comments?





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-26 11:45                         ` Eli Zaretskii
@ 2022-07-26 20:52                           ` Dmitry Gutov
  0 siblings, 0 replies; 685+ messages in thread
From: Dmitry Gutov @ 2022-07-26 20:52 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: gerd.moellmann, 56682, gregory, monnier

On 26.07.2022 14:45, Eli Zaretskii wrote:
>> Perhaps it's due to font-lock logic in that it has to match from the
>> beginning of a line (not sure we'd want to abandon that promise,
>> though). Or maybe something else.
> It isn't font-lock, at least not in all major modes.  It's the display
> engine itself that sometimes needs to go to the beginning of the line.
> When it does, going back gets slower with font-lock than without.
> This is why you see slower redisplay when you go deeper into a long
> line.

Makese sense: the text only has to be fontified once, but all redisplays 
are slowed down (on master), not just the first one.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-26 17:46                               ` Eli Zaretskii
@ 2022-07-26 20:55                                 ` Gregory Heytings
  2022-07-27  2:41                                   ` Eli Zaretskii
  2022-07-27  2:33                                 ` Eli Zaretskii
  1 sibling, 1 reply; 685+ messages in thread
From: Gregory Heytings @ 2022-07-26 20:55 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: gerd.moellmann, 56682, monnier


>
> Heh, it's a case of "better is worse".  There's nothing wrong with the 
> change in commit 350e97d78e: it does indeed make redisplay of 
> long-and-truncated lines significantly faster.  And that speedup is 
> what's causing the problem: because the initial redisplay of the buffer, 
> before the results of C-s are displayed, is much faster, the 
> lazy-highlighting starts very soon, and it inserts thousands of overlays 
> into the buffer (because it by default highlights all the matches till 
> window-end, which is EOB in this case).  And once it inserts enough 
> overlays, we are dead in the water: the shortcut in 
> forward_to_next_line_start can no longer be taken, and we instead 
> iterate the slow way, one character at a time, all the way to EOB, and 
> on top of that need on the way to examine every one of the overlays 
> inserted by lazy-highlighting.
>

Thanks; as far as I can see your analysis is correct.  At 304e2a3a05, if I 
press C-s </ and wait long enough (a few seconds are enough), 
lazy-highlighting has enough time to put enough overlays in the buffer to 
hang Emacs.

>
> At this point, I think the only way to produce reasonable performance 
> from C-s in this case is to turn off lazy-highlighting when lines are 
> truncated and the buffer has long lines.  Which means we need to expose 
> the value of long_line_optimizations_p to Lisp, via an accessor 
> function.  I already have one other use for this: "C-x =", which 
> attempts to report the column of the character, something that is very 
> slow in a long-and-truncated line.  And I think we will see more cases 
> where Lisp code needs to know about this in order to adapt itself to 
> long lines.
>

My conclusion is different: we will see more such cases, but only with 
truncate-lines enabled, and that means that truncate-lines should be 
disabled in such buffers.

The fundamental problem is that with truncate-lines we cannot really 
narrow the buffer to a smaller (contiguous) portion without creating 
problems.  What would be necessary would be some kind of non-contiguous 
narrowing.  If we are on line 1, on column 10000, of a buffer with 80 
lines each of which is 20000 characters wide, what we see on screen are 
characters 9960-10040, 29960-30040, 49960-50040, 69960-70040, and so 
forth.  Without such a non-continguous narrowing, all kinds of problems 
like the C-s and C-x = one you identified will appear.  These problems can 
indeed, in principle, be solved by adding local fixes depending on 
(long-line-optimizations-p) whenever we encounter such a bug, but doing 
that would be most regrettable, as the simplicity of these optimizations 
would be largely lost.  Doing that while knowing that, as I said, we'll 
hit another ceil very soon is clearly (to me at least) not TRT.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-25 21:23     ` Gregory Heytings
@ 2022-07-26 21:17       ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-07-27  6:44         ` Gregory Heytings
  2022-07-27 11:18         ` Eli Zaretskii
  0 siblings, 2 replies; 685+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2022-07-26 21:17 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, Eli Zaretskii

Gregory Heytings [2022-07-25 21:23:55] wrote:
>> Before using a blunt tool like the forced-narrowing now in
>> `feature/long-lines-and-font-locking`, I think we should try and figure
>> out *why* the recipe below is so slow.
> It's not a blunt tool, it's an appropriate tool to help making sure that
> Emacs remains responsive when large files are visited.

I'm not opposed to reducing the size of the text that's considered, but
doing it via narrowing is a blunt tool.

> Think of it as POSIX's ulimits.

That's also a blunt tool.

> Allowing fontification-functions to search for arbitrarily complex
> regexpes in an arbitrarily large buffer, each and every time they are
> asked to to highlight a small chunk of the said buffer, is a recipe
> for disaster.

`font-lock.el` could enforce a smaller scope in a more discerning way
that narrowing can.

> If for some reason modes really need to go through to the whole
> buffer to decide which highlighting to use, they should to do so outside of
> fontification-functions, and ideally once, for example, when the file
> is loaded.

With the current narrowing they can't even know why the buffer is
narrowed and hence can't make an informed decision whether they should
maybe widen to look elsewhere.


        Stefan






^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-26 17:46                               ` Eli Zaretskii
  2022-07-26 20:55                                 ` Gregory Heytings
@ 2022-07-27  2:33                                 ` Eli Zaretskii
  2022-07-27  6:24                                   ` Gerd Möllmann
  1 sibling, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-07-27  2:33 UTC (permalink / raw)
  To: gerd.moellmann; +Cc: 56682, gregory, monnier

> Cc: 56682@debbugs.gnu.org, monnier@iro.umontreal.ca
> Date: Tue, 26 Jul 2022 20:46:24 +0300
> From: Eli Zaretskii <eliz@gnu.org>
> 
> At this point, I think the only way to produce reasonable performance
> from C-s in this case is to turn off lazy-highlighting when lines are
> truncated and the buffer has long lines.  Which means we need to
> expose the value of long_line_optimizations_p to Lisp, via an accessor
> function.  I already have one other use for this: "C-x =", which
> attempts to report the column of the character, something that is very
> slow in a long-and-truncated line.  And I think we will see more cases
> where Lisp code needs to know about this in order to adapt itself to
> long lines.

Actually, I might have one more idea that could perhaps resolve this
more nicely.

Gerd, the search for display properties and overlays in
forward_to_next_line_start, which disables the 'reseat' shortcut, is
because these could have strings as values, and those strings could
have embedded newlines, right?  Or are there some other reasons?





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-26 20:55                                 ` Gregory Heytings
@ 2022-07-27  2:41                                   ` Eli Zaretskii
  2022-07-27  7:08                                     ` Gregory Heytings
  0 siblings, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-07-27  2:41 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: gerd.moellmann, 56682, monnier

> Date: Tue, 26 Jul 2022 20:55:05 +0000
> From: Gregory Heytings <gregory@heytings.org>
> cc: gerd.moellmann@gmail.com, 56682@debbugs.gnu.org, monnier@iro.umontreal.ca
> 
> My conclusion is different: we will see more such cases, but only with 
> truncate-lines enabled, and that means that truncate-lines should be 
> disabled in such buffers.

I think these two issues are almost orthogonal.  Even if we decide to
disable truncate-lines in such buffers, we won't prevent users from
enabling it.  And if and when they enable it, we'd still like to give
them the best performance we can.  So speeding up the performance when
truncate-lines is enabled is still a worthy goal, although if that is
disabled in long-line buffers, that goal becomes less important.

> The fundamental problem is that with truncate-lines we cannot really 
> narrow the buffer to a smaller (contiguous) portion without creating 
> problems.

Yes, we need to find speedup opportunities that aren't solved by
narrowing.  But what I see for now is that the main bottleneck when
lines are truncated is reseat_at_next_visible_line_start, because we
call it each time we reach the right edge of a window, and need to
decide where to display the next screen line.  I've sped that up with
recent commits on the branch, but it is still very slow in some
situations, such as the one with isearch-lazy-highlight.  Another
situation which slows it down tremendously is when show-paren-mode
(which is ON by default nowadays) has a highlighted parenthesis
somewhere in the portion of the buffer outside of the viewport, the
part that reseat_at_next_visible_line_start needs to traverse to get
to the next newline.

I'm trying to speed up these situations as much as possible, and I
think it will serve us well even if we decide to turn off
truncate-lines in long-line buffers.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-27  2:33                                 ` Eli Zaretskii
@ 2022-07-27  6:24                                   ` Gerd Möllmann
  2022-07-27 17:26                                     ` Eli Zaretskii
  0 siblings, 1 reply; 685+ messages in thread
From: Gerd Möllmann @ 2022-07-27  6:24 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, gregory, monnier

Eli Zaretskii <eliz@gnu.org> writes:

> Gerd, the search for display properties and overlays in
> forward_to_next_line_start, which disables the 'reseat' shortcut, is
> because these could have strings as values, and those strings could
> have embedded newlines, right?  Or are there some other reasons?

Correct, and I don't think there are other reasons.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-26 21:17       ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2022-07-27  6:44         ` Gregory Heytings
  2022-07-30  7:16           ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-07-27 11:18         ` Eli Zaretskii
  1 sibling, 1 reply; 685+ messages in thread
From: Gregory Heytings @ 2022-07-27  6:44 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: 56682, Eli Zaretskii


>>> Before using a blunt tool like the forced-narrowing now in 
>>> `feature/long-lines-and-font-locking`, I think we should try and 
>>> figure out *why* the recipe below is so slow.
>>
>> It's not a blunt tool, it's an appropriate tool to help making sure 
>> that Emacs remains responsive when large files are visited.
>
> I'm not opposed to reducing the size of the text that's considered, but 
> doing it via narrowing is a blunt tool.
>

It isn't.  The only way to make sure that the size of the text is small 
enough is a forced narrowing from which fontification-functions cannot 
escape.

But let's try to be constructive.  You tell me that you're not opposed to 
reducing the size of the text, and that font-lock.el could enforce a 
smaller scope.  So could you please design a (Elisp) function (in 
font-lock.el) which, given a (beg end) with beg <= end in a buffer, 
returns a (beg' end') with beg <= beg' <= end' <= end that are better 
starting end end points for the forced narrowing?  That function would be 
run in handle_fontified_prop, before fontification-functions, and would 
have access to the whole buffer.

>> Think of it as POSIX's ulimits.
>
> That's also a blunt tool.
>

It isn't either.  It's a practical way to limit what a single process can 
do to make sure that what it does doesn't impact other running processes. 
At $job, each time I've seen a ulimit reached (usually the limit on open 
file descriptors), it was because of a bug.  I think I've seen a single 
exception, with a program that sometimes really needed to open more 
(temporary) files.  And even in that case the solution was not to remove 
the limit, but to raise it (from 1024 to 4096 IIRC).

>
> With the current narrowing they can't even know why the buffer is 
> narrowed and hence can't make an informed decision whether they should 
> maybe widen to look elsewhere.
>

There is no point to make such a decision, because they can't escape the 
narrowing.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
       [not found]                           ` <addcac7f-cb95-c433-58e5-e2d525582613@yandex.ru>
@ 2022-07-27  6:55                             ` Gregory Heytings
  2022-07-27 21:38                               ` Dmitry Gutov
  0 siblings, 1 reply; 685+ messages in thread
From: Gregory Heytings @ 2022-07-27  6:55 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: gerd.moellmann, 56682, Eli Zaretskii, monnier


>
> But I'm seeing incorrect fontification. Is this one expected?
>

Yes, occasional mis-fontification is expected.  It's a compromise between 
"no fontification" and "slow fontification".

>
> Perhaps something to do with the number 40000?
>

There is no magical number 40000 in the implementation, the buffer limits 
to which fontification-functions are constrained are determined 
dynamically, depending on the width and height of the window.

My guess in this specific case is that the first instance of 
"Downloadify.Container" was fontified by the previous call to 
fontification-functions, and that the next chunk of text in which the two 
other instances of "Downloadify.Container" are contained was fontified by 
the next call to fontification-functions, which did not have access 
anymore to the place where Downloadify.Container is defined.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-27  2:41                                   ` Eli Zaretskii
@ 2022-07-27  7:08                                     ` Gregory Heytings
  0 siblings, 0 replies; 685+ messages in thread
From: Gregory Heytings @ 2022-07-27  7:08 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: gerd.moellmann, 56682, monnier


>
> Even if we decide to disable truncate-lines in such buffers, we won't 
> prevent users from enabling it.
>

That's correct, but if they consciously decide to shoot themselves in the 
foot, that's not Emacs' responsibility anymore.

>
> And if and when they enable it, we'd still like to give them the best 
> performance we can.  So speeding up the performance when truncate-lines 
> is enabled is still a worthy goal, although if that is disabled in 
> long-line buffers, that goal becomes less important.
>

I fully agree with that.

>
> I'm trying to speed up these situations as much as possible, and I think 
> it will serve us well even if we decide to turn off truncate-lines in 
> long-line buffers.
>

Thanks!





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-26 21:17       ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-07-27  6:44         ` Gregory Heytings
@ 2022-07-27 11:18         ` Eli Zaretskii
  1 sibling, 0 replies; 685+ messages in thread
From: Eli Zaretskii @ 2022-07-27 11:18 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: 56682, gregory

> From: Stefan Monnier <monnier@iro.umontreal.ca>
> Cc: Eli Zaretskii <eliz@gnu.org>,  56682@debbugs.gnu.org
> Date: Tue, 26 Jul 2022 17:17:29 -0400
> 
> > Allowing fontification-functions to search for arbitrarily complex
> > regexpes in an arbitrarily large buffer, each and every time they are
> > asked to to highlight a small chunk of the said buffer, is a recipe
> > for disaster.
> 
> `font-lock.el` could enforce a smaller scope in a more discerning way
> that narrowing can.
> 
> > If for some reason modes really need to go through to the whole
> > buffer to decide which highlighting to use, they should to do so outside of
> > fontification-functions, and ideally once, for example, when the file
> > is loaded.
> 
> With the current narrowing they can't even know why the buffer is
> narrowed and hence can't make an informed decision whether they should
> maybe widen to look elsewhere.

Feel free to suggest better ways of handling these issues, or even
ways to solve this entirely inside font-lock.  If and when such
suggestions materialize, I'm sure we will be glad to use them instead
of less elegant/more direct solutions.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-27  6:24                                   ` Gerd Möllmann
@ 2022-07-27 17:26                                     ` Eli Zaretskii
  2022-07-28 16:29                                       ` Gregory Heytings
  0 siblings, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-07-27 17:26 UTC (permalink / raw)
  To: Gerd Möllmann; +Cc: 56682, gregory, monnier

> From: Gerd Möllmann <gerd.moellmann@gmail.com>
> Cc: gregory@heytings.org,  56682@debbugs.gnu.org,  monnier@iro.umontreal.ca
> Date: Wed, 27 Jul 2022 08:24:45 +0200
> 
> Eli Zaretskii <eliz@gnu.org> writes:
> 
> > Gerd, the search for display properties and overlays in
> > forward_to_next_line_start, which disables the 'reseat' shortcut, is
> > because these could have strings as values, and those strings could
> > have embedded newlines, right?  Or are there some other reasons?
> 
> Correct, and I don't think there are other reasons.

Thanks, I installed an optimization, which makes Isearch faster in
such cases.

Turning off isearch-lazy-highlight in these cases is still a good
idea, though.

The next problem with long-and-truncated lines is that in many places
as part of redisplay we begin from the line's beginning and then go to
the position of point or the first visible X coordinate or somesuch.
This becomes slow when point is very far to the right, like near the
end of the line.  A typical place in the code where this happens is at
beginning of display_line, where we call move_it_in_display_line_to to
get to it->first_visible_x.  This could take seconds if there are many
overlays on the line, which is what happens, for example, if we are in
the middle of Isearch and isearch-lazy-highlight is turned ON.
(Searching for "</" in long-line.xml produces 9K overlays!)

I'll try to think how to speed up these move_it_* calls in those
cases.  Ideas welcome.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-27  6:55                             ` Gregory Heytings
@ 2022-07-27 21:38                               ` Dmitry Gutov
  2022-07-28  6:21                                 ` Eli Zaretskii
  2022-07-28  7:49                                 ` Gregory Heytings
  0 siblings, 2 replies; 685+ messages in thread
From: Dmitry Gutov @ 2022-07-27 21:38 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: gerd.moellmann, 56682, Eli Zaretskii, monnier

On 27.07.2022 09:55, Gregory Heytings wrote:
> 
>>
>> But I'm seeing incorrect fontification. Is this one expected?
>>
> 
> Yes, occasional mis-fontification is expected.  It's a compromise 
> between "no fontification" and "slow fontification".

I wonder now if the majority of the slowdown was caused by the 
redisplay, whereas font-lock (which only has to run once per screenful) 
was actually "fast enough".

>> Perhaps something to do with the number 40000?
>>
> 
> There is no magical number 40000 in the implementation, the buffer 
> limits to which fontification-functions are constrained are determined 
> dynamically, depending on the width and height of the window.
> 
> My guess in this specific case is that the first instance of 
> "Downloadify.Container" was fontified by the previous call to 
> fontification-functions, and that the next chunk of text in which the 
> two other instances of "Downloadify.Container" are contained was 
> fontified by the next call to fontification-functions, which did not 
> have access anymore to the place where Downloadify.Container is defined.

Could you clarify what you mean by "access ... to the place where ... is 
defined"? "new Downloadify.Container" is highlighted by a regular regexp 
matcher, not some custom elisp code which has to visit the position 
where the identifier is defined.

Same goes for the tokens like "null", "function" and "return", but those 
do get fontified after position 40000 in this example.

And the way those rules get applied doesn't seem particularly different, 
it's just that the keyword matcher goes before the class instantiation 
matcher inside js--font-lock-keywords-3.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-27 21:38                               ` Dmitry Gutov
@ 2022-07-28  6:21                                 ` Eli Zaretskii
  2022-07-28  7:49                                 ` Gregory Heytings
  1 sibling, 0 replies; 685+ messages in thread
From: Eli Zaretskii @ 2022-07-28  6:21 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: gerd.moellmann, 56682, gregory, monnier

> Date: Thu, 28 Jul 2022 00:38:09 +0300
> Cc: gerd.moellmann@gmail.com, 56682@debbugs.gnu.org,
>  Eli Zaretskii <eliz@gnu.org>, monnier@iro.umontreal.ca
> From: Dmitry Gutov <dgutov@yandex.ru>
> 
> > Yes, occasional mis-fontification is expected.  It's a compromise 
> > between "no fontification" and "slow fontification".
> 
> I wonder now if the majority of the slowdown was caused by the 
> redisplay, whereas font-lock (which only has to run once per screenful) 
> was actually "fast enough".

To establish that, you can run font-lock-fontify-buffer, wait until it
finishes, and then try moving around and comparing that with a buffer
in which font-lock was turned off.  (Do this on master, of course,
where the changes we are discussing are not yet installed.)

In general, even after a full fontification, you should see at least
some slowdown due to the faces.  How much slowdown, quantitatively, I
don't know, but perhaps Gregory measured that as part of his work.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-27 21:38                               ` Dmitry Gutov
  2022-07-28  6:21                                 ` Eli Zaretskii
@ 2022-07-28  7:49                                 ` Gregory Heytings
  2022-08-04  0:49                                   ` Dmitry Gutov
  1 sibling, 1 reply; 685+ messages in thread
From: Gregory Heytings @ 2022-07-28  7:49 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: gerd.moellmann, 56682, Eli Zaretskii, monnier

[-- Attachment #1: Type: text/plain, Size: 1594 bytes --]


>> Yes, occasional mis-fontification is expected.  It's a compromise 
>> between "no fontification" and "slow fontification".
>
> I wonder now if the majority of the slowdown was caused by the 
> redisplay, whereas font-lock (which only has to run once per screenful) 
> was actually "fast enough".
>

Those two statements are not mutually exclusive.  The majority of the 
slowdown was indeed caused by redisplay, but font-lock was not fast 
enough.  Try to open a sufficiently large file (e.g. the dictionary.json 
one) with the code on master, and type M->.  You'll see that Emacs needs 
about five seconds (on my laptop) to display the end of the buffer.  Now 
compare that with the feature branch, with which the end of the buffer is 
displayed instantaneously.  That five seconds delay is caused by 
fontification-functions.

>
> Could you clarify what you mean by "access ... to the place where ... is 
> defined"? "new Downloadify.Container" is highlighted by a regular regexp 
> matcher, not some custom elisp code which has to visit the position 
> where the identifier is defined.
>

Sorry, I cannot be more precise, I don't have the "downloadify.js" file 
here.  It was just a guess, based on what I saw on the screenshot, that 
one function called by fontification-functions collects all class 
definitions and highlights their identifiers elsewhere in the buffer with 
a specific face.  When the buffer is narrowed, that function may not see 
the Downloadify.Container definition (which is, I guess, placed near the 
beginning of the file) anymore.

^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-27 17:26                                     ` Eli Zaretskii
@ 2022-07-28 16:29                                       ` Gregory Heytings
  2022-07-28 16:42                                         ` Gregory Heytings
  2022-07-28 16:48                                         ` Eli Zaretskii
  0 siblings, 2 replies; 685+ messages in thread
From: Gregory Heytings @ 2022-07-28 16:29 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: Gerd Möllmann, 56682, monnier


>
> Thanks, I installed an optimization, which makes Isearch faster in such 
> cases.
>

Thanks.  Alas, as far as I can see, we're still quite far from a usable 
Emacs with long-and-truncated lines.  A recipe:

emacs -Q
C-x C-f long-line.xml RET
M-g g 12
C-u 12 M-x duplicate-line
C-x C-s multiple-long-lines.xml RET
C-x C-f multiple-long-lines.xml RET y
C-x x t
C-s </ RET

This last step is not yet finished after 10 minutes (600 seconds), and you 
cannot abort it.

>
> Turning off isearch-lazy-highlight in these cases is still a good idea, 
> though.
>

Indeed, (setq isearch-lazy-highlight nil) "fixes" the above recipe (but 
see below).

>
> The next problem with long-and-truncated lines is that in many places as 
> part of redisplay we begin from the line's beginning and then go to the 
> position of point or the first visible X coordinate or somesuch. This 
> becomes slow when point is very far to the right, like near the end of 
> the line.  A typical place in the code where this happens is at 
> beginning of display_line, where we call move_it_in_display_line_to to 
> get to it->first_visible_x.  This could take seconds if there are many 
> overlays on the line, which is what happens, for example, if we are in 
> the middle of Isearch and isearch-lazy-highlight is turned ON.
>

Indeed, Emacs isn't really usable.  For example, with 
multiple-long-lines.xml, after M-g g 20 C-e (which already takes several 
seconds to complete) each motion, search or insertion command still takes 
several seconds (even with find-file-literally).  For example (without 
isearch-lazy-highlight), C-s </releases> RET takes about 10 seconds. 
After that, C-s C-s takes another 10 seconds, an additional C-s also takes 
10 seconds, and C-g to abort isearch takes about 90 seconds.  And, even 
when you don't do anything, Emacs uses 100% of the CPU.  All this is, in 
the same file, instantaneous without truncate-lines.

>
> (Searching for "</" in long-line.xml produces 9K overlays!)
>

That's (another sign of) the fundamental problem I mentioned earlier. 
Without truncate-lines the visible portion of the buffer remains small, 
and it is thus possible to reduce the portion of the buffer that display 
routines will see.  With truncate-lines it can easily become huge.  For 
example, with multiple-long-lines.xml, (- (window-end) (window-start)) is 
7744464 with truncate-lines and 2454 without truncate-lines.  And 
multiple-long-lines.xml is still a relatively "small" file, it's only 15 
MB.

>
> I'll try to think how to speed up these move_it_* calls in those cases. 
> Ideas welcome.
>

I cannot claim I understand the display code enough, but I see no way to 
make the portion of the buffer that is considered by display routines 
smaller without introducing the kind of rectangular narrowing I mentioned 
earlier.  As far as I understand, everything else is just a band-aid, that 
will make Emacs behave a bit faster only in some cases, and with which 
Emacs will remain unresponsive in too many cases.

Perfect is the enemy of good.  I strongly suggest we just admit that Emacs 
can't cope with long lines and truncate-lines together, which is true 
anyway given the DISP_INFINITY limit.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-28 16:29                                       ` Gregory Heytings
@ 2022-07-28 16:42                                         ` Gregory Heytings
  2022-07-28 16:48                                         ` Eli Zaretskii
  1 sibling, 0 replies; 685+ messages in thread
From: Gregory Heytings @ 2022-07-28 16:42 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: Gerd Möllmann, 56682, monnier


>
> emacs -Q
> C-x C-f long-line.xml RET
> M-g g 12
> C-u 12 M-x duplicate-line
> C-x C-s multiple-long-lines.xml RET
> C-x C-f multiple-long-lines.xml RET y
> C-x x t
> C-s </ RET
>

Sorry, there's a typo in that recipe, it should be:

C-u 50 M-x duplicate-line





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-28 16:29                                       ` Gregory Heytings
  2022-07-28 16:42                                         ` Gregory Heytings
@ 2022-07-28 16:48                                         ` Eli Zaretskii
  2022-07-28 17:16                                           ` Gregory Heytings
  1 sibling, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-07-28 16:48 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: gerd.moellmann, 56682, monnier

> Date: Thu, 28 Jul 2022 16:29:44 +0000
> From: Gregory Heytings <gregory@heytings.org>
> cc: Gerd Möllmann <gerd.moellmann@gmail.com>, 
>     56682@debbugs.gnu.org, monnier@iro.umontreal.ca
> 
> Indeed, Emacs isn't really usable.  For example, with 
> multiple-long-lines.xml, after M-g g 20 C-e (which already takes several 
> seconds to complete) each motion, search or insertion command still takes 
> several seconds (even with find-file-literally).  For example (without 
> isearch-lazy-highlight), C-s </releases> RET takes about 10 seconds. 
> After that, C-s C-s takes another 10 seconds, an additional C-s also takes 
> 10 seconds, and C-g to abort isearch takes about 90 seconds.  And, even 
> when you don't do anything, Emacs uses 100% of the CPU.  All this is, in 
> the same file, instantaneous without truncate-lines.

I think such long lines happen in files that have very little except
the long line.  So duplicating it makes the use case much less
important.  And in any case, we shouldn't try dealing with such files
before we have a good solution for a single-line files.

> > (Searching for "</" in long-line.xml produces 9K overlays!)
> 
> That's (another sign of) the fundamental problem I mentioned earlier. 
> Without truncate-lines the visible portion of the buffer remains small, 
> and it is thus possible to reduce the portion of the buffer that display 
> routines will see.  With truncate-lines it can easily become huge.  For 
> example, with multiple-long-lines.xml, (- (window-end) (window-start)) is 
> 7744464 with truncate-lines and 2454 without truncate-lines.  And 
> multiple-long-lines.xml is still a relatively "small" file, it's only 15 
> MB.

This is actually a bug in isearch.el: using window-end in a buffer
under truncate-lines is simply wrong.  I'm going to file a bug about
that soon.

But that's not a fundamental problem, or at least I don't yet see why
it would be fundamental.  It's something specific to isearch.el and to
how isearch-lazy-highlight is implemented.  The fix I installed
prevented us from walking all that long line till the end of the
buffer, so in effect the display code doesn't see most of the buffer
text, they just jump over it.

> > I'll try to think how to speed up these move_it_* calls in those cases. 
> > Ideas welcome.
> 
> I cannot claim I understand the display code enough, but I see no way to 
> make the portion of the buffer that is considered by display routines 
> smaller without introducing the kind of rectangular narrowing I mentioned 
> earlier.

I still have one or two ideas to try, and they don't involve anything
as complex as some new kind of narrowing.

> Perfect is the enemy of good.  I strongly suggest we just admit that Emacs 
> can't cope with long lines and truncate-lines together, which is true 
> anyway given the DISP_INFINITY limit.

Feel free to give up on it and stop trying to make that case faster,
but I'm not ready to give up yet.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-28 16:48                                         ` Eli Zaretskii
@ 2022-07-28 17:16                                           ` Gregory Heytings
  2022-07-28 17:44                                             ` Eli Zaretskii
  0 siblings, 1 reply; 685+ messages in thread
From: Gregory Heytings @ 2022-07-28 17:16 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: gerd.moellmann, 56682, monnier


>
> I think such long lines happen in files that have very little except the 
> long line.  So duplicating it makes the use case much less important.
>

That's not correct.  Some files have indeed have a single long line, but 
others have more than one long line.  Duplicating the line in that file 
was just a quick way to generate a file with more long lines.  For 
example, a database dump will typically contain one long line for each 
table.  I have a database dump here with ~100 lines that are each about 1 
MB long, each of which is a single "insert into" statement.

>
> This is actually a bug in isearch.el: using window-end in a buffer under 
> truncate-lines is simply wrong.
>

The measurements I gave were with isearch, but as I said you see the same 
kind of slowdowns with motion and insertion commands.

>
> But that's not a fundamental problem, or at least I don't yet see why it 
> would be fundamental.  It's something specific to isearch.el and to how 
> isearch-lazy-highlight is implemented.
>

No, the measurements I gave were with isearch-lazy-highlight turned OFF. 
And it is the fundamental problem, because it means that all display 
routines have to deal with a very large amount of data.

>
> I still have one or two ideas to try, and they don't involve anything as 
> complex as some new kind of narrowing.
>

Okay, so I'll wait a bit more.  I'd like to reach a conclusion as to 
whether truncate-lines should be turned off when long_line_optimizations_p 
is on before merging the branch into master.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-28 17:16                                           ` Gregory Heytings
@ 2022-07-28 17:44                                             ` Eli Zaretskii
  2022-07-28 18:40                                               ` Gregory Heytings
  0 siblings, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-07-28 17:44 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: gerd.moellmann, 56682, monnier

> Date: Thu, 28 Jul 2022 17:16:32 +0000
> From: Gregory Heytings <gregory@heytings.org>
> cc: gerd.moellmann@gmail.com, 56682@debbugs.gnu.org, monnier@iro.umontreal.ca
> 
> > This is actually a bug in isearch.el: using window-end in a buffer under 
> > truncate-lines is simply wrong.
> 
> The measurements I gave were with isearch, but as I said you see the same 
> kind of slowdowns with motion and insertion commands.

No, that's not what I see.  Without the thousands of Isearch overlays
Emacs works much faster, almost 2 orders of magnitude faster.

> No, the measurements I gave were with isearch-lazy-highlight turned OFF. 
> And it is the fundamental problem, because it means that all display 
> routines have to deal with a very large amount of data.

By multiplying a very long and truncated line enough times you can
always make Emacs useless.  The speedups I have in mind scale linearly
with the number of such lines, so eventually, with enough such lines,
Emacs will always become very slow at some point, especially if the
window is hscrolled very far to the right.  That doesn't mean we
shouldn't try speeding up the code: someone just told me that the
perfect is the enemy of the good.

> > I still have one or two ideas to try, and they don't involve anything as 
> > complex as some new kind of narrowing.
> 
> Okay, so I'll wait a bit more.  I'd like to reach a conclusion as to 
> whether truncate-lines should be turned off when long_line_optimizations_p 
> is on before merging the branch into master.

That's unrelated.  The branch was created for your work on font-lock,
and if you are done with that, feel free to land it on master.  I can
continue working on master, and/or will create a feature branch if I
feel it's justified.

Thanks.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-28 17:44                                             ` Eli Zaretskii
@ 2022-07-28 18:40                                               ` Gregory Heytings
  2022-07-28 18:57                                                 ` Eli Zaretskii
  0 siblings, 1 reply; 685+ messages in thread
From: Gregory Heytings @ 2022-07-28 18:40 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: gerd.moellmann, 56682, monnier


>> And it is the fundamental problem, because it means that all display 
>> routines have to deal with a very large amount of data.
>
> By multiplying a very long and truncated line enough times you can 
> always make Emacs useless.  The speedups I have in mind scale linearly 
> with the number of such lines, so eventually, with enough such lines, 
> Emacs will always become very slow at some point, especially if the 
> window is hscrolled very far to the right.
>

That's exactly my point: with long and truncated lines Emacs can become 
unusable with a 20 MB file, with long lines Emacs does not become unusable 
even with a 1 GB file.  And what I (and everybody I guess) wants is a 
"full and complete" solution.

>> Okay, so I'll wait a bit more.  I'd like to reach a conclusion as to 
>> whether truncate-lines should be turned off when 
>> long_line_optimizations_p is on before merging the branch into master.
>
> That's unrelated.  The branch was created for your work on font-lock, 
> and if you are done with that, feel free to land it on master.  I can 
> continue working on master, and/or will create a feature branch if I 
> feel it's justified.
>

It's not unrelated, at least not in my mind.  The branch was initially 
created to fix the remaining font-lock related issues, but this thread 
discusses, and the branch contains, fixes to the other remaining issues. 
I don't want to close this bug without a "full and complete" solution, and 
currently someone who has (setq truncate-lines t) in their init file or 
who presses C-x x t will see Emacs become unusable with a file with long 
lines.

What about the following course of action: I add a "disable truncate-lines 
in buffers with long lines" feature, and you remove it/disable it/make it 
optional later if/when you consider that your fixes make Emacs fast enough 
with long-and-truncated lines.  And we can/should open a new bug report 
and branch to discuss these long-and-truncated lines issues and solution 
attempts.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-28 18:40                                               ` Gregory Heytings
@ 2022-07-28 18:57                                                 ` Eli Zaretskii
  2022-07-28 21:31                                                   ` Gregory Heytings
  0 siblings, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-07-28 18:57 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: gerd.moellmann, 56682, monnier

> Date: Thu, 28 Jul 2022 18:40:26 +0000
> From: Gregory Heytings <gregory@heytings.org>
> cc: gerd.moellmann@gmail.com, 56682@debbugs.gnu.org, monnier@iro.umontreal.ca
> 
> > By multiplying a very long and truncated line enough times you can 
> > always make Emacs useless.  The speedups I have in mind scale linearly 
> > with the number of such lines, so eventually, with enough such lines, 
> > Emacs will always become very slow at some point, especially if the 
> > window is hscrolled very far to the right.
> 
> That's exactly my point: with long and truncated lines Emacs can become 
> unusable with a 20 MB file, with long lines Emacs does not become unusable 
> even with a 1 GB file.  And what I (and everybody I guess) wants is a 
> "full and complete" solution.

Feel free to want it and feel free to wait for it, or work on it.  But
that doesn't mean I or others cannot meanwhile install less "full and
complete" solutions that improve some use cases.  And any user can
always turn off truncate-lines in such buffers, if some particular use
case makes Emacs unusable for them, it's not like this possibility is
taken from them.

> > That's unrelated.  The branch was created for your work on font-lock, 
> > and if you are done with that, feel free to land it on master.  I can 
> > continue working on master, and/or will create a feature branch if I 
> > feel it's justified.
> 
> It's not unrelated, at least not in my mind.  The branch was initially 
> created to fix the remaining font-lock related issues, but this thread 
> discusses, and the branch contains, fixes to the other remaining issues. 

I worked on truncated-lines case on the branch because without the
improvements you installed it was impossible to do anything with that:
Emacs was too slow to allow reasonable debugging and measurements.
That is the only relation between the two.

I don't see any reason to delay landing the important improvements we
have on the branch.  It will allow more people to use those
improvements, and thus will contribute both to their stability and to
further progress in this direction.

> I don't want to close this bug without a "full and complete" solution, and 
> currently someone who has (setq truncate-lines t) in their init file or 
> who presses C-x x t will see Emacs become unusable with a file with long 
> lines.

The bug can be kept open, if you don't want to close it.  I don't
mind.

> What about the following course of action: I add a "disable truncate-lines 
> in buffers with long lines" feature, and you remove it/disable it/make it 
> optional later if/when you consider that your fixes make Emacs fast enough 
> with long-and-truncated lines.

No.  Please stop pressuring me into making a decision I'm not yet
ready to make.  There's absolutely no rush.

> And we can/should open a new bug report and branch to discuss these
> long-and-truncated lines issues and solution attempts.

Opening a new bug about that is fine by me.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-28 18:57                                                 ` Eli Zaretskii
@ 2022-07-28 21:31                                                   ` Gregory Heytings
  2022-07-29  7:12                                                     ` Eli Zaretskii
  0 siblings, 1 reply; 685+ messages in thread
From: Gregory Heytings @ 2022-07-28 21:31 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: gerd.moellmann, 56682, Lars Ingebrigtsen, monnier


>
> I don't see any reason to delay landing the important improvements we 
> have on the branch.  It will allow more people to use those 
> improvements, and thus will contribute both to their stability and to 
> further progress in this direction.
>

Okay, I pushed two final (?) improvements: a new optional argument "lock" 
to narrow-to-region that Lars (added in Cc) suggested and which is now 
used to lock the restriction around fontification-functions, and two 
updates to the documentation.

Could you please tell me if it's ready to merge?

>> And we can/should open a new bug report and branch to discuss these 
>> long-and-truncated lines issues and solution attempts.
>
> Opening a new bug about that is fine by me.
>

Actually there's no need to open a new bug report, as bug#56683 already 
exists.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-28 21:31                                                   ` Gregory Heytings
@ 2022-07-29  7:12                                                     ` Eli Zaretskii
  2022-07-29  8:33                                                       ` Gregory Heytings
  0 siblings, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-07-29  7:12 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: gerd.moellmann, 56682, larsi, monnier

> Date: Thu, 28 Jul 2022 21:31:30 +0000
> From: Gregory Heytings <gregory@heytings.org>
> cc: Lars Ingebrigtsen <larsi@gnus.org>, gerd.moellmann@gmail.com, 
>     56682@debbugs.gnu.org, monnier@iro.umontreal.ca
> 
> Okay, I pushed two final (?) improvements: a new optional argument "lock" 
> to narrow-to-region that Lars (added in Cc) suggested and which is now 
> used to lock the restriction around fontification-functions, and two 
> updates to the documentation.

Thanks, I made a few minor documentation changes there.

> Could you please tell me if it's ready to merge?

Yes, I think it's ready, thanks for all your hard work on this.

> >> And we can/should open a new bug report and branch to discuss these 
> >> long-and-truncated lines issues and solution attempts.
> >
> > Opening a new bug about that is fine by me.
> >
> 
> Actually there's no need to open a new bug report, as bug#56683 already 
> exists.

Right.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-29  7:12                                                     ` Eli Zaretskii
@ 2022-07-29  8:33                                                       ` Gregory Heytings
  2022-07-29 10:29                                                         ` Eli Zaretskii
  2022-07-29 13:27                                                         ` Eli Zaretskii
  0 siblings, 2 replies; 685+ messages in thread
From: Gregory Heytings @ 2022-07-29  8:33 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: gerd.moellmann, 56682-done, larsi, monnier


>> Could you please tell me if it's ready to merge?
>
> Yes, I think it's ready, thanks for all your hard work on this.
>

Now done, and closing this bug.  I made a few further documentation 
changes, in particular "arbitrarily long" is important to me, factually 
correct, and correct English (see e.g. 
https://en.wikipedia.org/wiki/Arbitrarily_large ).





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-29  8:33                                                       ` Gregory Heytings
@ 2022-07-29 10:29                                                         ` Eli Zaretskii
  2022-07-29 10:44                                                           ` Gregory Heytings
       [not found]                                                           ` <19e5f0b3-c259-79f5-c31-469e8dfaf193@heytings.org>
  2022-07-29 13:27                                                         ` Eli Zaretskii
  1 sibling, 2 replies; 685+ messages in thread
From: Eli Zaretskii @ 2022-07-29 10:29 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: gerd.moellmann, 56682, larsi, monnier

> Date: Fri, 29 Jul 2022 08:33:38 +0000
> From: Gregory Heytings <gregory@heytings.org>
> cc: gerd.moellmann@gmail.com, 56682-done@debbugs.gnu.org, larsi@gnus.org, 
>     monnier@iro.umontreal.ca
> >> Could you please tell me if it's ready to merge?
> >
> > Yes, I think it's ready, thanks for all your hard work on this.
> >
> 
> Now done, and closing this bug.

Thanks.

> I made a few further documentation changes, in particular
> "arbitrarily long" is important to me, factually correct, and
> correct English (see e.g.
> https://en.wikipedia.org/wiki/Arbitrarily_large ).

Please always assume that I gave these aspects and your perspective
due consideration before making my changes, and please never revert
them without discussing first.

In this case, "arbitrarily large" contradicts the text that follows,
which describes the circumstances where that might not be true.  Other
minor changes are due to simple humility: we shouldn't boast
achievements that have yet to see serious real-world testing.

In any case, the final responsibility for what the documentation says
and how is Lars's and mine, as the current project maintainers.

Thanks again for all the efforts invested in these important
improvements.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-29 10:29                                                         ` Eli Zaretskii
@ 2022-07-29 10:44                                                           ` Gregory Heytings
  2022-07-29 10:53                                                             ` Eli Zaretskii
       [not found]                                                           ` <19e5f0b3-c259-79f5-c31-469e8dfaf193@heytings.org>
  1 sibling, 1 reply; 685+ messages in thread
From: Gregory Heytings @ 2022-07-29 10:44 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: gerd.moellmann, 56682, larsi, monnier


>
> Please always assume that I gave these aspects and your perspective due 
> consideration before making my changes, and please never revert them 
> without discussing first.
>

Okay, I'll keep that in mind in the future.

>
> In this case, "arbitrarily large" contradicts the text that follows, 
> which describes the circumstances where that might not be true.
>

I've carefully chosen the words of the title, and it doesn't contradict 
what follows, as far as I understand.  It says "Emacs is now capable of 
editing files with arbitrarily long lines", in which "capable" means that 
it can do it, but will not always do it.  The circumstances that are 
described in the text that follows tell the reader that the remaining 
cases in which Emacs would choke on such files are outside of Emacs' 
responsibility, they are the responsibility of major and minor mode 
writers.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
       [not found]                                                           ` <19e5f0b3-c259-79f5-c31-469e8dfaf193@heytings.org>
@ 2022-07-29 10:50                                                             ` Gregory Heytings
  2022-07-29 11:16                                                               ` Eli Zaretskii
  0 siblings, 1 reply; 685+ messages in thread
From: Gregory Heytings @ 2022-07-29 10:50 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: gerd.moellmann, 56682, larsi, monnier


>> In this case, "arbitrarily large" contradicts the text that follows, 
>> which describes the circumstances where that might not be true.
>
> I've carefully chosen the words of the title, and it doesn't contradict 
> what follows, as far as I understand.  It says "Emacs is now capable of 
> editing files with arbitrarily long lines", in which "capable" means 
> that it can do it, but will not always do it.  The circumstances that 
> are described in the text that follows tell the reader that the 
> remaining cases in which Emacs would choke on such files are outside of 
> Emacs' responsibility, they are the responsibility of major and minor 
> mode writers.
>

I see that you've already reverted.  Sigh.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-29 10:44                                                           ` Gregory Heytings
@ 2022-07-29 10:53                                                             ` Eli Zaretskii
  2022-07-29 11:03                                                               ` Gregory Heytings
  0 siblings, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-07-29 10:53 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: gerd.moellmann, 56682, larsi, monnier

> Date: Fri, 29 Jul 2022 10:44:27 +0000
> From: Gregory Heytings <gregory@heytings.org>
> cc: gerd.moellmann@gmail.com, 56682@debbugs.gnu.org, larsi@gnus.org, 
>     monnier@iro.umontreal.ca
> 
> > Please always assume that I gave these aspects and your perspective due 
> > consideration before making my changes, and please never revert them 
> > without discussing first.
> 
> Okay, I'll keep that in mind in the future.

Thank you.

> > In this case, "arbitrarily large" contradicts the text that follows, 
> > which describes the circumstances where that might not be true.
> 
> I've carefully chosen the words of the title, and it doesn't contradict 
> what follows, as far as I understand.  It says "Emacs is now capable of 
> editing files with arbitrarily long lines", in which "capable" means that 
> it can do it, but will not always do it.  The circumstances that are 
> described in the text that follows tell the reader that the remaining 
> cases in which Emacs would choke on such files are outside of Emacs' 
> responsibility, they are the responsibility of major and minor mode 
> writers.

The usual interpretation of "capable" in Emacs is that we do it unless
the user tells us not to.  Otherwise users will ask why not do it
whenever possible, definitely for a feature like this one.  So that is
the contradiction which I had in mind.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-29 10:53                                                             ` Eli Zaretskii
@ 2022-07-29 11:03                                                               ` Gregory Heytings
  0 siblings, 0 replies; 685+ messages in thread
From: Gregory Heytings @ 2022-07-29 11:03 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: gerd.moellmann, 56682, larsi, monnier


>
> The usual interpretation of "capable" in Emacs is that we do it unless 
> the user tells us not to.  Otherwise users will ask why not do it 
> whenever possible, definitely for a feature like this one.  So that is 
> the contradiction which I had in mind.
>

I understand.  Nonetheless, the OED tells me "capable: adj. 1 (capable of 
doing something) having the ability or quality necessary to do something."





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-29 10:50                                                             ` Gregory Heytings
@ 2022-07-29 11:16                                                               ` Eli Zaretskii
  2022-07-29 12:05                                                                 ` Gregory Heytings
  0 siblings, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-07-29 11:16 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: gerd.moellmann, 56682, larsi, monnier

> Date: Fri, 29 Jul 2022 10:50:02 +0000
> From: Gregory Heytings <gregory@heytings.org>
> cc: gerd.moellmann@gmail.com, 56682@debbugs.gnu.org, larsi@gnus.org, 
>     monnier@iro.umontreal.ca
> 
> 
> >> In this case, "arbitrarily large" contradicts the text that follows, 
> >> which describes the circumstances where that might not be true.
> >
> > I've carefully chosen the words of the title, and it doesn't contradict 
> > what follows, as far as I understand.  It says "Emacs is now capable of 
> > editing files with arbitrarily long lines", in which "capable" means 
> > that it can do it, but will not always do it.  The circumstances that 
> > are described in the text that follows tell the reader that the 
> > remaining cases in which Emacs would choke on such files are outside of 
> > Emacs' responsibility, they are the responsibility of major and minor 
> > mode writers.
> 
> I see that you've already reverted.  Sigh.

I didn't revert.  I've changed back only some parts of the changes you
made, and left others as you changed them.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-29 11:16                                                               ` Eli Zaretskii
@ 2022-07-29 12:05                                                                 ` Gregory Heytings
  2022-07-29 12:36                                                                   ` Eli Zaretskii
  0 siblings, 1 reply; 685+ messages in thread
From: Gregory Heytings @ 2022-07-29 12:05 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: gerd.moellmann, 56682, larsi, monnier


>>>> In this case, "arbitrarily large" contradicts the text that follows, 
>>>> which describes the circumstances where that might not be true.
>>>
>>> I've carefully chosen the words of the title, and it doesn't 
>>> contradict what follows, as far as I understand.  It says "Emacs is 
>>> now capable of editing files with arbitrarily long lines", in which 
>>> "capable" means that it can do it, but will not always do it.  The 
>>> circumstances that are described in the text that follows tell the 
>>> reader that the remaining cases in which Emacs would choke on such 
>>> files are outside of Emacs' responsibility, they are the 
>>> responsibility of major and minor mode writers.
>>
>> I see that you've already reverted.  Sigh.
>
> I didn't revert.  I've changed back only some parts of the changes you 
> made, and left others as you changed them.
>

You did revert the only change of which I said it was important to me, and 
without discussing it: the NEWS title "Emacs is now capable of editing 
files with arbitrarily long lines."  Which isn't boasting about an 
achievement, but an accurate statement.  Adding "unlike all other editors 
out there" would have been boasting about an achievement (but an accurate 
statement, too).





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-29 12:05                                                                 ` Gregory Heytings
@ 2022-07-29 12:36                                                                   ` Eli Zaretskii
  0 siblings, 0 replies; 685+ messages in thread
From: Eli Zaretskii @ 2022-07-29 12:36 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: gerd.moellmann, 56682, larsi, monnier

> Date: Fri, 29 Jul 2022 12:05:16 +0000
> From: Gregory Heytings <gregory@heytings.org>
> cc: gerd.moellmann@gmail.com, 56682@debbugs.gnu.org, larsi@gnus.org, 
>     monnier@iro.umontreal.ca
> 
> > I didn't revert.  I've changed back only some parts of the changes you 
> > made, and left others as you changed them.
> 
> You did revert the only change of which I said it was important to me

I understand that it's important to you, and understood that the first
time, but I cannot let our documentation say things that I'm unable to
defend in good faith.  When the dust settles and all is said and done,
it is only us the maintainers who are left to defend the decisions we
made as a project.  Please try to see this from our POV as well.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-29  8:33                                                       ` Gregory Heytings
  2022-07-29 10:29                                                         ` Eli Zaretskii
@ 2022-07-29 13:27                                                         ` Eli Zaretskii
  2022-07-29 13:58                                                           ` Eli Zaretskii
  2022-07-29 15:19                                                           ` Gregory Heytings
  1 sibling, 2 replies; 685+ messages in thread
From: Eli Zaretskii @ 2022-07-29 13:27 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: gerd.moellmann, 56682-done, larsi, monnier

> Date: Fri, 29 Jul 2022 08:33:38 +0000
> From: Gregory Heytings <gregory@heytings.org>
> cc: gerd.moellmann@gmail.com, 56682-done@debbugs.gnu.org, larsi@gnus.org, 
>     monnier@iro.umontreal.ca
> 
> Now done, and closing this bug.

Hmm...  I'm bothered by this code in handle_fontified_prop:

      if (it->narrowed_begv)
	Fnarrow_to_region (make_fixnum (it->narrowed_begv),
			   make_fixnum (it->narrowed_zv), Qt);

This narrows the buffer around window's point position (since this is
how narrowed_begv and narrowed_zv are computed), but the display
iterator can be called for position outside this range.  This is
unlikely to happen when the function is called as part of actual
redisplay of a window, but it can easily happen when the display code
is used by other primitives, for example vertical-motion or
pos-visible-in-window-p.  What happens then is that
fontification-functions are called with the argument POS that is
outside of the restriction, and that can cause errors.  (jit-lock
simply does nothing in that case, AFAICT.)

Is this intended?





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-29 13:27                                                         ` Eli Zaretskii
@ 2022-07-29 13:58                                                           ` Eli Zaretskii
  2022-07-29 15:35                                                             ` Gregory Heytings
  2022-07-29 15:19                                                           ` Gregory Heytings
  1 sibling, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-07-29 13:58 UTC (permalink / raw)
  To: gregory, gerd.moellmann; +Cc: 56682, larsi, monnier

> Cc: gerd.moellmann@gmail.com, 56682-done@debbugs.gnu.org, larsi@gnus.org,
>  monnier@iro.umontreal.ca
> Date: Fri, 29 Jul 2022 16:27:50 +0300
> From: Eli Zaretskii <eliz@gnu.org>
> 
> Hmm...  I'm bothered by this code in handle_fontified_prop:
> 
>       if (it->narrowed_begv)
> 	Fnarrow_to_region (make_fixnum (it->narrowed_begv),
> 			   make_fixnum (it->narrowed_zv), Qt);
> 

And another thing: the condition on it->narrowed_begv being non-zero
means that as long as we are close enough to the beginning of a
buffer, we don't restrict fontification-functions from going as far as
they want into the buffer.

So I think the condition should be the long_line_optimizations_p flag
of the buffer, and we should narrow the buffer even when we are at
BOB, to prevent fontification-functions from going too far.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-29 13:27                                                         ` Eli Zaretskii
  2022-07-29 13:58                                                           ` Eli Zaretskii
@ 2022-07-29 15:19                                                           ` Gregory Heytings
  2022-07-29 15:35                                                             ` Eli Zaretskii
  1 sibling, 1 reply; 685+ messages in thread
From: Gregory Heytings @ 2022-07-29 15:19 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: gerd.moellmann, 56682-done, larsi, monnier


>
> Hmm...  I'm bothered by this code in handle_fontified_prop:
>
> if (it->narrowed_begv)
>   Fnarrow_to_region (make_fixnum (it->narrowed_begv),
>                      make_fixnum (it->narrowed_zv), Qt);
>

Hmmm... that code has been on the branch for a week, and I didn't see 
particular bugs.  Which doesn't mean there are none, of course.

>
> This narrows the buffer around window's point position (since this is 
> how narrowed_begv and narrowed_zv are computed), but the display 
> iterator can be called for position outside this range. This is unlikely 
> to happen when the function is called as part of actual redisplay of a 
> window, but it can easily happen when the display code is used by other 
> primitives, for example vertical-motion or pos-visible-in-window-p. 
> What happens then is that fontification-functions are called with the 
> argument POS that is outside of the restriction, and that can cause 
> errors.  (jit-lock simply does nothing in that case, AFAICT.)
>
> Is this intended?
>

I'm not sure I understand how this could happen.  Can a non-visible part 
of the buffer be fontified by fontification-functions when for example 
pos-visible-in-window-p is called and eventually returns nil?  At least if 
I do (pos-visible-in-window-p (point-max)), they are not: 
handle_fontified_prop is not even called with it at point-max.  Even with 
(pos-visible-in-window-p (1+ (window-end))) fontification-functions are 
not called.

Should we perhaps be extra careful and add not apply the narrowing when 
IT_CHARPOS is not between narrowed_begv and narrowed_zv?





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-29 15:19                                                           ` Gregory Heytings
@ 2022-07-29 15:35                                                             ` Eli Zaretskii
  2022-07-29 16:37                                                               ` Gregory Heytings
  0 siblings, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-07-29 15:35 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: gerd.moellmann, 56682, larsi, monnier

> Date: Fri, 29 Jul 2022 15:19:49 +0000
> From: Gregory Heytings <gregory@heytings.org>
> cc: gerd.moellmann@gmail.com, 56682-done@debbugs.gnu.org, larsi@gnus.org, 
>     monnier@iro.umontreal.ca
> 
> > Hmm...  I'm bothered by this code in handle_fontified_prop:
> >
> > if (it->narrowed_begv)
> >   Fnarrow_to_region (make_fixnum (it->narrowed_begv),
> >                      make_fixnum (it->narrowed_zv), Qt);
> >
> 
> Hmmm... that code has been on the branch for a week, and I didn't see 
> particular bugs.  Which doesn't mean there are none, of course.

It depends on what kind of bugs we expect.  I've seen in a debugger
that fontification-functions are called with POS outside the narrowed
region.  But since jit-lock simply does nothing in that case, this is
silently ignored.

> > This narrows the buffer around window's point position (since this is 
> > how narrowed_begv and narrowed_zv are computed), but the display 
> > iterator can be called for position outside this range. This is unlikely 
> > to happen when the function is called as part of actual redisplay of a 
> > window, but it can easily happen when the display code is used by other 
> > primitives, for example vertical-motion or pos-visible-in-window-p. 
> > What happens then is that fontification-functions are called with the 
> > argument POS that is outside of the restriction, and that can cause 
> > errors.  (jit-lock simply does nothing in that case, AFAICT.)
> >
> > Is this intended?
> 
> I'm not sure I understand how this could happen.  Can a non-visible part 
> of the buffer be fontified by fontification-functions when for example 
> pos-visible-in-window-p is called and eventually returns nil?

Yes.  Whenever the display code is called, it fontifies the portions
of the buffer that it moves through.  And that is in general
justified: if we didn't fontify, we could produce wrong results from
pos-visible-in-window-p, due to faces that change the font height.

> At least if I do (pos-visible-in-window-p (point-max)), they are
> not: handle_fontified_prop is not even called with it at point-max.
> Even with (pos-visible-in-window-p (1+ (window-end)))
> fontification-functions are not called.

Try with vertical-motion.  Visit long-line.xml, go to position 20000,
and then do "C-u 200 C-n" or "M-: (vertical-motion 200) RET.  Sooner
or later you will see that it->current in handle_fontified_prop will
be outside of the narrowing.

> Should we perhaps be extra careful and add not apply the narrowing when 
> IT_CHARPOS is not between narrowed_begv and narrowed_zv?

I'd rather narrow around IT_CHARPOS in that case.  That would be also
consistent with what the doc string of fontification-functions now
says.

Perhaps we should also change what init_iterator does: if the start
position with which it's called is outside of the restriction,
recompute the restriction using the start point instead of the
window's point position.  WDYT?





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-29 13:58                                                           ` Eli Zaretskii
@ 2022-07-29 15:35                                                             ` Gregory Heytings
  0 siblings, 0 replies; 685+ messages in thread
From: Gregory Heytings @ 2022-07-29 15:35 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: gerd.moellmann, 56682, larsi, monnier


>
> And another thing: the condition on it->narrowed_begv being non-zero 
> means that as long as we are close enough to the beginning of a buffer, 
> we don't restrict fontification-functions from going as far as they want 
> into the buffer.
>
> So I think the condition should be the long_line_optimizations_p flag of 
> the buffer, and we should narrow the buffer even when we are at BOB, to 
> prevent fontification-functions from going too far.
>

That's correct, indeed, thanks.  Now fixed on master.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-29 15:35                                                             ` Eli Zaretskii
@ 2022-07-29 16:37                                                               ` Gregory Heytings
  2022-07-29 18:09                                                                 ` Eli Zaretskii
  0 siblings, 1 reply; 685+ messages in thread
From: Gregory Heytings @ 2022-07-29 16:37 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: gerd.moellmann, 56682, larsi, monnier


>> At least if I do (pos-visible-in-window-p (point-max)), they are not: 
>> handle_fontified_prop is not even called with it at point-max. Even 
>> with (pos-visible-in-window-p (1+ (window-end))) 
>> fontification-functions are not called.
>
> Try with vertical-motion.  Visit long-line.xml, go to position 20000, 
> and then do "C-u 200 C-n" or "M-: (vertical-motion 200) RET.  Sooner or 
> later you will see that it->current in handle_fontified_prop will be 
> outside of the narrowing.
>

Thanks, I was able to reproduce the bug with that recipe.

>> Should we perhaps be extra careful and add not apply the narrowing when 
>> IT_CHARPOS is not between narrowed_begv and narrowed_zv?
>
> I'd rather narrow around IT_CHARPOS in that case.  That would be also 
> consistent with what the doc string of fontification-functions now says.
>
> Perhaps we should also change what init_iterator does: if the start 
> position with which it's called is outside of the restriction, recompute 
> the restriction using the start point instead of the window's point 
> position.  WDYT?
>

Doing it in init_iterator is too early alas, with the above recipe at 
least init_iterator is called with charpos inside the narrowing bounds, 
after which the iterator moves outside the narrowing bounds.  So I fixed 
the bug in handle_fontified_prop.

I don't know yet if it's necessary to add another similar recomputation 
inside init_iterator.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-29 16:37                                                               ` Gregory Heytings
@ 2022-07-29 18:09                                                                 ` Eli Zaretskii
  2022-07-29 18:27                                                                   ` Gregory Heytings
  2022-07-29 20:02                                                                   ` Gregory Heytings
  0 siblings, 2 replies; 685+ messages in thread
From: Eli Zaretskii @ 2022-07-29 18:09 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: gerd.moellmann, 56682, larsi, monnier

> Date: Fri, 29 Jul 2022 16:37:14 +0000
> From: Gregory Heytings <gregory@heytings.org>
> cc: gerd.moellmann@gmail.com, 56682@debbugs.gnu.org, larsi@gnus.org, 
>     monnier@iro.umontreal.ca
> 
> 
> >> At least if I do (pos-visible-in-window-p (point-max)), they are not: 
> >> handle_fontified_prop is not even called with it at point-max. Even 
> >> with (pos-visible-in-window-p (1+ (window-end))) 
> >> fontification-functions are not called.
> >
> > Try with vertical-motion.  Visit long-line.xml, go to position 20000, 
> > and then do "C-u 200 C-n" or "M-: (vertical-motion 200) RET.  Sooner or 
> > later you will see that it->current in handle_fontified_prop will be 
> > outside of the narrowing.
> >
> 
> Thanks, I was able to reproduce the bug with that recipe.
> 
> >> Should we perhaps be extra careful and add not apply the narrowing when 
> >> IT_CHARPOS is not between narrowed_begv and narrowed_zv?
> >
> > I'd rather narrow around IT_CHARPOS in that case.  That would be also 
> > consistent with what the doc string of fontification-functions now says.
> >
> > Perhaps we should also change what init_iterator does: if the start 
> > position with which it's called is outside of the restriction, recompute 
> > the restriction using the start point instead of the window's point 
> > position.  WDYT?
> >
> 
> Doing it in init_iterator is too early alas, with the above recipe at 
> least init_iterator is called with charpos inside the narrowing bounds, 
> after which the iterator moves outside the narrowing bounds.  So I fixed 
> the bug in handle_fontified_prop.

Thanks.

> I don't know yet if it's necessary to add another similar recomputation 
> inside init_iterator.

I'll play with other callers of init_iterator and start_display, and
see if they can do similar things.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-29 18:09                                                                 ` Eli Zaretskii
@ 2022-07-29 18:27                                                                   ` Gregory Heytings
  2022-07-29 20:48                                                                     ` Gregory Heytings
  2022-07-29 20:02                                                                   ` Gregory Heytings
  1 sibling, 1 reply; 685+ messages in thread
From: Gregory Heytings @ 2022-07-29 18:27 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: gerd.moellmann, 56682, larsi, monnier


>> I don't know yet if it's necessary to add another similar recomputation 
>> inside init_iterator.
>
> I'll play with other callers of init_iterator and start_display, and see 
> if they can do similar things.
>

In case this helps, it is easy to enter the following conditional, for 
example with C-s, or with your previous M-g c 20000 and M-: 
(vertical-motion 200) RET recipe (in both steps).  It's not clear to me if 
updating the narrowing bounds there has an actual impact.  At least 
applying that change does not seem to have negative effects.

diff --git a/src/xdisp.c b/src/xdisp.c
index b1ee7889d4..e415320a52 100644
--- a/src/xdisp.c
+++ b/src/xdisp.c
@@ -3429,6 +3429,12 @@ init_iterator (struct it *it, struct window *w,
      {
        it->narrowed_begv = get_narrowed_begv (w, window_point (w));
        it->narrowed_zv = get_narrowed_zv (w, window_point (w));
+      if (charpos >= 0
+         && (charpos < it->narrowed_begv || charpos > it->narrowed_zv))
+       {
+         it->narrowed_begv = get_narrowed_begv (w, charpos);
+         it->narrowed_zv = get_narrowed_zv (w, charpos);
+       }
      }

    /* If a buffer position was specified, set the iterator there,





^ permalink raw reply related	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-29 18:09                                                                 ` Eli Zaretskii
  2022-07-29 18:27                                                                   ` Gregory Heytings
@ 2022-07-29 20:02                                                                   ` Gregory Heytings
  2022-07-30  9:05                                                                     ` Eli Zaretskii
  1 sibling, 1 reply; 685+ messages in thread
From: Gregory Heytings @ 2022-07-29 20:02 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: gerd.moellmann, 56682, larsi, monnier


>
> Doing it in init_iterator is too early alas, with the above recipe at 
> least init_iterator is called with charpos inside the narrowing bounds, 
> after which the iterator moves outside the narrowing bounds.  So I fixed 
> the bug in handle_fontified_prop.
>

Actually that doesn't work correctly.  A recipe:

emacs -Q
M-: (progn (set-frame-width nil 119) (set-frame-height nil 38)) RET
C-x C-f dictionary.json RET y
C-s aan SPC

Now you'll see that the last line at the bottom of the window, which does 
not contain "aan ", is highlighted.  Is the following okay from your point 
of view?

diff --git a/src/xdisp.c b/src/xdisp.c
index b1ee7889d4..8c62f088b8 100644
--- a/src/xdisp.c
+++ b/src/xdisp.c
@@ -4412,13 +4412,8 @@ handle_fontified_prop (struct it *it)
           ptrdiff_t begv = it->narrowed_begv ? it->narrowed_begv : BEGV;
           ptrdiff_t zv = it->narrowed_zv;
           ptrdiff_t charpos = IT_CHARPOS (*it);
-         if (charpos < begv || charpos > zv)
-           {
-             begv = get_narrowed_begv (it->w, charpos);
-             if (!begv) begv = BEGV;
-             zv = get_narrowed_zv (it->w, charpos);
-           }
-         Fnarrow_to_region (make_fixnum (begv), make_fixnum (zv), Qt);
+         if (begv <= charpos && charpos <= zv)
+           Fnarrow_to_region (make_fixnum (begv), make_fixnum (zv), Qt);
         }

        /* Don't allow Lisp that runs from 'fontification-functions'





^ permalink raw reply related	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-29 18:27                                                                   ` Gregory Heytings
@ 2022-07-29 20:48                                                                     ` Gregory Heytings
  0 siblings, 0 replies; 685+ messages in thread
From: Gregory Heytings @ 2022-07-29 20:48 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: gerd.moellmann, 56682, larsi, monnier


>
> At least applying that change does not seem to have negative effects.
>

Actually it does, with the same recipe:

emacs -Q
M-: (progn (set-frame-width nil 119) (set-frame-height nil 38)) RET
C-x C-f dictionary.json RET y
C-s aan SPC

So you can forget this patch.

>
> diff --git a/src/xdisp.c b/src/xdisp.c
> index b1ee7889d4..e415320a52 100644
> --- a/src/xdisp.c
> +++ b/src/xdisp.c
> @@ -3429,6 +3429,12 @@ init_iterator (struct it *it, struct window *w,
>     {
>       it->narrowed_begv = get_narrowed_begv (w, window_point (w));
>       it->narrowed_zv = get_narrowed_zv (w, window_point (w));
> +      if (charpos >= 0
> +         && (charpos < it->narrowed_begv || charpos > it->narrowed_zv))
> +       {
> +         it->narrowed_begv = get_narrowed_begv (w, charpos);
> +         it->narrowed_zv = get_narrowed_zv (w, charpos);
> +       }
>     }
>
>   /* If a buffer position was specified, set the iterator there,
>





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-27  6:44         ` Gregory Heytings
@ 2022-07-30  7:16           ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-07-30  8:12             ` Eli Zaretskii
  2022-07-30 13:17             ` Gregory Heytings
  0 siblings, 2 replies; 685+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2022-07-30  7:16 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, Eli Zaretskii

>> I'm not opposed to reducing the size of the text that's considered, but
>> doing it via narrowing is a blunt tool.
> It isn't.

There's no point arguing about it.  I find it to be and you don't and
that's that.  The reason why I find it to be is because it removes all
possibilities of making different choices for different elements
depending on the cost of those elements and the amount of
available information.

> The only way to make sure that the size of the text is small
> enough is a forced narrowing from which fontification-functions
> cannot escape.

It's clearly not the only way, nor is it an absolute guarantee.
I agree that it's a convenient way, tho.

> But let's try to be constructive.  You tell me that you're not opposed to
>  reducing the size of the text, and that font-lock.el could enforce
>  a smaller scope.  So could you please design a (Elisp) function (in
>  font-lock.el) which, given a (beg end) with beg <= end in a buffer, returns
>  a (beg' end') with beg <= beg' <= end' <= end that are better starting end
>  end points for the forced narrowing?  That function would be run in
>  handle_fontified_prop, before fontification-functions, and would have
> access to the whole buffer.

That can't be done.  What I think would be a better option is to
(somehow) pass the `beg..end` "limit" to jit-lock which can then pass it
on to its own clients (e.g. font-lock) so they each can make their
own choices.

E.g. the syntax-ppss part of the job performed by font-lock is heavily
cached, does not depends on lines, is theoretically always computed from
BOB but with a cache which makes it fast even when working near EOB (tho
it can still be somewhat slow when jumping from BOB to EOB, but that
depends on the size of the buffer, not the size of lines).  This part
*should* ignore your limits, which will make sure comments and strings are
recognized correctly at least in simple cases (i.e. cases which don't
depend on `syntax-propertize-function`).

>>> Think of it as POSIX's ulimits.
>> That's also a blunt tool.
> It isn't either.

Maybe we don't use the same meaning for "blunt".  What I mean is that
it's a tool whose effect cannot be fine-tuned for specific cases.
E.g. limiting the amount of memory used to store images, or the amount
of time spent in a particular operation, rather than applying those
limits to the whole process (even all its children as well).

> It's a practical way to limit what a single process can do

Yup, I use it too, but it's a one-size fits all.

Eli wrote:
> Feel free to suggest better ways of handling these issues, or even
> ways to solve this entirely inside font-lock.  If and when such
> suggestions materialize, I'm sure we will be glad to use them instead
> of less elegant/more direct solutions.

I'd suggest to keep things mostly as they are but move the decision to
ELisp: i.e. pass the beg..end limits to jit-lock and let jit-lock do
the narrowing.  This way it's easy to later refine the mechanism.


        Stefan






^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-30  7:16           ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2022-07-30  8:12             ` Eli Zaretskii
  2022-07-30 10:52               ` Gregory Heytings
  2022-07-30 13:17             ` Gregory Heytings
  1 sibling, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-07-30  8:12 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: 56682, gregory

> From: Stefan Monnier <monnier@iro.umontreal.ca>
> Cc: Eli Zaretskii <eliz@gnu.org>,  56682@debbugs.gnu.org
> Date: Sat, 30 Jul 2022 03:16:29 -0400
> 
> > Feel free to suggest better ways of handling these issues, or even
> > ways to solve this entirely inside font-lock.  If and when such
> > suggestions materialize, I'm sure we will be glad to use them instead
> > of less elegant/more direct solutions.
> 
> I'd suggest to keep things mostly as they are but move the decision to
> ELisp: i.e. pass the beg..end limits to jit-lock and let jit-lock do
> the narrowing.  This way it's easy to later refine the mechanism.

That's already happening: code called via fontification-functions can
access the restriction via point-min and point-max.  If you or someone
else can come up with efficient methods of using that information so
as not to go too far forward and back, we could consider removing the
lock from the narrowing.  But we'd need to see the code first and
assess the resulting performance with long lines.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-29 20:02                                                                   ` Gregory Heytings
@ 2022-07-30  9:05                                                                     ` Eli Zaretskii
  2022-07-30 11:34                                                                       ` Gregory Heytings
  0 siblings, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-07-30  9:05 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: gerd.moellmann, 56682, larsi, monnier

> Date: Fri, 29 Jul 2022 20:02:47 +0000
> From: Gregory Heytings <gregory@heytings.org>
> cc: gerd.moellmann@gmail.com, 56682@debbugs.gnu.org, larsi@gnus.org, 
>     monnier@iro.umontreal.ca
> 
> > Doing it in init_iterator is too early alas, with the above recipe at 
> > least init_iterator is called with charpos inside the narrowing bounds, 
> > after which the iterator moves outside the narrowing bounds.  So I fixed 
> > the bug in handle_fontified_prop.
> 
> Actually that doesn't work correctly.  A recipe:
> 
> emacs -Q
> M-: (progn (set-frame-width nil 119) (set-frame-height nil 38)) RET
> C-x C-f dictionary.json RET y
> C-s aan SPC
> 
> Now you'll see that the last line at the bottom of the window, which does 
> not contain "aan ", is highlighted.  Is the following okay from your point 
> of view?

I see the problem, but I don't understand how it could be related to
handle_fontified_prop.  The highlight in this case is the isearch
highlighting of matches, and those are shown via overlays, not via
face text properties, so AFAIK handle_fontified_prop doesn't handle
them.

Do you understand the relation of this to handle_fontified_prop?

The immediate reason for the wrong highlighting seems to be an overlay
whose end position is the match for "aan ", and whose start position
is much earlier in the buffer (about 600K characters earlier).  I
don't yet understand why and how this overlay comes into existence.
Hmm...





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-30  8:12             ` Eli Zaretskii
@ 2022-07-30 10:52               ` Gregory Heytings
  2022-07-30 10:59                 ` Eli Zaretskii
                                   ` (2 more replies)
  0 siblings, 3 replies; 685+ messages in thread
From: Gregory Heytings @ 2022-07-30 10:52 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, Stefan Monnier


>>> Feel free to suggest better ways of handling these issues, or even 
>>> ways to solve this entirely inside font-lock.  If and when such 
>>> suggestions materialize, I'm sure we will be glad to use them instead 
>>> of less elegant/more direct solutions.
>>
>> I'd suggest to keep things mostly as they are but move the decision to 
>> ELisp: i.e. pass the beg..end limits to jit-lock and let jit-lock do 
>> the narrowing.  This way it's easy to later refine the mechanism.
>
> That's already happening: code called via fontification-functions can 
> access the restriction via point-min and point-max.  If you or someone 
> else can come up with efficient methods of using that information so as 
> not to go too far forward and back, we could consider removing the lock 
> from the narrowing.  But we'd need to see the code first and assess the 
> resulting performance with long lines.
>

IIUC, what Stefan suggests is the following, which seems (almost) fine to 
me.  The only problem I see is that jit-lock-function is not the only user 
of fontication-functions.  It has at least two other users: in ELPA 
multi-mode.el sets fontification-functions to multi-fontify, and in MELPA 
poly-lock.el sets fontification-functions to poly-lock-function.

diff --git a/lisp/jit-lock.el b/lisp/jit-lock.el
index be26ca55f0..aa26b990bc 100644
--- a/lisp/jit-lock.el
+++ b/lisp/jit-lock.el
@@ -370,27 +370,36 @@ jit-lock-refontify

  ;;; On demand fontification.

+(defun jit-lock-function--internal (start)
+  "Internal function called by `jit-lock-function'."
+  (if (not (and jit-lock-defer-timer
+                (or (not (eq jit-lock-defer-time 0))
+                    (input-pending-p))))
+      ;; No deferral.
+      (jit-lock-fontify-now start (+ start jit-lock-chunk-size))
+    ;; Record the buffer for later fontification.
+    (unless (memq (current-buffer) jit-lock-defer-buffers)
+      (push (current-buffer) jit-lock-defer-buffers))
+    ;; Mark the area as defer-fontified so that the redisplay engine
+    ;; is happy and so that the idle timer can find the places to fontify.
+    (with-buffer-prepared-for-jit-lock
+     (put-text-property start
+			(next-single-property-change
+			 start 'fontified nil
+			 (min (point-max) (+ start jit-lock-chunk-size)))
+			'fontified 'defer))))
+
  (defun jit-lock-function (start)
    "Fontify current buffer starting at position START.
  This function is added to `fontification-functions' when `jit-lock-mode'
  is active."
    (when (and jit-lock-mode (not memory-full))
-    (if (not (and jit-lock-defer-timer
-                  (or (not (eq jit-lock-defer-time 0))
-                      (input-pending-p))))
-	;; No deferral.
-	(jit-lock-fontify-now start (+ start jit-lock-chunk-size))
-      ;; Record the buffer for later fontification.
-      (unless (memq (current-buffer) jit-lock-defer-buffers)
-	(push (current-buffer) jit-lock-defer-buffers))
-      ;; Mark the area as defer-fontified so that the redisplay engine
-      ;; is happy and so that the idle timer can find the places to fontify.
-      (with-buffer-prepared-for-jit-lock
-       (put-text-property start
-			  (next-single-property-change
-			   start 'fontified nil
-			   (min (point-max) (+ start jit-lock-chunk-size)))
-			  'fontified 'defer)))))
+    (if (not fontification-functions-restriction)
+        (jit-lock-function--internal start)
+      (narrow-to-region (car fontification-functions-restriction)
+                        (cdr fontification-functions-restriction)
+                        t)
+      (jit-lock-function--internal start))))

  (defun jit-lock--run-functions (beg end)
    (let ((tight-beg nil) (tight-end nil)
diff --git a/src/xdisp.c b/src/xdisp.c
index 0fdb1922e5..726e77b8eb 100644
--- a/src/xdisp.c
+++ b/src/xdisp.c
@@ -4412,9 +4412,9 @@ handle_fontified_prop (struct it *it)
  	  ptrdiff_t begv = it->narrowed_begv ? it->narrowed_begv : BEGV;
  	  ptrdiff_t zv = it->narrowed_zv;
  	  ptrdiff_t charpos = IT_CHARPOS (*it);
  	  if (begv <= charpos && charpos <= zv)
-	    Fnarrow_to_region (make_fixnum (begv), make_fixnum (zv), Qt);
+	    specbind (Qfontification_functions_restriction,
+		      Fcons (make_fixnum (begv), make_fixnum (zv)));
  	}

        /* Don't allow Lisp that runs from 'fontification-functions'
@@ -36673,6 +36673,13 @@ syms_of_xdisp (void)
    Vfontification_functions = Qnil;
    Fmake_variable_buffer_local (Qfontification_functions);

+  DEFSYM (Qfontification_functions_restriction,
+	  "fontification-functions-restriction");
+  DEFVAR_LISP ("fontification-functions-restriction",
+	       Vfontification_functions_restriction,
+	       doc: /* TODO  */);
+  Vfontification_functions_restriction = Qnil;
+
    DEFVAR_BOOL ("unibyte-display-via-language-environment",
                 unibyte_display_via_language_environment,
      doc: /* Non-nil means display unibyte text according to language environment.

By the way, while trying the above, it became clear that I forgot to 
properly handle the new optional argument to narrow-to-region in 
byte-compiled code.  But I don't know how to do that:

diff --git a/lisp/emacs-lisp/bytecomp.el b/lisp/emacs-lisp/bytecomp.el
index b4954eee9f..1ecd77f751 100644
--- a/lisp/emacs-lisp/bytecomp.el
+++ b/lisp/emacs-lisp/bytecomp.el
@@ -767,7 +767,7 @@ 121
  (byte-defop 122  0 byte-char-syntax)
  (byte-defop 123 -1 byte-buffer-substring)
  (byte-defop 124 -1 byte-delete-region)
-(byte-defop 125 -1 byte-narrow-to-region)
+(byte-defop 125 -2 byte-narrow-to-region)
  (byte-defop 126  1 byte-widen)
  (byte-defop 127  0 byte-end-of-line)

@@ -3833,7 +3833,7 @@ setcar
  (byte-defop-compiler setcdr            2)
  (byte-defop-compiler buffer-substring  2)
  (byte-defop-compiler delete-region     2)
-(byte-defop-compiler narrow-to-region  2)
+(byte-defop-compiler narrow-to-region  2-3)
  (byte-defop-compiler (% byte-rem)      2)
  (byte-defop-compiler aset              3)

is apparently not enough, because "2-3" seems to install an 
integer-or-marker-p check on the third argument, which raises a 
(wrong-type-argument integer-or-marker-p nil) or (wrong-type-argument 
integer-or-marker-p t) error when narrow-to-region is called from 
byte-compiled code.





^ permalink raw reply related	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-30 10:52               ` Gregory Heytings
@ 2022-07-30 10:59                 ` Eli Zaretskii
  2022-07-30 11:07                   ` Gregory Heytings
  2022-07-30 11:32                 ` Eli Zaretskii
  2022-07-31  7:25                 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2 siblings, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-07-30 10:59 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, monnier

> Date: Sat, 30 Jul 2022 10:52:48 +0000
> From: Gregory Heytings <gregory@heytings.org>
> cc: Stefan Monnier <monnier@iro.umontreal.ca>, 56682@debbugs.gnu.org
> 
> >> I'd suggest to keep things mostly as they are but move the decision to 
> >> ELisp: i.e. pass the beg..end limits to jit-lock and let jit-lock do 
> >> the narrowing.  This way it's easy to later refine the mechanism.
> >
> > That's already happening: code called via fontification-functions can 
> > access the restriction via point-min and point-max.  If you or someone 
> > else can come up with efficient methods of using that information so as 
> > not to go too far forward and back, we could consider removing the lock 
> > from the narrowing.  But we'd need to see the code first and assess the 
> > resulting performance with long lines.
> >
> 
> IIUC, what Stefan suggests is the following, which seems (almost) fine to 
> me.

I fail to see the difference, sorry.  Instead of doing the narrowing
from C we leave it to jit-lock, but tell it the limits to narrow to?
Or am I missing something?





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-30 10:59                 ` Eli Zaretskii
@ 2022-07-30 11:07                   ` Gregory Heytings
  0 siblings, 0 replies; 685+ messages in thread
From: Gregory Heytings @ 2022-07-30 11:07 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, monnier


>> IIUC, what Stefan suggests is the following, which seems (almost) fine 
>> to me.
>
> I fail to see the difference, sorry.  Instead of doing the narrowing 
> from C we leave it to jit-lock, but tell it the limits to narrow to? Or 
> am I missing something?
>

TBH, I don't see a real difference either.  Stefan says that "this way 
it's easy to later refine the mechanism", I guess because it is possible 
to "refine the mechanism" without recompiling Emacs.  But as I said the 
problem is that there are other users of fontification-functions besides 
jit-lock-function.

Could you (or Stefan) please have a look at the bytecomp.el problem I 
mentioned at the end of my previous post?





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-30 10:52               ` Gregory Heytings
  2022-07-30 10:59                 ` Eli Zaretskii
@ 2022-07-30 11:32                 ` Eli Zaretskii
  2022-07-30 11:36                   ` Gregory Heytings
  2022-07-31  7:25                 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2 siblings, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-07-30 11:32 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, monnier

> Date: Sat, 30 Jul 2022 10:52:48 +0000
> From: Gregory Heytings <gregory@heytings.org>
> cc: Stefan Monnier <monnier@iro.umontreal.ca>, 56682@debbugs.gnu.org
> 
> By the way, while trying the above, it became clear that I forgot to 
> properly handle the new optional argument to narrow-to-region in 
> byte-compiled code.  But I don't know how to do that:
> 
> diff --git a/lisp/emacs-lisp/bytecomp.el b/lisp/emacs-lisp/bytecomp.el
> index b4954eee9f..1ecd77f751 100644
> --- a/lisp/emacs-lisp/bytecomp.el
> +++ b/lisp/emacs-lisp/bytecomp.el
> @@ -767,7 +767,7 @@ 121
>   (byte-defop 122  0 byte-char-syntax)
>   (byte-defop 123 -1 byte-buffer-substring)
>   (byte-defop 124 -1 byte-delete-region)
> -(byte-defop 125 -1 byte-narrow-to-region)
> +(byte-defop 125 -2 byte-narrow-to-region)
>   (byte-defop 126  1 byte-widen)
>   (byte-defop 127  0 byte-end-of-line)
> 
> @@ -3833,7 +3833,7 @@ setcar
>   (byte-defop-compiler setcdr            2)
>   (byte-defop-compiler buffer-substring  2)
>   (byte-defop-compiler delete-region     2)
> -(byte-defop-compiler narrow-to-region  2)
> +(byte-defop-compiler narrow-to-region  2-3)
>   (byte-defop-compiler (% byte-rem)      2)
>   (byte-defop-compiler aset              3)
> 
> is apparently not enough, because "2-3" seems to install an 
> integer-or-marker-p check on the third argument, which raises a 
> (wrong-type-argument integer-or-marker-p nil) or (wrong-type-argument 
> integer-or-marker-p t) error when narrow-to-region is called from 
> byte-compiled code.

Where's the integer-or-marker-p test installed and/or called from?





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-30  9:05                                                                     ` Eli Zaretskii
@ 2022-07-30 11:34                                                                       ` Gregory Heytings
  2022-07-30 13:18                                                                         ` Eli Zaretskii
  0 siblings, 1 reply; 685+ messages in thread
From: Gregory Heytings @ 2022-07-30 11:34 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: gerd.moellmann, 56682, larsi, monnier


>> Actually that doesn't work correctly.  A recipe:
>>
>> emacs -Q
>> M-: (progn (set-frame-width nil 119) (set-frame-height nil 38)) RET
>> C-x C-f dictionary.json RET y
>> C-s aan SPC
>>
>> Now you'll see that the last line at the bottom of the window, which 
>> does not contain "aan ", is highlighted.  Is the following okay from 
>> your point of view?
>
> I see the problem, but I don't understand how it could be related to 
> handle_fontified_prop.  The highlight in this case is the isearch 
> highlighting of matches, and those are shown via overlays, not via face 
> text properties, so AFAIK handle_fontified_prop doesn't handle them.
>
> Do you understand the relation of this to handle_fontified_prop?
>

I cannot claim that fully understand what happens, but see below.  What I 
do know is that that problem wasn't present before 9c12c3b7c5, and that it 
disappears with:

diff --git a/src/xdisp.c b/src/xdisp.c
index b1ee7889d4..8c62f088b8 100644
--- a/src/xdisp.c
+++ b/src/xdisp.c
@@ -4412,13 +4412,8 @@ handle_fontified_prop (struct it *it)
           ptrdiff_t begv = it->narrowed_begv ? it->narrowed_begv : BEGV;
           ptrdiff_t zv = it->narrowed_zv;
           ptrdiff_t charpos = IT_CHARPOS (*it);
-         if (charpos < begv || charpos > zv)
-           {
-             begv = get_narrowed_begv (it->w, charpos);
-             if (!begv) begv = BEGV;
-             zv = get_narrowed_zv (it->w, charpos);
-           }
-         Fnarrow_to_region (make_fixnum (begv), make_fixnum (zv), Qt);
+         if (begv <= charpos && charpos <= zv)
+           Fnarrow_to_region (make_fixnum (begv), make_fixnum (zv), Qt);
         }

As far as I understand, what happens is this:

C-s aan SPC RET positions point at 730072.  When typing C-s aan SPC in a 
not yet fontified buffer, it->narrowed_begv and it->narrowed_zv are 
correctly positioned around that position, at 706860 and 732564 
respectively.  But the iterator is late, and is still at the position at 
which it was after C-s aan (without SPC); the first occurrence of "aan" is 
at 152274, the corresponding narrowing bounds are 128520 and 154224, which 
means that it has stopped at 154224.  So if we "reseat" the narrowing for 
fontification-functions around the position 154224 of the iterator, the 
narrowing becomes 141372-167076, which is well before the position of "aan 
", namely 730072.  At that point, isearch has found a match, and puts the 
match overlay at 167076 (the last possible position of the narrowed 
portion) and beyond, instead of putting it at 730072.

In short, it seems to me that using the position of the iterator is a too 
fragile solution, and that it is better to not apply a narrowing when the 
iterator is outside of the narrowing bounds.





^ permalink raw reply related	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-30 11:32                 ` Eli Zaretskii
@ 2022-07-30 11:36                   ` Gregory Heytings
  2022-07-30 12:05                     ` Gregory Heytings
  0 siblings, 1 reply; 685+ messages in thread
From: Gregory Heytings @ 2022-07-30 11:36 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, monnier


>> is apparently not enough, because "2-3" seems to install an 
>> integer-or-marker-p check on the third argument, which raises a 
>> (wrong-type-argument integer-or-marker-p nil) or (wrong-type-argument 
>> integer-or-marker-p t) error when narrow-to-region is called from 
>> byte-compiled code.
>
> Where's the integer-or-marker-p test installed and/or called from?
>

It is called when narrow-to-region, which has its own opcode, is called 
from byte-compiled code.  But I have no idea where it is installed.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-30 11:36                   ` Gregory Heytings
@ 2022-07-30 12:05                     ` Gregory Heytings
  0 siblings, 0 replies; 685+ messages in thread
From: Gregory Heytings @ 2022-07-30 12:05 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, monnier


>>> is apparently not enough, because "2-3" seems to install an 
>>> integer-or-marker-p check on the third argument, which raises a 
>>> (wrong-type-argument integer-or-marker-p nil) or (wrong-type-argument 
>>> integer-or-marker-p t) error when narrow-to-region is called from 
>>> byte-compiled code.
>> 
>> Where's the integer-or-marker-p test installed and/or called from?
>
> It is called when narrow-to-region, which has its own opcode, is called 
> from byte-compiled code.  But I have no idea where it is installed.
>

Got it, fixed on master.  make bootstrap is probably necessary.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-30  7:16           ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-07-30  8:12             ` Eli Zaretskii
@ 2022-07-30 13:17             ` Gregory Heytings
  1 sibling, 0 replies; 685+ messages in thread
From: Gregory Heytings @ 2022-07-30 13:17 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: 56682, Eli Zaretskii


>>> I'm not opposed to reducing the size of the text that's considered, but
>>> doing it via narrowing is a blunt tool.
>>
>> It isn't.
>
> There's no point arguing about it.  I find it to be and you don't and 
> that's that.
>

Actually, with your explanation below that "blunt" means for you "cannot 
be fine-tuned", I agree with you.

>
> The reason why I find it to be is because it removes all possibilities 
> of making different choices for different elements depending on the cost 
> of those elements and the amount of available information.
>

With that I also agree.  It would be better to have a refined decision 
method, but at the moment it doesn't exist.

>
> What I think would be a better option is to (somehow) pass the 
> `beg..end` "limit" to jit-lock which can then pass it on to its own 
> clients (e.g. font-lock) so they each can make their own choices.
>

I sent a patch a few hours ago in this thread.

The limit of what you suggest is that its effect would depend on the 
goodwill of major and minor mode authors, which could decide to ignore 
these beg..end recommendations altogether.  Whereas the point of that 
feature is more or less to protect Emacs users from major and minor modes, 
to make sure that Emacs remains responsive when the buffer contains long 
lines.

Also, there are other users of fontification-functions besides 
jit-lock-function.

(And for some reason the patch I sent does not give the results I would 
have expected, font-locking is still too slow, but it's perhaps a bug in 
the patch.)

>
> E.g. the syntax-ppss part of the job performed by font-lock is heavily 
> cached, does not depends on lines, is theoretically always computed from 
> BOB but with a cache which makes it fast even when working near EOB (tho 
> it can still be somewhat slow when jumping from BOB to EOB, but that 
> depends on the size of the buffer, not the size of lines).  This part 
> *should* ignore your limits, which will make sure comments and strings 
> are recognized correctly at least in simple cases (i.e. cases which 
> don't depend on `syntax-propertize-function`).
>

I see.  Do you see a way to somehow extract the syntax-ppss part out of 
font-lock?  Would that be feasible?

And another question: can syntax-ppss not be used to determine a "good 
starting position" for the narrowing, outside of any comments or strings 
(if possible)?





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-30 11:34                                                                       ` Gregory Heytings
@ 2022-07-30 13:18                                                                         ` Eli Zaretskii
  2022-07-30 13:31                                                                           ` Gregory Heytings
  0 siblings, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-07-30 13:18 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: gerd.moellmann, 56682, larsi, monnier

> Date: Sat, 30 Jul 2022 11:34:03 +0000
> From: Gregory Heytings <gregory@heytings.org>
> cc: gerd.moellmann@gmail.com, 56682@debbugs.gnu.org, larsi@gnus.org, 
>     monnier@iro.umontreal.ca
> 
> C-s aan SPC RET positions point at 730072.  When typing C-s aan SPC in a 
> not yet fontified buffer, it->narrowed_begv and it->narrowed_zv are 
> correctly positioned around that position, at 706860 and 732564 
> respectively.  But the iterator is late, and is still at the position at 
> which it was after C-s aan (without SPC); the first occurrence of "aan" is 
> at 152274, the corresponding narrowing bounds are 128520 and 154224, which 
> means that it has stopped at 154224.  So if we "reseat" the narrowing for 
> fontification-functions around the position 154224 of the iterator, the 
> narrowing becomes 141372-167076, which is well before the position of "aan 
> ", namely 730072.  At that point, isearch has found a match, and puts the 
> match overlay at 167076 (the last possible position of the narrowed 
> portion) and beyond, instead of putting it at 730072.

What I see is that isearch puts the match overlay on text that starts
at 167076 and ends at 730068 (the latter is the beginning of the
match), instead of on text between 730068 and 730072.

> In short, it seems to me that using the position of the iterator is a too 
> fragile solution, and that it is better to not apply a narrowing when the 
> iterator is outside of the narrowing bounds.

But this means we give up on the narrowing, which means the display
could be very slow.

And I've found the culprit: we weren't restoring point after lifting
the locked narrowing.  narrow-to-region can move point if the new
restriction puts point outside of the region.  So what was happening
is that isearch-update was calling pos-visible-in-window-group-p to
see whether the match is visible, and that call would move point from
under the feet of isearch-update, because pos-visible-in-window-p
calls display routines.  So any subsequent uses of point would use a
completely wrong value of point.

I've now made narrow-to-region preserve point across locked narrowing,
and the problem went away.

Ugh! this one was a bitch to debug!





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-30 13:18                                                                         ` Eli Zaretskii
@ 2022-07-30 13:31                                                                           ` Gregory Heytings
  2022-07-30 15:23                                                                             ` Eli Zaretskii
  0 siblings, 1 reply; 685+ messages in thread
From: Gregory Heytings @ 2022-07-30 13:31 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: gerd.moellmann, 56682, larsi, monnier

[-- Attachment #1: Type: text/plain, Size: 1440 bytes --]


>
> And I've found the culprit: we weren't restoring point after lifting the 
> locked narrowing.  narrow-to-region can move point if the new 
> restriction puts point outside of the region.  So what was happening is 
> that isearch-update was calling pos-visible-in-window-group-p to see 
> whether the match is visible, and that call would move point from under 
> the feet of isearch-update, because pos-visible-in-window-p calls 
> display routines.  So any subsequent uses of point would use a 
> completely wrong value of point.
>
> I've now made narrow-to-region preserve point across locked narrowing, 
> and the problem went away.
>
> Ugh! this one was a bitch to debug!
>

😉  Thanks, that's even better!

So the only remaining question is whether it is necessary to recompute 
narrowed_begv and narrowed_zv in init_iterator:

diff --git a/src/xdisp.c b/src/xdisp.c
index b1ee7889d4..e415320a52 100644
--- a/src/xdisp.c
+++ b/src/xdisp.c
@@ -3429,6 +3429,12 @@ init_iterator (struct it *it, struct window *w,
     {
       it->narrowed_begv = get_narrowed_begv (w, window_point (w));
       it->narrowed_zv = get_narrowed_zv (w, window_point (w));
+      if (charpos >= 0
+         && (charpos < it->narrowed_begv || charpos > it->narrowed_zv))
+       {
+         it->narrowed_begv = get_narrowed_begv (w, charpos);
+         it->narrowed_zv = get_narrowed_zv (w, charpos);
+       }
     }

^ permalink raw reply related	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-30 13:31                                                                           ` Gregory Heytings
@ 2022-07-30 15:23                                                                             ` Eli Zaretskii
  2022-07-30 18:13                                                                               ` Gregory Heytings
  2022-07-31  7:11                                                                               ` Eli Zaretskii
  0 siblings, 2 replies; 685+ messages in thread
From: Eli Zaretskii @ 2022-07-30 15:23 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: gerd.moellmann, 56682, larsi, monnier

> Date: Sat, 30 Jul 2022 13:31:42 +0000
> From: Gregory Heytings <gregory@heytings.org>
> cc: gerd.moellmann@gmail.com, 56682@debbugs.gnu.org, larsi@gnus.org, 
>     monnier@iro.umontreal.ca
> 
> So the only remaining question is whether it is necessary to recompute 
> narrowed_begv and narrowed_zv in init_iterator:

I tend to think we should, but let me think about this some more.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-30 15:23                                                                             ` Eli Zaretskii
@ 2022-07-30 18:13                                                                               ` Gregory Heytings
  2022-07-30 18:34                                                                                 ` Eli Zaretskii
  2022-07-31  7:11                                                                               ` Eli Zaretskii
  1 sibling, 1 reply; 685+ messages in thread
From: Gregory Heytings @ 2022-07-30 18:13 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: gerd.moellmann, 56682, larsi, monnier


>> So the only remaining question is whether it is necessary to recompute 
>> narrowed_begv and narrowed_zv in init_iterator:
>
> I tend to think we should, but let me think about this some more.
>

Okay, I'll wait for your feedback.

Wouldn't it make sense to also limit the portion of the buffer to which 
pre-/post-command-hook have access (see below)?

With that patch, I was able to open and edit a file with a single 50 GB 
(!) line, in js-mode.  Does that still not qualify as "arbitrarily large"?

I compared that with a 50 GB JSON file with 80 character wide lines. 
With that file it was necessary to disable font-lock-mode, which took too 
much time.  Apart from that, I did not see any significant performance 
differences while editing the file, compared to the single line one.

diff --git a/src/keyboard.c b/src/keyboard.c
index 2863058d63..ce529222a3 100644
--- a/src/keyboard.c
+++ b/src/keyboard.c
@@ -1461,7 +1461,22 @@ command_loop_1 (void)
        }
        Vthis_command = cmd;
        Vreal_this_command = cmd;
-      safe_run_hooks (Qpre_command_hook);
+
+      if (current_buffer->long_line_optimizations_p)
+	{
+	  specpdl_ref count = SPECPDL_INDEX ();
+	  struct window *w = XWINDOW (selected_window);
+	  ptrdiff_t begv = get_narrowed_begv (w, PT);
+	  ptrdiff_t zv = get_narrowed_zv (w, PT);
+	  if (!begv) begv = BEGV;
+	  Fnarrow_to_region (make_fixnum (begv), make_fixnum (zv), Qt);
+	  safe_run_hooks (Qpre_command_hook);
+	  unbind_to (count, Qnil);
+	}
+      else
+	{
+	  safe_run_hooks (Qpre_command_hook);
+	}

        already_adjusted = 0;

@@ -1513,7 +1528,21 @@ command_loop_1 (void)
            }
        kset_last_prefix_arg (current_kboard, Vcurrent_prefix_arg);

-      safe_run_hooks (Qpost_command_hook);
+      if (current_buffer->long_line_optimizations_p)
+	{
+	  specpdl_ref count = SPECPDL_INDEX ();
+	  struct window *w = XWINDOW (selected_window);
+	  ptrdiff_t begv = get_narrowed_begv (w, PT);
+	  ptrdiff_t zv = get_narrowed_zv (w, PT);
+	  if (!begv) begv = BEGV;
+	  Fnarrow_to_region (make_fixnum (begv), make_fixnum (zv), Qt);
+	  safe_run_hooks (Qpost_command_hook);
+	  unbind_to (count, Qnil);
+	}
+      else
+	{
+	  safe_run_hooks (Qpost_command_hook);
+	}

        /* If displaying a message, resize the echo area window to fit
  	 that message's size exactly.  Do this only if the echo area





^ permalink raw reply related	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-30 18:13                                                                               ` Gregory Heytings
@ 2022-07-30 18:34                                                                                 ` Eli Zaretskii
  2022-07-30 18:47                                                                                   ` Gregory Heytings
  0 siblings, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-07-30 18:34 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: gerd.moellmann, 56682, larsi, monnier

> Date: Sat, 30 Jul 2022 18:13:18 +0000
> From: Gregory Heytings <gregory@heytings.org>
> cc: gerd.moellmann@gmail.com, 56682@debbugs.gnu.org, larsi@gnus.org, 
>     monnier@iro.umontreal.ca
> 
> Wouldn't it make sense to also limit the portion of the buffer to which 
> pre-/post-command-hook have access (see below)?

Those generally don't belong to the display department, so I'd
hesitate doing so.  Which pre-/post-command-hook functions did you
find that cause slowdown because of long lines.

Before considering these hooks, I'd consider window-scroll-functions
and window-*-change-functions, which _are_ run by redisplay.

> With that patch, I was able to open and edit a file with a single 50 GB 
> (!) line, in js-mode.  Does that still not qualify as "arbitrarily large"?

We don't even claim to be able to edit _files_ of arbitrary size
(because we are limited by fixnums).

> I compared that with a 50 GB JSON file with 80 character wide lines. 
> With that file it was necessary to disable font-lock-mode, which took too 
> much time.

How so?  We now restrict font-lock to a small region, so why does it
matter how much more stuff is there outside of the viewport?  What
other aspects of the line size still affect performance?





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-30 18:34                                                                                 ` Eli Zaretskii
@ 2022-07-30 18:47                                                                                   ` Gregory Heytings
  2022-07-30 19:02                                                                                     ` Eli Zaretskii
  0 siblings, 1 reply; 685+ messages in thread
From: Gregory Heytings @ 2022-07-30 18:47 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: gerd.moellmann, 56682, larsi, monnier


>> Wouldn't it make sense to also limit the portion of the buffer to which 
>> pre-/post-command-hook have access (see below)?
>
> Those generally don't belong to the display department, so I'd hesitate 
> doing so.  Which pre-/post-command-hook functions did you find that 
> cause slowdown because of long lines.
>

jit-lock--antiblink-post-command

>> With that patch, I was able to open and edit a file with a single 50 GB 
>> (!) line, in js-mode.  Does that still not qualify as "arbitrarily 
>> large"?
>
> We don't even claim to be able to edit _files_ of arbitrary size 
> (because we are limited by fixnums).
>

That's theory, isn't it?  With 64-bit builds we are limited to files that 
are less than 2047 Po.  No computer on this planet has that much RAM.

>> I compared that with a 50 GB JSON file with 80 character wide lines. 
>> With that file it was necessary to disable font-lock-mode, which took 
>> too much time.
>
> How so?  We now restrict font-lock to a small region, so why does it 
> matter how much more stuff is there outside of the viewport?  What other 
> aspects of the line size still affect performance?
>

We do not restrict font-lock in large files _without long lines_, hence 
the difference.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-30 18:47                                                                                   ` Gregory Heytings
@ 2022-07-30 19:02                                                                                     ` Eli Zaretskii
  2022-07-30 19:11                                                                                       ` Gregory Heytings
  0 siblings, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-07-30 19:02 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: gerd.moellmann, 56682, larsi, monnier

> Date: Sat, 30 Jul 2022 18:47:04 +0000
> From: Gregory Heytings <gregory@heytings.org>
> cc: gerd.moellmann@gmail.com, 56682@debbugs.gnu.org, larsi@gnus.org, 
>     monnier@iro.umontreal.ca
> 
> >> Wouldn't it make sense to also limit the portion of the buffer to which 
> >> pre-/post-command-hook have access (see below)?
> >
> > Those generally don't belong to the display department, so I'd hesitate 
> > doing so.  Which pre-/post-command-hook functions did you find that 
> > cause slowdown because of long lines.
> 
> jit-lock--antiblink-post-command

OK, but is it TRT to "punish" every one of these hooks for the
"crimes" of the few?  Maybe we should instead handle the problematic
ones locally, by exposing the long_line_optimizations_p flag to Lisp
(through an accessor), and then modifying those that misbehave to
"behave"?

> >> With that patch, I was able to open and edit a file with a single 50 GB 
> >> (!) line, in js-mode.  Does that still not qualify as "arbitrarily 
> >> large"?
> >
> > We don't even claim to be able to edit _files_ of arbitrary size 
> > (because we are limited by fixnums).
> 
> That's theory, isn't it?  With 64-bit builds we are limited to files that 
> are less than 2047 Po.  No computer on this planet has that much RAM.

You forget that we are talking about VM.

But let's not restart that argument, okay?

> >> I compared that with a 50 GB JSON file with 80 character wide lines. 
> >> With that file it was necessary to disable font-lock-mode, which took 
> >> too much time.
> >
> > How so?  We now restrict font-lock to a small region, so why does it 
> > matter how much more stuff is there outside of the viewport?  What other 
> > aspects of the line size still affect performance?
> >
> 
> We do not restrict font-lock in large files _without long lines_, hence 
> the difference.

Sorry, I thought you were talking about a single-line file.

If JS mode wants to access the entire buffer for fontifications, then
IMO the problem is in JS mode, and should be fixed there.
narrow-to-region is available to Lisp programs as well ;-)

IOW, it isn't an infrastructure problem that needs to be fixed in
display code.  (It is even possible that tree-sitter integration will
fix this, or at least alleviate it, as a side effect.)





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-30 19:02                                                                                     ` Eli Zaretskii
@ 2022-07-30 19:11                                                                                       ` Gregory Heytings
  2022-07-31  6:16                                                                                         ` Eli Zaretskii
  0 siblings, 1 reply; 685+ messages in thread
From: Gregory Heytings @ 2022-07-30 19:11 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: gerd.moellmann, 56682, larsi, monnier

[-- Attachment #1: Type: text/plain, Size: 1856 bytes --]


>>>> Wouldn't it make sense to also limit the portion of the buffer to 
>>>> which pre-/post-command-hook have access (see below)?
>>>
>>> Those generally don't belong to the display department, so I'd 
>>> hesitate doing so.  Which pre-/post-command-hook functions did you 
>>> find that cause slowdown because of long lines.
>>
>> jit-lock--antiblink-post-command
>
> OK, but is it TRT to "punish" every one of these hooks for the "crimes" 
> of the few?  Maybe we should instead handle the problematic ones 
> locally, by exposing the long_line_optimizations_p flag to Lisp (through 
> an accessor), and then modifying those that misbehave to "behave"?
>

It's the same problem than with fontification-functions.  We cannot know 
what all these hooks that are installed by major and minor modes will do, 
we cannot hope to fix them one by one, so it seems to me that with 
long_line_optimizations_p, which is an unusual case anyway, it makes sense 
to "punish" them all in the same way.

>> That's theory, isn't it?  With 64-bit builds we are limited to files 
>> that are less than 2047 Po.  No computer on this planet has that much 
>> RAM.
>
> You forget that we are talking about VM.
>
> But let's not restart that argument, okay?
>

Hmmm... okay 😉

>
> If JS mode wants to access the entire buffer for fontifications, then 
> IMO the problem is in JS mode, and should be fixed there. 
> narrow-to-region is available to Lisp programs as well ;-)
>
> IOW, it isn't an infrastructure problem that needs to be fixed in 
> display code.  (It is even possible that tree-sitter integration will 
> fix this, or at least alleviate it, as a side effect.)
>

Agreed.  My point was only that Emacs now behaves a bit better when 
editing a single-line very large file compared to a multi-line very large 
file.

^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-30 19:11                                                                                       ` Gregory Heytings
@ 2022-07-31  6:16                                                                                         ` Eli Zaretskii
  2022-07-31  8:22                                                                                           ` Lars Ingebrigtsen
  2022-07-31  8:30                                                                                           ` Gregory Heytings
  0 siblings, 2 replies; 685+ messages in thread
From: Eli Zaretskii @ 2022-07-31  6:16 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: gerd.moellmann, 56682, larsi, monnier

> Date: Sat, 30 Jul 2022 19:11:57 +0000
> From: Gregory Heytings <gregory@heytings.org>
> cc: gerd.moellmann@gmail.com, 56682@debbugs.gnu.org, larsi@gnus.org, 
>     monnier@iro.umontreal.ca
> 
> >> jit-lock--antiblink-post-command
> >
> > OK, but is it TRT to "punish" every one of these hooks for the "crimes" 
> > of the few?  Maybe we should instead handle the problematic ones 
> > locally, by exposing the long_line_optimizations_p flag to Lisp (through 
> > an accessor), and then modifying those that misbehave to "behave"?
> 
> It's the same problem than with fontification-functions.  We cannot know 
> what all these hooks that are installed by major and minor modes will do, 
> we cannot hope to fix them one by one, so it seems to me that with 
> long_line_optimizations_p, which is an unusual case anyway, it makes sense 
> to "punish" them all in the same way.

It sounds...too drastic.  Lars, WDYT?

I don't find it problematic to have to fix any such hooks in the core
that we discover as misbehaving with long lines.  How many of those
could we have?  And those in 3rd party packages can follow suit if
they want (and if the respective modes are relevant to files with long
lines, I expect to see pressure on their developers to do so).

Once again, IME it is impossible to fix such problems only in
low-level C infrastructure.  There will always be left-overs and
fallouts that should be fixed locally in Lisp where they happen.
There's no problem here, and I don't expect us to be able to fix
everything by a small number of quick fixes, and declare a victory
once and for all.

> Agreed.  My point was only that Emacs now behaves a bit better when 
> editing a single-line very large file compared to a multi-line very large 
> file.

Well, WDYT about a similar feature for very large files?  IOW, when
the buffer's size is above some threshold, turn on the
long_line_optimizations_p flag (which should perhaps be renamed to
better reflect its purpose) even if no long lines are seen?





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-30 15:23                                                                             ` Eli Zaretskii
  2022-07-30 18:13                                                                               ` Gregory Heytings
@ 2022-07-31  7:11                                                                               ` Eli Zaretskii
  2022-07-31 22:54                                                                                 ` Gregory Heytings
  1 sibling, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-07-31  7:11 UTC (permalink / raw)
  To: gregory, gerd.moellmann; +Cc: 56682, larsi, monnier

> Cc: gerd.moellmann@gmail.com, 56682@debbugs.gnu.org, larsi@gnus.org,
>  monnier@iro.umontreal.ca
> Date: Sat, 30 Jul 2022 18:23:12 +0300
> From: Eli Zaretskii <eliz@gnu.org>
> 
> > Date: Sat, 30 Jul 2022 13:31:42 +0000
> > From: Gregory Heytings <gregory@heytings.org>
> > cc: gerd.moellmann@gmail.com, 56682@debbugs.gnu.org, larsi@gnus.org, 
> >     monnier@iro.umontreal.ca
> > 
> > So the only remaining question is whether it is necessary to recompute 
> > narrowed_begv and narrowed_zv in init_iterator:
> 
> I tend to think we should, but let me think about this some more.

Here are my thoughts.

First, I think the setting of narrowed_begv and narrowed_zv should be
done in 'reseat', not in init_iterator.  The latter always calls the
former when invoked to start iteration of buffer text, but we also
call 'reseat' from other places, when we "jump" the iterator to a new
place, potentially far from the last.  If nothing else, this should
help with truncate-lines, where using window_point is basically right
only for the point's line.  And currently, init_iterator computes and
sets the narrowing even when we iterate on strings, which is unneeded
and incorrect.

Whether always to correct narrowed_begv and narrowed_zv if we are
reseating to a position outside the narrowing, is a more complicated
question.  The basic problem here is that we don't have an easy way of
restoring the previous narrowing (except by unwind_protect), and the
display code sometimes calls init_iterator or start_display using the
iterator that already has these members set by previous code, a
situation which we currently cannot easily detect.  However, when this
code runs as part of redisplay, we generally don't expect the original
narrowing to be insufficient, except perhaps in the truncate-line
case.

So I think we should correct narrowed_begv and narrowed_zv only if
either the 'redisplaying_p' flag is reset (meaning the display code is
being invoked outside of redisplay) or it->line_wrap == TRUNCATE.

Comments? thoughts?





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-30 10:52               ` Gregory Heytings
  2022-07-30 10:59                 ` Eli Zaretskii
  2022-07-30 11:32                 ` Eli Zaretskii
@ 2022-07-31  7:25                 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-07-31  7:48                   ` Eli Zaretskii
  2022-07-31  8:08                   ` Gregory Heytings
  2 siblings, 2 replies; 685+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2022-07-31  7:25 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, Eli Zaretskii

> IIUC, what Stefan suggests is the following, which seems (almost) fine to
> me.  The only problem I see is that jit-lock-function is not the only user
> of fontication-functions.  It has at least two other users: in ELPA
> multi-mode.el sets fontification-functions to multi-fontify, and in MELPA
> poly-lock.el sets fontification-functions to poly-lock-function.

Good point.

> @@ -4412,9 +4412,9 @@ handle_fontified_prop (struct it *it)
>  	  ptrdiff_t begv = it->narrowed_begv ? it->narrowed_begv : BEGV;
>  	  ptrdiff_t zv = it->narrowed_zv;
>  	  ptrdiff_t charpos = IT_CHARPOS (*it);
>  	  if (begv <= charpos && charpos <= zv)
> -	    Fnarrow_to_region (make_fixnum (begv), make_fixnum (zv), Qt);
> +	    specbind (Qfontification_functions_restriction,
> +		      Fcons (make_fixnum (begv), make_fixnum (zv)));
>  	}

Hpw 'bout we do the reverse then: set the narrowing, but let-bind
a variable to indicate that we're inside a line-length-induced
narrowing, together with the previous narrowing bounds, so jit-lock or
its clients can undo the narrowing when needed?


        Stefan






^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-31  7:25                 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2022-07-31  7:48                   ` Eli Zaretskii
  2022-07-31  8:08                   ` Gregory Heytings
  1 sibling, 0 replies; 685+ messages in thread
From: Eli Zaretskii @ 2022-07-31  7:48 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: 56682, gregory

> From: Stefan Monnier <monnier@iro.umontreal.ca>
> Cc: Eli Zaretskii <eliz@gnu.org>,  56682@debbugs.gnu.org
> Date: Sun, 31 Jul 2022 03:25:46 -0400
> 
> How 'bout we do the reverse then: set the narrowing, but let-bind
> a variable to indicate that we're inside a line-length-induced
> narrowing, together with the previous narrowing bounds, so jit-lock or
> its clients can undo the narrowing when needed?

I'd rather prefer an extension of 'widen' that would be able to undo
the locked narrowing "when needed".  That way, jit-lock clients should
actually do something to request that, instead of letting them keep
the current code that widens whenever they feel like it.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-31  7:25                 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-07-31  7:48                   ` Eli Zaretskii
@ 2022-07-31  8:08                   ` Gregory Heytings
  2022-07-31 10:41                     ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  1 sibling, 1 reply; 685+ messages in thread
From: Gregory Heytings @ 2022-07-31  8:08 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: 56682, Eli Zaretskii


>
> How 'bout we do the reverse then: set the narrowing, but let-bind a 
> variable to indicate that we're inside a line-length-induced narrowing, 
> together with the previous narrowing bounds, so jit-lock or its clients 
> can undo the narrowing when needed?
>

That's not possible: the narrowing is (really) locked (with un uninterned 
symbol), it cannot be undone.  What would be possible would be to add an 
optional "unlock" argument to widen.  But somehow I don't think that would 
be TRT, as mode authors who now do a (widen) would simply take the habit 
to write (widen t) instead, and the same problems would surface again.

BTW, my tests show that syntax-ppss can be rather slow, when the file is 
large enough (say 1 GB).  I didn't look at what it does, but is it not 
possible to design a version of syntax-ppss that would approximate, with 
some heuristics, what syntax-ppss does, but on a smaller chunk of the 
buffer?  For example, I'd guess that '"' immediately followed by an 
alphanumeric character most likely starts a string, and '"' immediately 
preceded by an alphanumeric character most likely ends a string.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-31  6:16                                                                                         ` Eli Zaretskii
@ 2022-07-31  8:22                                                                                           ` Lars Ingebrigtsen
  2022-07-31  8:38                                                                                             ` Eli Zaretskii
  2022-07-31  8:30                                                                                           ` Gregory Heytings
  1 sibling, 1 reply; 685+ messages in thread
From: Lars Ingebrigtsen @ 2022-07-31  8:22 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: gerd.moellmann, 56682, Gregory Heytings, monnier

Eli Zaretskii <eliz@gnu.org> writes:

>> It's the same problem than with fontification-functions.  We cannot know 
>> what all these hooks that are installed by major and minor modes will do, 
>> we cannot hope to fix them one by one, so it seems to me that with 
>> long_line_optimizations_p, which is an unusual case anyway, it makes sense 
>> to "punish" them all in the same way.
>
> It sounds...too drastic.  Lars, WDYT?

I agree with Gregory that it makes sense to disable (some) fontification
stuff in long-line buffers.  It much more important to be able to view
and edit these files than getting fontification details completely
correct.

Of course, it'd be better if everything just worked perfectly, but
that's very ambitious. 






^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-31  6:16                                                                                         ` Eli Zaretskii
  2022-07-31  8:22                                                                                           ` Lars Ingebrigtsen
@ 2022-07-31  8:30                                                                                           ` Gregory Heytings
  2022-07-31  9:04                                                                                             ` Eli Zaretskii
  1 sibling, 1 reply; 685+ messages in thread
From: Gregory Heytings @ 2022-07-31  8:30 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: gerd.moellmann, 56682, larsi, monnier


>
> It sounds...too drastic.
>

Are you sure?  The docstring already says "It is a bad idea to use this 
hook for expensive processing."  And Emacs already removes a function from 
the hook when it misbhaves.  Adding something like "In a too large buffer 
or in a buffer with long lines, the functions in this hook will only have 
access to a small portion of the buffer" seems coherent, at least to me.

>
> Once again, IME it is impossible to fix such problems only in low-level 
> C infrastructure.  There will always be left-overs and fallouts that 
> should be fixed locally in Lisp where they happen. There's no problem 
> here, and I don't expect us to be able to fix everything by a small 
> number of quick fixes, and declare a victory once and for all.
>

I both agree and disagree with that.  It is true that it is, strictly 
speaking, impossible to fix _all_ such problems _only_ in low-level C 
intrastructure, and that there will always be left-overs.  But it is 
possible to fix _most_ of these problems only in low-level C 
infrastructure, and we should do so, just like an operating system kernel 
in which everything is done to avoid crashing the system/leaving it in an 
unusable state (which includes killing a mis-behaving process when 
necessary).  And we should do so even more when the amount of code to do 
so in the low-level C infrastructure remains small.

>
> Well, WDYT about a similar feature for very large files?  IOW, when the 
> buffer's size is above some threshold, turn on the 
> long_line_optimizations_p flag (which should perhaps be renamed to 
> better reflect its purpose) even if no long lines are seen?
>

I was thinking about such a feature indeed.  But it would be separate from 
the long_line_optimizations_p one, because the optimizations to activate 
in both cases are different, and their thresholds are different, too.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-31  8:22                                                                                           ` Lars Ingebrigtsen
@ 2022-07-31  8:38                                                                                             ` Eli Zaretskii
  2022-07-31  8:41                                                                                               ` Lars Ingebrigtsen
  0 siblings, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-07-31  8:38 UTC (permalink / raw)
  To: Lars Ingebrigtsen; +Cc: gerd.moellmann, 56682, gregory, monnier

> From: Lars Ingebrigtsen <larsi@gnus.org>
> Cc: Gregory Heytings <gregory@heytings.org>,  gerd.moellmann@gmail.com,
>   56682@debbugs.gnu.org,  monnier@iro.umontreal.ca
> Date: Sun, 31 Jul 2022 10:22:40 +0200
> 
> Eli Zaretskii <eliz@gnu.org> writes:
> 
> >> It's the same problem than with fontification-functions.  We cannot know 
> >> what all these hooks that are installed by major and minor modes will do, 
> >> we cannot hope to fix them one by one, so it seems to me that with 
> >> long_line_optimizations_p, which is an unusual case anyway, it makes sense 
> >> to "punish" them all in the same way.
> >
> > It sounds...too drastic.  Lars, WDYT?
> 
> I agree with Gregory that it makes sense to disable (some) fontification
> stuff in long-line buffers.  It much more important to be able to view
> and edit these files than getting fontification details completely
> correct.

No disagreement here, but I was asking about the proposal to make the
locked narrowing in effect when any pre-command-hook or
post-command-hook runs.  These are usually unrelated to
fontifications, although Gregory found an example where it is.

IOW, the issue for which I wanted to hear your opinion was whether you
think it's okay to preclude, in a buffer with long lines, all
pre/post-command-hooks from accessing the entire buffer.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-31  8:38                                                                                             ` Eli Zaretskii
@ 2022-07-31  8:41                                                                                               ` Lars Ingebrigtsen
  2022-07-31 22:45                                                                                                 ` Gregory Heytings
  0 siblings, 1 reply; 685+ messages in thread
From: Lars Ingebrigtsen @ 2022-07-31  8:41 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: gerd.moellmann, 56682, gregory, monnier

Eli Zaretskii <eliz@gnu.org> writes:

> IOW, the issue for which I wanted to hear your opinion was whether you
> think it's okay to preclude, in a buffer with long lines, all
> pre/post-command-hooks from accessing the entire buffer.

Yes, I think that's reasonable.  There will inevitably be many modes out
there that'll wedge themselves in the presence of gargantuan lines, and
limiting these hooks is a reasonable line of defence.






^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-31  8:30                                                                                           ` Gregory Heytings
@ 2022-07-31  9:04                                                                                             ` Eli Zaretskii
  2022-07-31 14:09                                                                                               ` Gregory Heytings
  0 siblings, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-07-31  9:04 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: gerd.moellmann, 56682, larsi, monnier

> Date: Sun, 31 Jul 2022 08:30:14 +0000
> From: Gregory Heytings <gregory@heytings.org>
> cc: gerd.moellmann@gmail.com, 56682@debbugs.gnu.org, larsi@gnus.org, 
>     monnier@iro.umontreal.ca
> 
> > It sounds...too drastic.
> 
> Are you sure?  The docstring already says "It is a bad idea to use this 
> hook for expensive processing."  And Emacs already removes a function from 
> the hook when it misbhaves.  Adding something like "In a too large buffer 
> or in a buffer with long lines, the functions in this hook will only have 
> access to a small portion of the buffer" seems coherent, at least to me.

But that assumes these hooks will _always_ be "too expensive" in such
buffers.  Which is not necessarily true: I can think of many things a
hook can do in a long-line buffer without being expensive.

And since we already remove expensive hook functions, maybe that is
enough?  Or maybe we should use a different threshold for "expensive"
in buffers with long lines?

> > Once again, IME it is impossible to fix such problems only in low-level 
> > C infrastructure.  There will always be left-overs and fallouts that 
> > should be fixed locally in Lisp where they happen. There's no problem 
> > here, and I don't expect us to be able to fix everything by a small 
> > number of quick fixes, and declare a victory once and for all.
> 
> I both agree and disagree with that.  It is true that it is, strictly 
> speaking, impossible to fix _all_ such problems _only_ in low-level C 
> intrastructure, and that there will always be left-overs.  But it is 
> possible to fix _most_ of these problems only in low-level C 
> infrastructure, and we should do so, just like an operating system kernel 
> in which everything is done to avoid crashing the system/leaving it in an 
> unusable state (which includes killing a mis-behaving process when 
> necessary).  And we should do so even more when the amount of code to do 
> so in the low-level C infrastructure remains small.

I think we are in agreement: my point was that solving such problems
locally is not unthinkable.

> > Well, WDYT about a similar feature for very large files?  IOW, when the 
> > buffer's size is above some threshold, turn on the 
> > long_line_optimizations_p flag (which should perhaps be renamed to 
> > better reflect its purpose) even if no long lines are seen?
> >
> 
> I was thinking about such a feature indeed.  But it would be separate from 
> the long_line_optimizations_p one, because the optimizations to activate 
> in both cases are different, and their thresholds are different, too.

Different thresholds are easy to reconcile: the optimizations should
be turned on if either of the two thresholds is exceeded.  But why do
you say the optimizations will be different? what's wrong with using
the same optimizations, i.e. restrict the display code from accessing
the entire buffer?





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-31  8:08                   ` Gregory Heytings
@ 2022-07-31 10:41                     ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-07-31 10:50                       ` Gregory Heytings
  0 siblings, 1 reply; 685+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2022-07-31 10:41 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, Eli Zaretskii

> That's not possible: the narrowing is (really) locked (with un uninterned
> symbol), it cannot be undone.  What would be possible would be to add an
> optional "unlock" argument to widen.  But somehow I don't think that would
> be TRT, as mode authors who now do a (widen) would simply take the habit to
> write (widen t) instead, and the same problems would surface again.

Emacs is not in the business of preventing people from shooting
themselves in the foot.  If we need this narrowing to be enforced
because Emacs would otherwise crash, then it's OK, but if not, then we
*should* provide a way to undo it.

> BTW, my tests show that syntax-ppss can be rather slow, when the file is
>  large enough (say 1 GB).

No doubt.  But it's no slower with long lines than with short lines.
[ Note that it calls `syntax-propertize` internally, which would need
  to be considered separately since `syntax-propertize` does work
  line-by-line, and should hence obey the narrowing.  ]


        Stefan






^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-31 10:41                     ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2022-07-31 10:50                       ` Gregory Heytings
  2022-07-31 21:41                         ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-07-31 22:03                         ` Dmitry Gutov
  0 siblings, 2 replies; 685+ messages in thread
From: Gregory Heytings @ 2022-07-31 10:50 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: 56682, Eli Zaretskii


>
> Emacs is not in the business of preventing people from shooting 
> themselves in the foot.  If we need this narrowing to be enforced 
> because Emacs would otherwise crash, then it's OK, but if not, then we 
> *should* provide a way to undo it.
>

And how do you define "crash"?  Is Emacs becoming unresponsive because an 
operation takes say two minutes to complete and cannot be interrupted a 
"crash"?  Or is a "crash" only a segfault?

>> BTW, my tests show that syntax-ppss can be rather slow, when the file 
>> is large enough (say 1 GB).
>
> No doubt.  But it's no slower with long lines than with short lines.
>

Yes, I wasn't clear enough, I should have written "when the file is large 
enough (say 1 GB), even without long lines".

But you didn't answer my question: is it not possible to design a version 
of syntax-ppss that would approximate, with some heuristics, what 
syntax-ppss does, but on a smaller chunk of the buffer?  With such a 
syntax-ppss-approximate function, we could do something like

(defun syntax-ppss (args)
   (if (narrow-to-region-locked)
       (syntax-ppss-approximage args)
     (syntax-ppss-accurate args)))





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-31  9:04                                                                                             ` Eli Zaretskii
@ 2022-07-31 14:09                                                                                               ` Gregory Heytings
  0 siblings, 0 replies; 685+ messages in thread
From: Gregory Heytings @ 2022-07-31 14:09 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: gerd.moellmann, 56682, larsi, monnier


>
> And since we already remove expensive hook functions, maybe that is 
> enough?  Or maybe we should use a different threshold for "expensive" in 
> buffers with long lines?
>

Do we?  As far as I can see, there is no time limit in safe_run_hooks. 
It could make sense to add one (or at least to clear out hook functions 
that have taken too long, as we already do it with functions that return 
an error... but doing that after the hook function returns is already too 
late, if it has taken say 30 seconds).

>>> Well, WDYT about a similar feature for very large files?  IOW, when 
>>> the buffer's size is above some threshold, turn on the 
>>> long_line_optimizations_p flag (which should perhaps be renamed to 
>>> better reflect its purpose) even if no long lines are seen?
>>
>> I was thinking about such a feature indeed.  But it would be separate 
>> from the long_line_optimizations_p one, because the optimizations to 
>> activate in both cases are different, and their thresholds are 
>> different, too.
>
> Different thresholds are easy to reconcile: the optimizations should be 
> turned on if either of the two thresholds is exceeded.  But why do you 
> say the optimizations will be different? what's wrong with using the 
> same optimizations, i.e. restrict the display code from accessing the 
> entire buffer?
>

I don't know exactly yet.  It seems to me that some of the optimizations 
for large buffers would be similar to the ones for long lines, and that 
many of the specific optimizations for long lines are not necessary for 
large buffers.  I think it would be better/safer to only enable the 
optimizations that are really necessary in each case.  But let's start 
thinking in more detail about the large buffer optimizations once the long 
lines optimizations are done, okay?





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-31 10:50                       ` Gregory Heytings
@ 2022-07-31 21:41                         ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-07-31 22:06                           ` Gregory Heytings
  2022-07-31 22:03                         ` Dmitry Gutov
  1 sibling, 1 reply; 685+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2022-07-31 21:41 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, Eli Zaretskii

Gregory Heytings [2022-07-31 10:50:18] wrote:
>> Emacs is not in the business of preventing people from shooting themselves
>> in the foot.  If we need this narrowing to be enforced because Emacs would
>> otherwise crash, then it's OK, but if not, then we *should* provide a way
>> to undo it.
> And how do you define "crash"?

Core dump.

> Is Emacs becoming unresponsive because an operation takes say two
> minutes to complete and cannot be interrupted a "crash"?  Or is
> a "crash" only a segfault?

Try `M-: (use-global-map (make-keymap)) RET`
Should we prevent users from doing that?

Let's focus on making it easy to make it work well, rather than making
it impossible to make it work poorly.

>>> BTW, my tests show that syntax-ppss can be rather slow, when the file is
>>> large enough (say 1 GB).
>> No doubt.  But it's no slower with long lines than with short lines.
>
> Yes, I wasn't clear enough, I should have written "when the file is large
> enough (say 1 GB), even without long lines".
>
> But you didn't answer my question: is it not possible to design a version of
> syntax-ppss that would approximate, with some heuristics, what syntax-ppss
> does, but on a smaller chunk of the buffer?

The answer is basically "no" but even before getting there, I have to
remind the reader that it hasn't really been requested.

In order to know if POS is within a string (which is one of the main
uses of `syntax-ppss`), you basically need to know if there's an odd or
even number of quotes before POS, which fundamentally needs to look at
all the chars between POS and BOB.  Of course we use a cache to try and
avoid looking at them over and over again, but the cache can't be of any
use the first time around.


        Stefan






^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-31 10:50                       ` Gregory Heytings
  2022-07-31 21:41                         ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2022-07-31 22:03                         ` Dmitry Gutov
  2022-07-31 22:23                           ` Gregory Heytings
  1 sibling, 1 reply; 685+ messages in thread
From: Dmitry Gutov @ 2022-07-31 22:03 UTC (permalink / raw)
  To: Gregory Heytings, Stefan Monnier; +Cc: 56682, Eli Zaretskii

On 31.07.2022 13:50, Gregory Heytings wrote:
>>> BTW, my tests show that syntax-ppss can be rather slow, when the file 
>>> is large enough (say 1 GB).
>>
>> No doubt.  But it's no slower with long lines than with short lines.
>>
> 
> Yes, I wasn't clear enough, I should have written "when the file is 
> large enough (say 1 GB), even without long lines".

What kind of scenario are you thinking of that would exhibit this 
slowness in a 1 GB file?

If we're talking about syntax-ppss only, regular editing operations 
(typing and deleting code) limited to, say, one screen should trigger 
only a rescan of a limited area inside such buffer.

Both when the editing happens near the beginning or near the end of the 
buffer. Or in the middle -- no difference.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-31 21:41                         ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2022-07-31 22:06                           ` Gregory Heytings
  2022-07-31 22:45                             ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  0 siblings, 1 reply; 685+ messages in thread
From: Gregory Heytings @ 2022-07-31 22:06 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: 56682, Eli Zaretskii

[-- Attachment #1: Type: text/plain, Size: 2452 bytes --]


>>> Emacs is not in the business of preventing people from shooting 
>>> themselves in the foot.  If we need this narrowing to be enforced 
>>> because Emacs would otherwise crash, then it's OK, but if not, then we 
>>> *should* provide a way to undo it.
>>
>> And how do you define "crash"?
>
> Core dump.
>

Aha, interesting!  So an infinite loop is not a crash, according to that 
definition?

>> Is Emacs becoming unresponsive because an operation takes say two 
>> minutes to complete and cannot be interrupted a "crash"?  Or is a 
>> "crash" only a segfault?
>
> Try `M-: (use-global-map (make-keymap)) RET`
>
> Should we prevent users from doing that?
>

It's a misleading question.  No "user" would ever do that.  Sure, it's a 
nice example, but only an Elisp hacker would do that, in the middle of a 
debugging session, and they would do that on purpose (although perhaps 
without knowing the effect in advance).  Which has nothing to do with a 
regular user who just opens a file.

>
> Let's focus on making it easy to make it work well, rather than making 
> it impossible to make it work poorly.
>

You lost me here.  I've read that sentence twenty times, and cannot 
understand what you mean.

>> But you didn't answer my question: is it not possible to design a 
>> version of syntax-ppss that would approximate, with some heuristics, 
>> what syntax-ppss does, but on a smaller chunk of the buffer?
>
> The answer is basically "no" but even before getting there, I have to 
> remind the reader that it hasn't really been requested.
>

It has, now 😉  Not "requested", however.  I respectfully, with all due 
respect, ask whether doing such a thing would be possible.

>
> In order to know if POS is within a string (which is one of the main 
> uses of `syntax-ppss`), you basically need to know if there's an odd or 
> even number of quotes before POS, which fundamentally needs to look at 
> all the chars between POS and BOB.  Of course we use a cache to try and 
> avoid looking at them over and over again, but the cache can't be of any 
> use the first time around.
>

But if you use heuristics, as I said, you don't need to look at all the 
chars between BOB and POS.  You try your best to guess, on a small (a few 
kilobytes) portion of the buffer, where the strings most likely start and 
stop.  And if you're only right in 95% of the cases, that's more than 
fine.

^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-31 22:03                         ` Dmitry Gutov
@ 2022-07-31 22:23                           ` Gregory Heytings
  2022-07-31 22:42                             ` Dmitry Gutov
  2022-07-31 22:47                             ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  0 siblings, 2 replies; 685+ messages in thread
From: Gregory Heytings @ 2022-07-31 22:23 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: 56682, Eli Zaretskii, Stefan Monnier


>> Yes, I wasn't clear enough, I should have written "when the file is 
>> large enough (say 1 GB), even without long lines".
>
> What kind of scenario are you thinking of that would exhibit this 
> slowness in a 1 GB file?
>
> If we're talking about syntax-ppss only, regular editing operations 
> (typing and deleting code) limited to, say, one screen should trigger 
> only a rescan of a limited area inside such buffer.
>

That's true, but with such big files, the initial scan is slow.  So the 
scenario is simple: you open a big enough file, type M->, and C-p.  M-> 
will be instantaneous, and C-p will take a while, because of syntax-ppss.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-31 22:23                           ` Gregory Heytings
@ 2022-07-31 22:42                             ` Dmitry Gutov
  2022-07-31 22:50                               ` Gregory Heytings
  2022-07-31 23:00                               ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-07-31 22:47                             ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  1 sibling, 2 replies; 685+ messages in thread
From: Dmitry Gutov @ 2022-07-31 22:42 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, Eli Zaretskii, Stefan Monnier

On 01.08.2022 01:23, Gregory Heytings wrote:
> 
>>> Yes, I wasn't clear enough, I should have written "when the file is 
>>> large enough (say 1 GB), even without long lines".
>>
>> What kind of scenario are you thinking of that would exhibit this 
>> slowness in a 1 GB file?
>>
>> If we're talking about syntax-ppss only, regular editing operations 
>> (typing and deleting code) limited to, say, one screen should trigger 
>> only a rescan of a limited area inside such buffer.
>>
> 
> That's true, but with such big files, the initial scan is slow.  So the 
> scenario is simple: you open a big enough file, type M->, and C-p.  M-> 
> will be instantaneous, and C-p will take a while, because of syntax-ppss.

Yeah, ok. If you are going to visit EOB, a single full scan seems 
unavoidable. I don't think 'M->' should be instantaneous, though: to 
display the last page, you need to fontify it, and font-lock depends on 
syntax-ppss.

But one big slow scan (and how slow it is actually depends on a 
particular major mode) followed by responsive editing sounds much better 
than what we've had before.

So I would recommend against trying to solve this part right now. And 
yes, some faster approximations of syntax-propertize-rules are possible, 
especially if we ask individual language modes to provide "simpler" 
syntax rules.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-31 22:06                           ` Gregory Heytings
@ 2022-07-31 22:45                             ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-07-31 23:12                               ` Gregory Heytings
                                                 ` (2 more replies)
  0 siblings, 3 replies; 685+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2022-07-31 22:45 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, Eli Zaretskii

>> Try `M-: (use-global-map (make-keymap)) RET`
>> Should we prevent users from doing that?
> It's a misleading question.  No "user" would ever do that.  Sure, it's
> a nice example, but only an Elisp hacker would do that, in the middle of
> a debugging session, and they would do that on purpose (although perhaps
> without knowing the effect in advance).  Which has nothing to do with
> a regular user who just opens a file.

FWIW, the above is my standard example because I ended up doing exactly
that by accident, locking myself out of the session I was trying to
debug, so in a sense, I'd have been happy (that one time) if Emacs had
prevented me from doing it.

>> Let's focus on making it easy to make it work well, rather than making it
>> impossible to make it work poorly.
> You lost me here.  I've read that sentence twenty times, and cannot
> understand what you mean.

Your current code makes it impossible for a major mode to make Emacs
slow by widening in a too-long-line.  I'd prefer if we made it easy
(i.e. the default) for Emacs to work well in that case, without making
it impossible for the major mode to mess things up.

E.g. use narrowing (and arrange for the known widening culprit to be
disabled) so that the default behavior is sane, but sllow an ELisp
package from re-widening (possibly using a specific call to do that) if
it thinks it's a good idea (even if it may turn out not to be so).

> But if you use heuristics, as I said, you don't need to look at all the
> chars between BOB and POS.  You try your best to guess, on a small (a few
> kilobytes) portion of the buffer, where the strings most likely start and
> stop.  And if you're only right in 95% of the cases, that's more than fine.

For specific languages, you can use various heuristics to guess which
quotes start and which quotes end a string (for some languages you can
even do it reliably), but `syntax-ppss` handles all kinds of languages
(and doesn't have access to such heuristics currently), such as ELisp
where it's hard to do it well.

I'd prefer to first see concrete examples where speeding up the
"syntax-ppss in a 1GB buffer" would make a significant difference to the
end-user's experience.  Then we can think about what's the better way to
solve the problem (which may be to just give up on font-lock altogether,
or maybe to refine the `syntax.el` code (maybe move some of it to C), or
to speed up `parse-partial-sexp`, or maybe let major modes provide
those heuristics to find a "safe point" again (these used to exist, see
`syntax-begin-function`, for example, but they tended to suck)).


        Stefan






^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-31  8:41                                                                                               ` Lars Ingebrigtsen
@ 2022-07-31 22:45                                                                                                 ` Gregory Heytings
  0 siblings, 0 replies; 685+ messages in thread
From: Gregory Heytings @ 2022-07-31 22:45 UTC (permalink / raw)
  To: Lars Ingebrigtsen; +Cc: gerd.moellmann, 56682, Eli Zaretskii, monnier


>> IOW, the issue for which I wanted to hear your opinion was whether you 
>> think it's okay to preclude, in a buffer with long lines, all 
>> pre/post-command-hooks from accessing the entire buffer.
>
> Yes, I think that's reasonable.  There will inevitably be many modes out 
> there that'll wedge themselves in the presence of gargantuan lines, and 
> limiting these hooks is a reasonable line of defence.
>

I've now done so, in a new branch feature/long-lines-improvements (to 
avoid breaking master).  A nice bonus is that it is not necessary anymore 
to disable flyspell-mode or flymake-mode for example, even in huge files.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-31 22:23                           ` Gregory Heytings
  2022-07-31 22:42                             ` Dmitry Gutov
@ 2022-07-31 22:47                             ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-07-31 23:15                               ` Gregory Heytings
  1 sibling, 1 reply; 685+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2022-07-31 22:47 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, Eli Zaretskii, Dmitry Gutov

> That's true, but with such big files, the initial scan is slow.  So the
> scenario is simple: you open a big enough file, type M->, and C-p.  M-> will
> be instantaneous, and C-p will take a while, because of syntax-ppss.

Really?  I'd expect that `M->` is slow because of `syntax-ppss`
(called by font-lock) and then `C-p` is instantaneous.


        Stefan






^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-31 22:42                             ` Dmitry Gutov
@ 2022-07-31 22:50                               ` Gregory Heytings
  2022-07-31 23:21                                 ` Gregory Heytings
                                                   ` (2 more replies)
  2022-07-31 23:00                               ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  1 sibling, 3 replies; 685+ messages in thread
From: Gregory Heytings @ 2022-07-31 22:50 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: 56682, Eli Zaretskii, Stefan Monnier


>
> But one big slow scan (and how slow it is actually depends on a 
> particular major mode) followed by responsive editing sounds much better 
> than what we've had before.
>

Indeed.  But then the question is: is it possible to do that scan while 
opening the file, before it becomes editable?  It is way better to wait a 
few seconds more while the file is being opened than to wait before two 
basic motion commands when the file is already opened.

>
> So I would recommend against trying to solve this part right now.
>

It doesn't only solve the syntax-ppss problem, it also makes flyspell-mode 
usable in such files, for example.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-31  7:11                                                                               ` Eli Zaretskii
@ 2022-07-31 22:54                                                                                 ` Gregory Heytings
  2022-08-01 12:38                                                                                   ` Eli Zaretskii
  0 siblings, 1 reply; 685+ messages in thread
From: Gregory Heytings @ 2022-07-31 22:54 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: gerd.moellmann, 56682, larsi, monnier


>
> Here are my thoughts.
>

Thanks!

>
> First, I think the setting of narrowed_begv and narrowed_zv should be 
> done in 'reseat', not in init_iterator.  The latter always calls the 
> former when invoked to start iteration of buffer text, but we also call 
> 'reseat' from other places, when we "jump" the iterator to a new place, 
> potentially far from the last.  If nothing else, this should help with 
> truncate-lines, where using window_point is basically right only for the 
> point's line.  And currently, init_iterator computes and sets the 
> narrowing even when we iterate on strings, which is unneeded and 
> incorrect.
>
> Whether always to correct narrowed_begv and narrowed_zv if we are 
> reseating to a position outside the narrowing, is a more complicated 
> question.  The basic problem here is that we don't have an easy way of 
> restoring the previous narrowing (except by unwind_protect), and the 
> display code sometimes calls init_iterator or start_display using the 
> iterator that already has these members set by previous code, a 
> situation which we currently cannot easily detect.  However, when this 
> code runs as part of redisplay, we generally don't expect the original 
> narrowing to be insufficient, except perhaps in the truncate-line case.
>
> So I think we should correct narrowed_begv and narrowed_zv only if 
> either the 'redisplaying_p' flag is reset (meaning the display code is 
> being invoked outside of redisplay) or it->line_wrap == TRUNCATE.
>

I admit I do not really understand your last two paragraphs, but I tried 
to do what you suggested, and it doesn't seem to introduce regressions, so 
I pushed it to the new feature branch.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-31 22:42                             ` Dmitry Gutov
  2022-07-31 22:50                               ` Gregory Heytings
@ 2022-07-31 23:00                               ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  1 sibling, 0 replies; 685+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2022-07-31 23:00 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: 56682, Gregory Heytings, Eli Zaretskii

> But one big slow scan (and how slow it is actually depends on a particular
> major mode)

Indeed, I think the `syntax-ppss` part itself should be fast enough even
if very large files.  But the `syntax-propertize` part (which is called
by `syntax-ppss`) can take a long time in some major modes.

In those major modes where that's a problem (i.e. major modes that have
a complex `syntax-propertize-function` and that also happen to be used
in very large files) maybe it would be worth (re)introducing some sort
of `syntax(-propertize)-begin-function`.  But these kinds of heuristics
have proved problematic over the years (and they'd introduce extra
complexity since we won't be able to just rely on
a `syntax-propertize-done` high-watermark to know what's been
propertized and what hasn't, combined with the interaction with the
`syntax-ppss` cache), so we'd have to try a few different approaches.

In any case this is not a long-lines problem.


        Stefan






^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-31 22:45                             ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2022-07-31 23:12                               ` Gregory Heytings
  2022-08-01  7:11                                 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-08-01 11:58                               ` Eli Zaretskii
  2022-08-01 18:09                               ` Gregory Heytings
  2 siblings, 1 reply; 685+ messages in thread
From: Gregory Heytings @ 2022-07-31 23:12 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: 56682, Eli Zaretskii


>>> Let's focus on making it easy to make it work well, rather than making 
>>> it impossible to make it work poorly.
>>
>> You lost me here.  I've read that sentence twenty times, and cannot 
>> understand what you mean.
>
> Your current code makes it impossible for a major mode to make Emacs 
> slow by widening in a too-long-line.
>

Which is a good thing, isn't it?  Or do you think that it's okay for Emacs 
to become unresponsive just because it is busy highlighting characters in 
the buffer?

>
> I'd prefer if we made it easy (i.e. the default) for Emacs to work well 
> in that case, without making it impossible for the major mode to mess 
> things up.
>

Sure, I would also welcome a better solution.  Until it materializes, the 
only reasonable way is to use a less optimal solution.

>
> For specific languages, you can use various heuristics to guess which 
> quotes start and which quotes end a string (for some languages you can 
> even do it reliably), but `syntax-ppss` handles all kinds of languages 
> (and doesn't have access to such heuristics currently), such as ELisp 
> where it's hard to do it well.
>

Don't worry, I've not yet seen an Elisp file with long lines.  If using 
various heuristics is sometimes or often feasible, that's already a good 
thing.

>
> I'd prefer to first see concrete examples where speeding up the 
> "syntax-ppss in a 1GB buffer" would make a significant difference to the 
> end-user's experience.
>

I just sent one such example to Dmitry.  And I pointed to another possible 
solution, namely to scan the whole buffer while opening it (instead of 
scanning it lazily, which is IIUC what currently happens).  From a user 
viewpoint, it's understandable that opening a big file takes some time.

>
> Then we can think about what's the better way to solve the problem 
> (which may be to just give up on font-lock altogether,
>

That would be regrettable, given the amount of effort that has been put 
into making font-lock work "as much as possible".

>
> or maybe to refine the `syntax.el` code (maybe move some of it to C), or 
> to speed up `parse-partial-sexp`, or maybe let major modes provide those 
> heuristics to find a "safe point" again (these used to exist, see 
> `syntax-begin-function`, for example, but they tended to suck)).
>

All this is possible.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-31 22:47                             ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2022-07-31 23:15                               ` Gregory Heytings
  2022-08-01  7:02                                 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  0 siblings, 1 reply; 685+ messages in thread
From: Gregory Heytings @ 2022-07-31 23:15 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: 56682, Eli Zaretskii, Dmitry Gutov


>> That's true, but with such big files, the initial scan is slow.  So the 
>> scenario is simple: you open a big enough file, type M->, and C-p. 
>> M-> will be instantaneous, and C-p will take a while, because of 
>> syntax-ppss.
>
> Really?  I'd expect that `M->` is slow because of `syntax-ppss` (called 
> by font-lock) and then `C-p` is instantaneous.
>

Yes, really.  M-> is fast because syntax-ppss is called inside 
fontification-functions, which are evaluated in a small portion of the 
buffer (with locked narrowing).  And C-p is slow because post-command-hook 
is (or rather was) not subjected to the same locked narrowing.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-31 22:50                               ` Gregory Heytings
@ 2022-07-31 23:21                                 ` Gregory Heytings
  2022-08-01  1:23                                 ` Dmitry Gutov
  2022-08-01 12:04                                 ` Eli Zaretskii
  2 siblings, 0 replies; 685+ messages in thread
From: Gregory Heytings @ 2022-07-31 23:21 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: 56682, Eli Zaretskii, Stefan Monnier


>> But one big slow scan (and how slow it is actually depends on a 
>> particular major mode) followed by responsive editing sounds much 
>> better than what we've had before.
>
> Indeed.  But then the question is: is it possible to do that scan while 
> opening the file, before it becomes editable?  It is way better to wait 
> a few seconds more while the file is being opened than to wait before 
> two basic motion commands when the file is already opened.
>

Sorry, I meant "to wait _between_ two basic motion commands".





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-31 22:50                               ` Gregory Heytings
  2022-07-31 23:21                                 ` Gregory Heytings
@ 2022-08-01  1:23                                 ` Dmitry Gutov
  2022-08-01 12:08                                   ` Eli Zaretskii
  2022-08-01 12:04                                 ` Eli Zaretskii
  2 siblings, 1 reply; 685+ messages in thread
From: Dmitry Gutov @ 2022-08-01  1:23 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, Eli Zaretskii, Stefan Monnier

On 01.08.2022 01:50, Gregory Heytings wrote:
> 
>>
>> But one big slow scan (and how slow it is actually depends on a 
>> particular major mode) followed by responsive editing sounds much 
>> better than what we've had before.
>>
> 
> Indeed.  But then the question is: is it possible to do that scan while 
> opening the file, before it becomes editable?

IIUC this state of affairs is caused by your chosen approach to speeding 
up font-lock (hard narrowing while it is called), which makes the 
initial call to syntax-ppss happen inside that narrowing as well.

The alternative being that font-lock would call syntax-ppss right away 
with no restriction, but then only apply highlighting to limited parts 
of the buffer.

 > It is way better to wait
 > a few seconds more while the file is being opened than to wait before
 > two basic motion commands when the file is already opened.

I agree, yes.

>> So I would recommend against trying to solve this part right now.
>>
> 
> It doesn't only solve the syntax-ppss problem, it also makes 
> flyspell-mode usable in such files, for example.

Does flyspell-mode always scan the full buffer?





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-31 23:15                               ` Gregory Heytings
@ 2022-08-01  7:02                                 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-08-01  8:38                                   ` Gregory Heytings
  0 siblings, 1 reply; 685+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2022-08-01  7:02 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, Eli Zaretskii, Dmitry Gutov

>>> That's true, but with such big files, the initial scan is slow.  So the
>>> scenario is simple: you open a big enough file, type M->, and C-p. M->
>>> will be instantaneous, and C-p will take a while, because of syntax-ppss.
>> Really?  I'd expect that `M->` is slow because of `syntax-ppss` (called by
>> font-lock) and then `C-p` is instantaneous.
> Yes, really.  M-> is fast because syntax-ppss is called inside
> fontification-functions, which are evaluated in a small portion of the
> buffer (with locked narrowing).

Ah, you're talking about a file with a long line.  I was thinking of just
a normal large file.

> And C-p is slow because post-command-hook is (or rather was) not
> subjected to the same locked narrowing.

I wonder what `C-p` has to do with `post-command-hook`.
After all, that same `post-command-hook` is also run after `M->` as well.


        Stefan






^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-31 23:12                               ` Gregory Heytings
@ 2022-08-01  7:11                                 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-08-01  7:51                                   ` Gregory Heytings
  2022-08-01 12:12                                   ` Eli Zaretskii
  0 siblings, 2 replies; 685+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2022-08-01  7:11 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, Eli Zaretskii

>> Your current code makes it impossible for a major mode to make Emacs slow
>> by widening in a too-long-line.
> Which is a good thing, isn't it?

No: we don't want to prevent people from shooting themselves in the foot.
Basically if it says "impossible" there's a good chance it's not a good thing.

> Or do you think that it's okay for Emacs to become unresponsive just
> because it is busy highlighting characters in the buffer?

Widening in a too long line will not necessarily lead to an unresponsive
Emacs, so by preventing it you're also preventing useful cases.

>> I'd prefer if we made it easy (i.e. the default) for Emacs to work well in
>> that case, without making it impossible for the major mode to mess
>> things up.
> Sure, I would also welcome a better solution.  Until it materializes, the
> only reasonable way is to use a less optimal solution.

It's not difficult to make it possible to re-widen after your narrowing.

> I just sent one such example to Dmitry.  And I pointed to another possible
> solution, namely to scan the whole buffer while opening it (instead of
> scanning it lazily, which is IIUC what currently happens).  From a user
> viewpoint, it's understandable that opening a big file takes some time.

We used to scan eagerly in the background with `jit-lock-stealth`, but that was
not very popular (eats up your battery for fairly little benefit).
We also have "lazier" highlighting via `jit-lock-defer`, but that hasn't
been adapted to `syntax-ppss`.  It might be with investigating.


        Stefan






^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-01  7:11                                 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2022-08-01  7:51                                   ` Gregory Heytings
  2022-08-01 12:12                                   ` Eli Zaretskii
  1 sibling, 0 replies; 685+ messages in thread
From: Gregory Heytings @ 2022-08-01  7:51 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: 56682, Eli Zaretskii

[-- Attachment #1: Type: text/plain, Size: 1976 bytes --]


>>> Your current code makes it impossible for a major mode to make Emacs 
>>> slow by widening in a too-long-line.
>>
>> Which is a good thing, isn't it?
>
> No: we don't want to prevent people from shooting themselves in the 
> foot. Basically if it says "impossible" there's a good chance it's not a 
> good thing.
>

Apparently you don't understand what I'm doing.  I'm trying to make Emacs 
handle exceptional cases gracefully, by:

1. adding as few hard limits as possible, and

2. keeping as many functionalities as possible (my task would have been _a 
lot_ easier if I had just stopped after saying "just open these files with 
M-x find-file-literally").

If you think there's anything wrong with that approach, I'll have to 
conclude that we live on different planets.  On Earth and on Theory, 
maybe?

And no, it's not even "impossible" for Emacs uses to shoot themselves in 
the foot, so your argument collapses.  Those who prefer the "Traditional 
Emacs Approach"™ when it encounters such exceptional cases, that is, 
those who:

1. do not want to add any limits whatsoever in any circumstance, and

2. agree to take the risk of making Emacs completely unfonctional,

can simply add (setq long-line-threshold nil) in their init file.

>> I just sent one such example to Dmitry.  And I pointed to another 
>> possible solution, namely to scan the whole buffer while opening it 
>> (instead of scanning it lazily, which is IIUC what currently happens). 
>> From a user viewpoint, it's understandable that opening a big file 
>> takes some time.
>
> We used to scan eagerly in the background with `jit-lock-stealth`, but 
> that was not very popular (eats up your battery for fairly little 
> benefit). We also have "lazier" highlighting via `jit-lock-defer`, but 
> that hasn't been adapted to `syntax-ppss`.  It might be worth 
> investigating.
>

It might be, indeed.  But I will most probably not do that myself.

^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-01  7:02                                 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2022-08-01  8:38                                   ` Gregory Heytings
  2022-08-01  9:34                                     ` Gregory Heytings
  0 siblings, 1 reply; 685+ messages in thread
From: Gregory Heytings @ 2022-08-01  8:38 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: 56682, Eli Zaretskii, Dmitry Gutov


>>>> That's true, but with such big files, the initial scan is slow.  So 
>>>> the scenario is simple: you open a big enough file, type M->, and 
>>>> C-p. M-> will be instantaneous, and C-p will take a while, because of 
>>>> syntax-ppss.
>>>
>>> Really?  I'd expect that `M->` is slow because of `syntax-ppss` 
>>> (called by font-lock) and then `C-p` is instantaneous.
>>
>> Yes, really.  M-> is fast because syntax-ppss is called inside 
>> fontification-functions, which are evaluated in a small portion of the 
>> buffer (with locked narrowing).
>>
>> [...]
>> 
>> And C-p is slow because post-command-hook is (or rather was) not 
>> subjected to the same locked narrowing.
>
> I wonder what `C-p` has to do with `post-command-hook`.
>
> After all, that same `post-command-hook` is also run after `M->` as 
> well.
>

You're right here.  Technically it's M-> that is slow.  But it's not what 
the user sees (hence my own confusion): the effect of M-> is immediately 
visible.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-01  8:38                                   ` Gregory Heytings
@ 2022-08-01  9:34                                     ` Gregory Heytings
  2022-08-01  9:46                                       ` Dmitry Gutov
                                                         ` (2 more replies)
  0 siblings, 3 replies; 685+ messages in thread
From: Gregory Heytings @ 2022-08-01  9:34 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: 56682, Eli Zaretskii, Dmitry Gutov


Given your and Dmitry's feedback, I just tried to add an explicit call to 
(syntax-ppss (point-max)), without narrowing, when the buffer is opened 
(see below).

The problem is that this is, as I said, slow.  On my laptop, opening a 1 
GB file takes about 6 seconds.  The call to syntax-ppss adds 70 seconds, 
so opening a large file becomes an order of magnitude slower (13 times 
slower).  Which I think is too much for the added benefit.

diff --git a/src/buffer.c b/src/buffer.c
index a07194aef7..bff6dce1d7 100644
--- a/src/buffer.c
+++ b/src/buffer.c
@@ -986,6 +986,7 @@ reset_buffer (register struct buffer *b)
    b->clip_changed = 0;
    b->prevent_redisplay_optimizations_p = 1;
    b->long_line_optimizations_p = 0;
+  b->long_line_syntax_ppss_done_p = 0;
    bset_backed_up (b, Qnil);
    bset_local_minor_modes (b, Qnil);
    BUF_AUTOSAVE_MODIFF (b) = 0;
@@ -2448,6 +2449,7 @@ #define swapfield_(field, type) \
    current_buffer->prevent_redisplay_optimizations_p = 1;
    other_buffer->prevent_redisplay_optimizations_p = 1;
    swapfield (long_line_optimizations_p, bool_bf);
+  swapfield (long_line_syntax_ppss_done_p, bool_bf);
    swapfield (overlays_before, struct Lisp_Overlay *);
    swapfield (overlays_after, struct Lisp_Overlay *);
    swapfield (overlay_center, ptrdiff_t);
diff --git a/src/buffer.h b/src/buffer.h
index 47b4bdf749..3e020f1953 100644
--- a/src/buffer.h
+++ b/src/buffer.h
@@ -686,6 +686,8 @@ #define BVAR(buf, field) ((buf)->field ## _)
       display optimizations must be used.  */
    bool_bf long_line_optimizations_p : 1;

+  bool_bf long_line_syntax_ppss_done_p : 1;
+
    /* List of overlays that end at or before the current center,
       in order of end-position.  */
    struct Lisp_Overlay *overlays_before;
diff --git a/src/xdisp.c b/src/xdisp.c
index 8a19b3bda9..d70ab6f9c1 100644
--- a/src/xdisp.c
+++ b/src/xdisp.c
@@ -4391,6 +4391,13 @@ handle_fontified_prop (struct it *it)

        if (current_buffer->long_line_optimizations_p)
  	{
+	  if (!current_buffer->long_line_syntax_ppss_done_p)
+	    {
+	      current_buffer->long_line_syntax_ppss_done_p = 1;
+	      specbind (Qinhibit_quit, Qt);
+	      CALLN (Ffuncall, intern ("syntax-ppss"), Fpoint_max ());
+	      unbind_to (count, Qnil);
+	    }
  	  ptrdiff_t begv = it->narrowed_begv ? it->narrowed_begv : BEGV;
  	  ptrdiff_t zv = it->narrowed_zv;
  	  ptrdiff_t charpos = IT_CHARPOS (*it);





^ permalink raw reply related	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-01  9:34                                     ` Gregory Heytings
@ 2022-08-01  9:46                                       ` Dmitry Gutov
  2022-08-01  9:56                                         ` Gregory Heytings
  2022-08-01 11:06                                       ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-08-02  3:01                                       ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2 siblings, 1 reply; 685+ messages in thread
From: Dmitry Gutov @ 2022-08-01  9:46 UTC (permalink / raw)
  To: Gregory Heytings, Stefan Monnier; +Cc: 56682, Eli Zaretskii

On 01.08.2022 12:34, Gregory Heytings wrote:
> 
> Given your and Dmitry's feedback, I just tried to add an explicit call 
> to (syntax-ppss (point-max)), without narrowing, when the buffer is 
> opened (see below).
> 
> The problem is that this is, as I said, slow.  On my laptop, opening a 1 
> GB file takes about 6 seconds.  The call to syntax-ppss adds 70 seconds, 
> so opening a large file becomes an order of magnitude slower (13 times 
> slower).  Which I think is too much for the added benefit.

But that only has to happen when the buffer is scrolled to the bottom, 
right?

And syntax-ppss's speed depends on the rules applied by the particular 
major mode. Those could be sped up. Some optimization of this function's 
speed is not out of the question either.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-01  9:46                                       ` Dmitry Gutov
@ 2022-08-01  9:56                                         ` Gregory Heytings
  2022-08-01 10:00                                           ` Gregory Heytings
  2022-08-01 10:46                                           ` Dmitry Gutov
  0 siblings, 2 replies; 685+ messages in thread
From: Gregory Heytings @ 2022-08-01  9:56 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: 56682, Eli Zaretskii, Stefan Monnier

[-- Attachment #1: Type: text/plain, Size: 1258 bytes --]


>> Given your and Dmitry's feedback, I just tried to add an explicit call 
>> to (syntax-ppss (point-max)), without narrowing, when the buffer is 
>> opened (see below).
>> 
>> The problem is that this is, as I said, slow.  On my laptop, opening a 
>> 1 GB file takes about 6 seconds.  The call to syntax-ppss adds 70 
>> seconds, so opening a large file becomes an order of magnitude slower 
>> (13 times slower).  Which I think is too much for the added benefit.
>
> But that only has to happen when the buffer is scrolled to the bottom, 
> right?
>

No, it happens when the buffer is opened.  Given the importance that you 
and Stefan seem to give to that function, it is, with the patch I sent in 
my previous post, called once on the whole buffer (without any narrowing) 
when the file is opened.  Later calls (inside fontification-functions or 
post-command-hook) are subject to a forced narrowing.

>
> And syntax-ppss's speed depends on the rules applied by the particular 
> major mode. Those could be sped up. Some optimization of this function's 
> speed is not out of the question either.
>

They would be more than welcome.  In fact, without such optimizations, it 
would be unreasonable to do what the patch does.

^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-01  9:56                                         ` Gregory Heytings
@ 2022-08-01 10:00                                           ` Gregory Heytings
  2022-08-01 10:46                                           ` Dmitry Gutov
  1 sibling, 0 replies; 685+ messages in thread
From: Gregory Heytings @ 2022-08-01 10:00 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: 56682, Eli Zaretskii, Stefan Monnier


>> And syntax-ppss's speed depends on the rules applied by the particular 
>> major mode. Those could be sped up. Some optimization of this 
>> function's speed is not out of the question either.
>
> They would be more than welcome.  In fact, without such optimizations, 
> it would be unreasonable to do what the patch does.
>

To clarify: it should become at least six times faster.  That would mean 
that opening a large file would take 3N seconds instead of N seconds, 
which would be okay.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-01  9:56                                         ` Gregory Heytings
  2022-08-01 10:00                                           ` Gregory Heytings
@ 2022-08-01 10:46                                           ` Dmitry Gutov
  2022-08-01 11:01                                             ` Gregory Heytings
  1 sibling, 1 reply; 685+ messages in thread
From: Dmitry Gutov @ 2022-08-01 10:46 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, Eli Zaretskii, Stefan Monnier

On 01.08.2022 12:56, Gregory Heytings wrote:
> 
>>> Given your and Dmitry's feedback, I just tried to add an explicit 
>>> call to (syntax-ppss (point-max)), without narrowing, when the buffer 
>>> is opened (see below).
>>>
>>> The problem is that this is, as I said, slow.  On my laptop, opening 
>>> a 1 GB file takes about 6 seconds.  The call to syntax-ppss adds 70 
>>> seconds, so opening a large file becomes an order of magnitude slower 
>>> (13 times slower).  Which I think is too much for the added benefit.
>>
>> But that only has to happen when the buffer is scrolled to the bottom, 
>> right?
>>
> 
> No, it happens when the buffer is opened.  Given the importance that you 
> and Stefan seem to give to that function, it is, with the patch I sent 
> in my previous post, called once on the whole buffer (without any 
> narrowing) when the file is opened.

But if the buffer is not scrolled to the end, shouldn't it be called 
with a position that's close to the beginning?

That shouldn't force the full buffer scan, meaning this call should 
complete quickly.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-01 10:46                                           ` Dmitry Gutov
@ 2022-08-01 11:01                                             ` Gregory Heytings
  2022-08-02 14:53                                               ` Dmitry Gutov
  2022-08-02 21:18                                               ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  0 siblings, 2 replies; 685+ messages in thread
From: Gregory Heytings @ 2022-08-01 11:01 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: 56682, Eli Zaretskii, Stefan Monnier

[-- Attachment #1: Type: text/plain, Size: 1610 bytes --]


>> No, it happens when the buffer is opened.  Given the importance that 
>> you and Stefan seem to give to that function, it is, with the patch I 
>> sent in my previous post, called once on the whole buffer (without any 
>> narrowing) when the file is opened.
>
> But if the buffer is not scrolled to the end, shouldn't it be called 
> with a position that's close to the beginning?
>
> That shouldn't force the full buffer scan, meaning this call should 
> complete quickly.
>

I'm trying to reconcile two conflicting constraints.

It is necessary to add a locked narrowing around fontification-functions 
and pre/post-command-hook to ensure that Emacs remains responsive.

At the same time, you and Stefan tell me that syntax-ppss does an 
important job and will not do it correctly with such a locked narrowing, 
IOW, that at least syntax-ppss should be called without a locked 
narrowing.  But you also tell me that its result is cached so that a full 
buffer scan isn't necessary anymore when it has happened at least once.

So what I'm suggesting is to do a full buffer scan immediately, when the 
file is opened, without any narrowing.  If that happens, later calls to 
syntax-ppss inside fontification-functions and pre/post-command-hook will 
use the cached result of the initial scan, and will do their job correctly 
even with a locked narrowing.

Unless I misunderstand something, I think (and my tests seem to confirm) 
that that would be a workable solution, provided that the initial scan is 
reasonably fast, that is, at least six times faster than it is now.

^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-01  9:34                                     ` Gregory Heytings
  2022-08-01  9:46                                       ` Dmitry Gutov
@ 2022-08-01 11:06                                       ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-08-01 11:23                                         ` Gregory Heytings
  2022-08-02  3:01                                       ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2 siblings, 1 reply; 685+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2022-08-01 11:06 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, Eli Zaretskii, Dmitry Gutov

> The problem is that this is, as I said, slow.  On my laptop, opening a 1 GB
> file takes about 6 seconds.  The call to syntax-ppss adds 70 seconds, so
> opening a large file becomes an order of magnitude slower (13 times slower).

It's meaningless to talk about the time taken by `syntax-ppss` without specifying
the major mode that was in use.
You might also want to compare to the time to run

    (parse-partial-sexp (point-min) (point-max))

which is a kind of "speed of light" for `syntax-ppss`.


        Stefan






^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-01 11:06                                       ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2022-08-01 11:23                                         ` Gregory Heytings
  2022-08-01 21:53                                           ` Dmitry Gutov
  2022-08-02 21:32                                           ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  0 siblings, 2 replies; 685+ messages in thread
From: Gregory Heytings @ 2022-08-01 11:23 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: 56682, Eli Zaretskii, Dmitry Gutov


>> The problem is that this is, as I said, slow.  On my laptop, opening a 
>> 1 GB file takes about 6 seconds.  The call to syntax-ppss adds 70 
>> seconds, so opening a large file becomes an order of magnitude slower 
>> (13 times slower).
>
> It's meaningless to talk about the time taken by `syntax-ppss` without 
> specifying the major mode that was in use.
>

It isn't.  The benchmark above was with a JSON file (js-mode), but you'll 
see the same ratio with an Elisp file for example:

for I in $(seq 1 2500); do cat lisp/simple.el; done > complex.el

That file opens in about 5 seconds, and (benchmark-run 1 (syntax-ppss 
(point-max))) takes about 45 seconds.

Sure, there are perhaps modes that are slower, but my tests seem to 
indicate that the 1/10 ratio is correct, or IOW that syntax-ppss is an 
order of magnitude slower than opening the file.

>
> You might also want to compare to the time to run
>
> (parse-partial-sexp (point-min) (point-max))
>
> which is a kind of "speed of light" for `syntax-ppss`.
>

What do you mean?  With the above file (benchmark-run 1 
(parse-partial-sexp (point-min) (point-max))) takes 55 seconds.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-31 22:45                             ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-07-31 23:12                               ` Gregory Heytings
@ 2022-08-01 11:58                               ` Eli Zaretskii
  2022-08-02  8:10                                 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-08-05 12:59                                 ` Dmitry Gutov
  2022-08-01 18:09                               ` Gregory Heytings
  2 siblings, 2 replies; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-01 11:58 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: 56682, gregory

> From: Stefan Monnier <monnier@iro.umontreal.ca>
> Cc: Eli Zaretskii <eliz@gnu.org>,  56682@debbugs.gnu.org
> Date: Sun, 31 Jul 2022 18:45:16 -0400
> 
> Your current code makes it impossible for a major mode to make Emacs
> slow by widening in a too-long-line.  I'd prefer if we made it easy
> (i.e. the default) for Emacs to work well in that case, without making
> it impossible for the major mode to mess things up.
> 
> E.g. use narrowing (and arrange for the known widening culprit to be
> disabled) so that the default behavior is sane, but sllow an ELisp
> package from re-widening (possibly using a specific call to do that) if
> it thinks it's a good idea (even if it may turn out not to be so).

The problem is that too many popular major modes, notably including
those whose files tend to like having very long lines, are slow in
their fontifications.  In fact, I'd challenge you to find a major mode
that doesn't present such a degradation in behavior with long lines
(you should be able to measure it by comparing performance and
responsiveness in a buffer with and without font-lock).

Given this situation, it sounds reasonable to start by restricting
font-lock.

As I wrote elsewhere, I'm okay with extending 'widen' so that it could
"unlock" the locked narrowing, which could then be used in major modes
that convince us their performance is adequate (or clearly announce in
their docs that they don't care about files with long lines ;-).





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-31 22:50                               ` Gregory Heytings
  2022-07-31 23:21                                 ` Gregory Heytings
  2022-08-01  1:23                                 ` Dmitry Gutov
@ 2022-08-01 12:04                                 ` Eli Zaretskii
  2022-08-01 12:20                                   ` Gregory Heytings
  2022-08-02  7:48                                   ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2 siblings, 2 replies; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-01 12:04 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, monnier, dgutov

> Date: Sun, 31 Jul 2022 22:50:23 +0000
> From: Gregory Heytings <gregory@heytings.org>
> cc: 56682@debbugs.gnu.org, Eli Zaretskii <eliz@gnu.org>, 
>     Stefan Monnier <monnier@iro.umontreal.ca>
> 
> It is way better to wait a few seconds more while the file is being
> opened than to wait before two basic motion commands when the file
> is already opened.

I don't think I agree.  Having to wait for the initial display is
pretty annoying.  In fact, this was how the original font-lock worked:
it was triggered by find-file, and would fontify the entire buffer
before showing any of it.  That led very quickly to the likes of
lazy-lock and fast-lock, and was eventually fixed by jit-lock.

Try visiting a very large file encoded in something of the ISO-2022
family, and you will see what I mean.  It's an annoyance.

I have jit-lock-stealth enabled because I don't like the initial wait,
but don't want any subsequent waits, either.  We also have the (little
used, for some reason) jit-lock-defer feature: if you set
jit-lock-defer-time to a large enough value, M-> followed by C-p will
not be as slow as they are now, I think.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-01  1:23                                 ` Dmitry Gutov
@ 2022-08-01 12:08                                   ` Eli Zaretskii
  2022-08-02  1:05                                     ` Dmitry Gutov
  0 siblings, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-01 12:08 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: 56682, gregory, monnier

> Date: Mon, 1 Aug 2022 04:23:21 +0300
> Cc: 56682@debbugs.gnu.org, Eli Zaretskii <eliz@gnu.org>,
>  Stefan Monnier <monnier@iro.umontreal.ca>
> From: Dmitry Gutov <dgutov@yandex.ru>
> 
> IIUC this state of affairs is caused by your chosen approach to speeding 
> up font-lock (hard narrowing while it is called), which makes the 
> initial call to syntax-ppss happen inside that narrowing as well.
> 
> The alternative being that font-lock would call syntax-ppss right away 
> with no restriction, but then only apply highlighting to limited parts 
> of the buffer.

AFAIU, this seems to assume that highlighting is much faster than
syntax-ppss.  Is that a given?  If not, I don't think I understand how
this could help.

>  > It is way better to wait
>  > a few seconds more while the file is being opened than to wait before
>  > two basic motion commands when the file is already opened.
> 
> I agree, yes.

I don't.

> > It doesn't only solve the syntax-ppss problem, it also makes 
> > flyspell-mode usable in such files, for example.
> 
> Does flyspell-mode always scan the full buffer?

flyspell-mode doesn't scan anything but the text you type, as you type
it.  Anything else must be explicitly invoked by the user.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-01  7:11                                 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-08-01  7:51                                   ` Gregory Heytings
@ 2022-08-01 12:12                                   ` Eli Zaretskii
  2022-08-01 21:54                                     ` Dmitry Gutov
  1 sibling, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-01 12:12 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: 56682, gregory

> From: Stefan Monnier <monnier@iro.umontreal.ca>
> Cc: Eli Zaretskii <eliz@gnu.org>,  56682@debbugs.gnu.org
> Date: Mon, 01 Aug 2022 03:11:43 -0400
> 
> >> Your current code makes it impossible for a major mode to make Emacs slow
> >> by widening in a too-long-line.
> > Which is a good thing, isn't it?
> 
> No: we don't want to prevent people from shooting themselves in the foot.

But the problem here is that it isn't "people shooting themselves in
the foot", it's that "major modes shoot their users in the foot".
IOW, the ones who shoot and the ones who get shot are not the same
people.

What do you want a user to do when he/she is faced with a mode which
makes Emacs very slow?  Such a user cannot blame his/herself; in many
cases the use doesn't even know enough to realize it's the major mode
and its fontifications that are the culprit.

> Widening in a too long line will not necessarily lead to an unresponsive
> Emacs, so by preventing it you're also preventing useful cases.

The experience up till now says otherwise.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-01 12:04                                 ` Eli Zaretskii
@ 2022-08-01 12:20                                   ` Gregory Heytings
  2022-08-01 13:04                                     ` Eli Zaretskii
  2022-08-02  7:51                                     ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-08-02  7:48                                   ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  1 sibling, 2 replies; 685+ messages in thread
From: Gregory Heytings @ 2022-08-01 12:20 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, monnier, dgutov


>> It is way better to wait a few seconds more while the file is being 
>> opened than to wait before two basic motion commands when the file is 
>> already opened.
>
> I don't think I agree.  Having to wait for the initial display is pretty 
> annoying.
>

It is, indeed.  But here we are talking about big files (say 1 GB).  In 
that case (and in that case only) it is much better, from a user 
viewpoint, to wait say 20 seconds before the file is opened and being at 
that point able to freely move through the file, instead of waiting only 6 
seconds, and then having to wait another 10 seconds between two motion 
commands like M-> C-p.  In fact, no user expects that a 1 GB file would 
open instantaneously.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-31 22:54                                                                                 ` Gregory Heytings
@ 2022-08-01 12:38                                                                                   ` Eli Zaretskii
  2022-08-01 12:51                                                                                     ` Gregory Heytings
  0 siblings, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-01 12:38 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: gerd.moellmann, 56682, larsi, monnier

> Date: Sun, 31 Jul 2022 22:54:00 +0000
> From: Gregory Heytings <gregory@heytings.org>
> cc: gerd.moellmann@gmail.com, 56682@debbugs.gnu.org, larsi@gnus.org, 
>     monnier@iro.umontreal.ca
> 
> > Whether always to correct narrowed_begv and narrowed_zv if we are 
> > reseating to a position outside the narrowing, is a more complicated 
> > question.  The basic problem here is that we don't have an easy way of 
> > restoring the previous narrowing (except by unwind_protect), and the 
> > display code sometimes calls init_iterator or start_display using the 
> > iterator that already has these members set by previous code, a 
> > situation which we currently cannot easily detect.  However, when this 
> > code runs as part of redisplay, we generally don't expect the original 
> > narrowing to be insufficient, except perhaps in the truncate-line case.
> >
> > So I think we should correct narrowed_begv and narrowed_zv only if 
> > either the 'redisplaying_p' flag is reset (meaning the display code is 
> > being invoked outside of redisplay) or it->line_wrap == TRUNCATE.
> >
> 
> I admit I do not really understand your last two paragraphs, but I tried 
> to do what you suggested, and it doesn't seem to introduce regressions, so 
> I pushed it to the new feature branch.

Thanks.  I will try to explain some more; feel free to ask questions
if something's still unclear.

You can see in the sources that both init_iterator and start_display
are many times called with 'struct it' that was used by the caller, so
it could already have the narrowed_begv and narrowed_zv members
initialized by the caller.  If we discover that we want to recalculate
these values, we'd then need to restore the previous value before we
return, so that the caller will see the same values it used before the
call.  But we have no easy way of doing that, and moreover, cannot
even detect that these members were initialized.  The inability to
detect that they were initialized is due to the fact that we don't
initialize 'struct it' before we call init_iterator, and so these
fields can originally have any arbitrary value.  Which means, for
example, that tests like this:

  if (current_buffer->long_line_optimizations_p)
    {
      if (!it->narrowed_begv  <<<<<<<<<<<<<<<<<<<<<<<<<<
         || ((pos.charpos < it->narrowed_begv || pos.charpos > it->narrowed_zv)
             && (!redisplaying_p || it->line_wrap == TRUNCATE)))

are not necessarily reliable, because we never initialize
narrowed_begv to zero, AFAICT.  Right?

The other part of my reasoning is that callers of the display code
which are outside redisplay could legitimately move the iterator far
from point: think about pos-visible-in-window-p and its ilk.  So, when
we are not called by redisplay, I think it would be preferable to
update the narrowing due to these considerations.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-01 12:38                                                                                   ` Eli Zaretskii
@ 2022-08-01 12:51                                                                                     ` Gregory Heytings
  2022-08-01 13:13                                                                                       ` Eli Zaretskii
  2022-08-01 13:24                                                                                       ` Eli Zaretskii
  0 siblings, 2 replies; 685+ messages in thread
From: Gregory Heytings @ 2022-08-01 12:51 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: gerd.moellmann, 56682, larsi, monnier


>
> You can see in the sources that both init_iterator and start_display are 
> many times called with 'struct it' that was used by the caller, so it 
> could already have the narrowed_begv and narrowed_zv members initialized 
> by the caller.  If we discover that we want to recalculate these values, 
> we'd then need to restore the previous value before we return, so that 
> the caller will see the same values it used before the call.  But we 
> have no easy way of doing that, and moreover, cannot even detect that 
> these members were initialized.  The inability to detect that they were 
> initialized is due to the fact that we don't initialize 'struct it' 
> before we call init_iterator, and so these fields can originally have 
> any arbitrary value.
>

Thanks, it's much clearer now.

>
> Which means, for example, that tests like this:
>
>  if (current_buffer->long_line_optimizations_p)
>    {
>      if (!it->narrowed_begv  <<<<<<<<<<<<<<<<<<<<<<<<<<
>         || ((pos.charpos < it->narrowed_begv || pos.charpos > it->narrowed_zv)
>             && (!redisplaying_p || it->line_wrap == TRUNCATE)))
>
> are not necessarily reliable, because we never initialize narrowed_begv 
> to zero, AFAICT.  Right?
>

Indeed.  That wasn't a problem with the previous code in which 
narrowed_begv was unconditionally assigned.  Now it is.  I think the 
following change should be enough to fix this.  Agreed?

diff --git a/src/xdisp.c b/src/xdisp.c
index 8a19b3bda9..9574d06bd5 100644
--- a/src/xdisp.c
+++ b/src/xdisp.c
@@ -3472,6 +3472,9 @@ init_iterator (struct it *it, struct window *w,
                         &it->bidi_it);
         }

+      if (current_buffer->long_line_optimizations_p)
+       it->narrowed_begv = 0;
+
        /* Compute faces etc.  */
        reseat (it, it->current.pos, true);
      }

>
> The other part of my reasoning is that callers of the display code which 
> are outside redisplay could legitimately move the iterator far from 
> point: think about pos-visible-in-window-p and its ilk.  So, when we are 
> not called by redisplay, I think it would be preferable to update the 
> narrowing due to these considerations.
>

Thanks, this too clarifies what you meant.





^ permalink raw reply related	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-01 12:20                                   ` Gregory Heytings
@ 2022-08-01 13:04                                     ` Eli Zaretskii
  2022-08-01 13:14                                       ` Gregory Heytings
  2022-08-02  7:51                                     ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  1 sibling, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-01 13:04 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, monnier, dgutov

> Date: Mon, 01 Aug 2022 12:20:39 +0000
> From: Gregory Heytings <gregory@heytings.org>
> cc: dgutov@yandex.ru, 56682@debbugs.gnu.org, monnier@iro.umontreal.ca
> 
> > Having to wait for the initial display is pretty annoying.
> 
> It is, indeed.  But here we are talking about big files (say 1 GB).  In 
> that case (and in that case only) it is much better, from a user 
> viewpoint, to wait say 20 seconds before the file is opened and being at 
> that point able to freely move through the file, instead of waiting only 6 
> seconds, and then having to wait another 10 seconds between two motion 
> commands like M-> C-p.  In fact, no user expects that a 1 GB file would 
> open instantaneously.

You can maybe have that for C-p that follows M->, but wouldn't the
wait return, with a vengeance, if you insert a single character
(because then the buffer needs to be re-scanned)?  If so, we've gained
nothing, really.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-01 12:51                                                                                     ` Gregory Heytings
@ 2022-08-01 13:13                                                                                       ` Eli Zaretskii
  2022-08-01 13:30                                                                                         ` Gregory Heytings
  2022-08-01 13:24                                                                                       ` Eli Zaretskii
  1 sibling, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-01 13:13 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: gerd.moellmann, 56682, larsi, monnier

> Date: Mon, 01 Aug 2022 12:51:47 +0000
> From: Gregory Heytings <gregory@heytings.org>
> cc: gerd.moellmann@gmail.com, 56682@debbugs.gnu.org, larsi@gnus.org, 
>     monnier@iro.umontreal.ca
> 
> > Which means, for example, that tests like this:
> >
> >  if (current_buffer->long_line_optimizations_p)
> >    {
> >      if (!it->narrowed_begv  <<<<<<<<<<<<<<<<<<<<<<<<<<
> >         || ((pos.charpos < it->narrowed_begv || pos.charpos > it->narrowed_zv)
> >             && (!redisplaying_p || it->line_wrap == TRUNCATE)))
> >
> > are not necessarily reliable, because we never initialize narrowed_begv 
> > to zero, AFAICT.  Right?
> >
> 
> Indeed.  That wasn't a problem with the previous code in which 
> narrowed_begv was unconditionally assigned.  Now it is.  I think the 
> following change should be enough to fix this.  Agreed?

Yes, of course.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-01 13:04                                     ` Eli Zaretskii
@ 2022-08-01 13:14                                       ` Gregory Heytings
  2022-08-01 13:19                                         ` Eli Zaretskii
  0 siblings, 1 reply; 685+ messages in thread
From: Gregory Heytings @ 2022-08-01 13:14 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, monnier, dgutov


>> It is, indeed.  But here we are talking about big files (say 1 GB). 
>> In that case (and in that case only) it is much better, from a user 
>> viewpoint, to wait say 20 seconds before the file is opened and being 
>> at that point able to freely move through the file, instead of waiting 
>> only 6 seconds, and then having to wait another 10 seconds between two 
>> motion commands like M-> C-p.  In fact, no user expects that a 1 GB 
>> file would open instantaneously.
>
> You can maybe have that for C-p that follows M->, but wouldn't the wait 
> return, with a vengeance, if you insert a single character (because then 
> the buffer needs to be re-scanned)?  If so, we've gained nothing, 
> really.
>

Fortunately no: the buffer doesn't need to be rescanned, syntax-ppss 
caches its result, to avoid having to rescan the whole buffer again and 
again.  At least that's what Stefan and Dmitry told me, and that's what I 
see in my tests.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-01 13:14                                       ` Gregory Heytings
@ 2022-08-01 13:19                                         ` Eli Zaretskii
  2022-08-01 13:34                                           ` Gregory Heytings
  2022-08-01 21:50                                           ` Dmitry Gutov
  0 siblings, 2 replies; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-01 13:19 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, monnier, dgutov

> Date: Mon, 01 Aug 2022 13:14:20 +0000
> From: Gregory Heytings <gregory@heytings.org>
> cc: dgutov@yandex.ru, 56682@debbugs.gnu.org, monnier@iro.umontreal.ca
> 
> > You can maybe have that for C-p that follows M->, but wouldn't the wait 
> > return, with a vengeance, if you insert a single character (because then 
> > the buffer needs to be re-scanned)?  If so, we've gained nothing, 
> > really.
> 
> Fortunately no: the buffer doesn't need to be rescanned, syntax-ppss 
> caches its result, to avoid having to rescan the whole buffer again and 
> again.

But the buffer has changed, so the cache is not necessarily valid,
right?





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-01 12:51                                                                                     ` Gregory Heytings
  2022-08-01 13:13                                                                                       ` Eli Zaretskii
@ 2022-08-01 13:24                                                                                       ` Eli Zaretskii
  2022-08-01 13:38                                                                                         ` Gregory Heytings
  2022-08-01 13:45                                                                                         ` Eli Zaretskii
  1 sibling, 2 replies; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-01 13:24 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: gerd.moellmann, 56682, larsi, monnier

> Date: Mon, 01 Aug 2022 12:51:47 +0000
> From: Gregory Heytings <gregory@heytings.org>
> cc: gerd.moellmann@gmail.com, 56682@debbugs.gnu.org, larsi@gnus.org, 
>     monnier@iro.umontreal.ca
> 
> diff --git a/src/xdisp.c b/src/xdisp.c
> index 8a19b3bda9..9574d06bd5 100644
> --- a/src/xdisp.c
> +++ b/src/xdisp.c
> @@ -3472,6 +3472,9 @@ init_iterator (struct it *it, struct window *w,
>                          &it->bidi_it);
>          }
> 
> +      if (current_buffer->long_line_optimizations_p)
> +       it->narrowed_begv = 0;
> +

Sorry, I wrote that this is OK, but it isn't: if init_iterator is
called with 'struct it' that was already initialized by a previous
call to 'reseat', the above will nuke the narrowing.

So we need something more complicated.  ATM I don't see how to solve
this without manually initializing narrowed_begv before the first call
to init_iterator or start_display.  Hmm...





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-01 13:13                                                                                       ` Eli Zaretskii
@ 2022-08-01 13:30                                                                                         ` Gregory Heytings
  0 siblings, 0 replies; 685+ messages in thread
From: Gregory Heytings @ 2022-08-01 13:30 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: gerd.moellmann, 56682, larsi, monnier


>>> Which means, for example, that tests like this:
>>>
>>>  if (current_buffer->long_line_optimizations_p)
>>>    {
>>>      if (!it->narrowed_begv  <<<<<<<<<<<<<<<<<<<<<<<<<<
>>>         || ((pos.charpos < it->narrowed_begv || pos.charpos > it->narrowed_zv)
>>>             && (!redisplaying_p || it->line_wrap == TRUNCATE)))
>>>
>>> are not necessarily reliable, because we never initialize 
>>> narrowed_begv to zero, AFAICT.  Right?
>>
>> Indeed.  That wasn't a problem with the previous code in which 
>> narrowed_begv was unconditionally assigned.  Now it is.  I think the 
>> following change should be enough to fix this.  Agreed?
>
> Yes, of course.
>

Thanks; now pushed.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-01 13:19                                         ` Eli Zaretskii
@ 2022-08-01 13:34                                           ` Gregory Heytings
  2022-08-01 21:50                                           ` Dmitry Gutov
  1 sibling, 0 replies; 685+ messages in thread
From: Gregory Heytings @ 2022-08-01 13:34 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, monnier, dgutov


>>> You can maybe have that for C-p that follows M->, but wouldn't the 
>>> wait return, with a vengeance, if you insert a single character 
>>> (because then the buffer needs to be re-scanned)?  If so, we've gained 
>>> nothing, really.
>>
>> Fortunately no: the buffer doesn't need to be rescanned, syntax-ppss 
>> caches its result, to avoid having to rescan the whole buffer again and 
>> again.
>
> But the buffer has changed, so the cache is not necessarily valid, 
> right?
>

I didn't look at the internals of syntax-ppss, but I'd guess (and again my 
tests seem to confirm) that it was designed well enough, and doesn't need 
to rescan the whole buffer whenever a single character is inserted.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-01 13:24                                                                                       ` Eli Zaretskii
@ 2022-08-01 13:38                                                                                         ` Gregory Heytings
  2022-08-01 13:45                                                                                         ` Eli Zaretskii
  1 sibling, 0 replies; 685+ messages in thread
From: Gregory Heytings @ 2022-08-01 13:38 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: gerd.moellmann, 56682, larsi, monnier

[-- Attachment #1: Type: text/plain, Size: 995 bytes --]


>> diff --git a/src/xdisp.c b/src/xdisp.c
>> index 8a19b3bda9..9574d06bd5 100644
>> --- a/src/xdisp.c
>> +++ b/src/xdisp.c
>> @@ -3472,6 +3472,9 @@ init_iterator (struct it *it, struct window *w,
>>                          &it->bidi_it);
>>          }
>>
>> +      if (current_buffer->long_line_optimizations_p)
>> +       it->narrowed_begv = 0;
>> +
>
> Sorry, I wrote that this is OK, but it isn't: if init_iterator is called 
> with 'struct it' that was already initialized by a previous call to 
> 'reseat', the above will nuke the narrowing.
>
> So we need something more complicated.  ATM I don't see how to solve 
> this without manually initializing narrowed_begv before the first call 
> to init_iterator or start_display.  Hmm...
>

Hmmm...  So I wasn't completely wrong when I wasn't sure it was TRT 😉 
It's a chicken-and-egg problem.  On the other hand, even if we nuke the 
narrowing there, it will be recomputed two lines later, which should be 
okay.

^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-01 13:24                                                                                       ` Eli Zaretskii
  2022-08-01 13:38                                                                                         ` Gregory Heytings
@ 2022-08-01 13:45                                                                                         ` Eli Zaretskii
  2022-08-01 15:08                                                                                           ` Gregory Heytings
  1 sibling, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-01 13:45 UTC (permalink / raw)
  To: gregory; +Cc: gerd.moellmann, 56682, larsi, monnier

> Date: Mon, 01 Aug 2022 16:24:00 +0300
> From: Eli Zaretskii <eliz@gnu.org>
> Cc: gerd.moellmann@gmail.com, 56682@debbugs.gnu.org, larsi@gnus.org,
>  monnier@iro.umontreal.ca
> 
> > diff --git a/src/xdisp.c b/src/xdisp.c
> > index 8a19b3bda9..9574d06bd5 100644
> > --- a/src/xdisp.c
> > +++ b/src/xdisp.c
> > @@ -3472,6 +3472,9 @@ init_iterator (struct it *it, struct window *w,
> >                          &it->bidi_it);
> >          }
> > 
> > +      if (current_buffer->long_line_optimizations_p)
> > +       it->narrowed_begv = 0;
> > +
> 
> Sorry, I wrote that this is OK, but it isn't: if init_iterator is
> called with 'struct it' that was already initialized by a previous
> call to 'reseat', the above will nuke the narrowing.
> 
> So we need something more complicated.  ATM I don't see how to solve
> this without manually initializing narrowed_begv before the first call
> to init_iterator or start_display.  Hmm...

I think we should simply unconditionally recompute the narrowing in
'reseat'.  At least I couldn't think of a situation where that would
cause trouble, and 'reseat' is called rarely enough not to make this
expensive.  Am I missing something?

And another nit:

  if (current_buffer->long_line_optimizations_p)
    {
      if (!it->narrowed_begv
	  || ((pos.charpos < it->narrowed_begv || pos.charpos > it->narrowed_zv)
	      && (!redisplaying_p || it->line_wrap == TRUNCATE)))
	{
	  it->narrowed_begv = get_narrowed_begv (it->w, window_point (it->w));
	  it->narrowed_zv = get_narrowed_zv (it->w, window_point (it->w));
	}
    }

I think this should pass pos.charpos as the 2nd argument to
get_narrowed_begv and get_narrowed_zv, otherwise it might not really
correct anything, right?  In particular, when lines are truncated,
that will definitely happen when we display any line but the very
first.

Or perhaps we should check that using window-point indeed brings
pos.charpos into the narrowed region, and only use pos.charpos if it
doesn't?





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-01 13:45                                                                                         ` Eli Zaretskii
@ 2022-08-01 15:08                                                                                           ` Gregory Heytings
  2022-08-01 15:49                                                                                             ` Eli Zaretskii
  0 siblings, 1 reply; 685+ messages in thread
From: Gregory Heytings @ 2022-08-01 15:08 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: gerd.moellmann, 56682, larsi, monnier


>
> I think we should simply unconditionally recompute the narrowing in 
> 'reseat'.  At least I couldn't think of a situation where that would 
> cause trouble, and 'reseat' is called rarely enough not to make this 
> expensive.  Am I missing something?
>

I don't think you are missing something, and that's what I suggested too. 
So there is nothing to change here, right?

>
> And another nit:
>
>  if (current_buffer->long_line_optimizations_p)
>    {
>      if (!it->narrowed_begv
> 	  || ((pos.charpos < it->narrowed_begv || pos.charpos > it->narrowed_zv)
> 	      && (!redisplaying_p || it->line_wrap == TRUNCATE)))
> 	{
> 	  it->narrowed_begv = get_narrowed_begv (it->w, window_point (it->w));
> 	  it->narrowed_zv = get_narrowed_zv (it->w, window_point (it->w));
> 	}
>    }
>
> I think this should pass pos.charpos as the 2nd argument to 
> get_narrowed_begv and get_narrowed_zv, otherwise it might not really 
> correct anything, right?  In particular, when lines are truncated, that 
> will definitely happen when we display any line but the very first.
>
> Or perhaps we should check that using window-point indeed brings 
> pos.charpos into the narrowed region, and only use pos.charpos if it 
> doesn't?
>

I changed this into:

   if (current_buffer->long_line_optimizations_p)
     {
       if (!it->narrowed_begv)
         {
           it->narrowed_begv = get_narrowed_begv (it->w, window_point (it->w));
           it->narrowed_zv = get_narrowed_zv (it->w, window_point (it->w));
         }
       else if ((pos.charpos < it->narrowed_begv || pos.charpos > it->narrowed_zv)
                 && (!redisplaying_p || it->line_wrap == TRUNCATE))
         {
           it->narrowed_begv = get_narrowed_begv (it->w, pos.charpos);
           it->narrowed_zv = get_narrowed_zv (it->w, pos.charpos);
         }
     }

which seems better indeed.  Is that okay from your point of view?





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-01 15:08                                                                                           ` Gregory Heytings
@ 2022-08-01 15:49                                                                                             ` Eli Zaretskii
  0 siblings, 0 replies; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-01 15:49 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: gerd.moellmann, 56682, larsi, monnier

> Date: Mon, 01 Aug 2022 15:08:42 +0000
> From: Gregory Heytings <gregory@heytings.org>
> cc: gerd.moellmann@gmail.com, 56682@debbugs.gnu.org, larsi@gnus.org, 
>     monnier@iro.umontreal.ca
> 
> > Or perhaps we should check that using window-point indeed brings 
> > pos.charpos into the narrowed region, and only use pos.charpos if it 
> > doesn't?
> >
> 
> I changed this into:
> 
>    if (current_buffer->long_line_optimizations_p)
>      {
>        if (!it->narrowed_begv)
>          {
>            it->narrowed_begv = get_narrowed_begv (it->w, window_point (it->w));
>            it->narrowed_zv = get_narrowed_zv (it->w, window_point (it->w));
>          }
>        else if ((pos.charpos < it->narrowed_begv || pos.charpos > it->narrowed_zv)
>                  && (!redisplaying_p || it->line_wrap == TRUNCATE))
>          {
>            it->narrowed_begv = get_narrowed_begv (it->w, pos.charpos);
>            it->narrowed_zv = get_narrowed_zv (it->w, pos.charpos);
>          }
>      }
> 
> which seems better indeed.  Is that okay from your point of view?

Yes, thanks.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-21 18:00 bug#56682: Fix the long lines font locking related slowdowns Gregory Heytings
  2022-07-21 18:04 ` Eli Zaretskii
@ 2022-08-01 16:34 ` Eli Zaretskii
  2022-08-01 16:49   ` Gregory Heytings
  1 sibling, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-01 16:34 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: gerd.moellmann, 56682, larsi, monnier

This hunk:

> @@ -8894,7 +8891,7 @@ get_visually_first_element (struct it *it)
>  				find_newline_no_quit (IT_CHARPOS (*it),
>  						      IT_BYTEPOS (*it), -1,
>  						      &it->bidi_it.bytepos),
> -				it->narrowed_begv);
> +				get_closer_narrowed_begv (it->w, IT_CHARPOS (*it)));
>        bidi_paragraph_init (it->paragraph_embedding, &it->bidi_it, true);
>        do
>  	{

isn't quite right, I think.

Can you explain which, if any, problems you saw or had in mind, and
what and how did you want to fix them with this particular hunk?  I'd
then suggest a better change (or agree with your change, in case I
missed something).

Thanks.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-01 16:34 ` Eli Zaretskii
@ 2022-08-01 16:49   ` Gregory Heytings
  2022-08-01 17:08     ` Eli Zaretskii
  0 siblings, 1 reply; 685+ messages in thread
From: Gregory Heytings @ 2022-08-01 16:49 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: gerd.moellmann, 56682, larsi, monnier


>
> Can you explain which, if any, problems you saw or had in mind, and what 
> and how did you want to fix them with this particular hunk?  I'd then 
> suggest a better change (or agree with your change, in case I missed 
> something).
>

You're correct, now that I think again about this, it was just wrong. 
Fixed.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-01 16:49   ` Gregory Heytings
@ 2022-08-01 17:08     ` Eli Zaretskii
  0 siblings, 0 replies; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-01 17:08 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: gerd.moellmann, 56682, larsi, monnier

> Date: Mon, 01 Aug 2022 16:49:55 +0000
> From: Gregory Heytings <gregory@heytings.org>
> cc: gerd.moellmann@gmail.com, 56682@debbugs.gnu.org, larsi@gnus.org, 
>     monnier@iro.umontreal.ca
> 
> > Can you explain which, if any, problems you saw or had in mind, and what 
> > and how did you want to fix them with this particular hunk?  I'd then 
> > suggest a better change (or agree with your change, in case I missed 
> > something).
> 
> You're correct, now that I think again about this, it was just wrong. 
> Fixed.

OK, thanks.  But anyway: the possibly slow part there is not
find_newline_no_quit, it's the loop that calls
bidi_move_to_visually_next afterwards, in case the newline is very far
back.  So if we ever want to make that part faster, we should force
that loop to start from narrowed_begv, not from where we find the
previous newline.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-31 22:45                             ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-07-31 23:12                               ` Gregory Heytings
  2022-08-01 11:58                               ` Eli Zaretskii
@ 2022-08-01 18:09                               ` Gregory Heytings
  2022-08-02  8:12                                 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2 siblings, 1 reply; 685+ messages in thread
From: Gregory Heytings @ 2022-08-01 18:09 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: 56682, Eli Zaretskii

[-- Attachment #1: Type: text/plain, Size: 1582 bytes --]


>>> Try `M-: (use-global-map (make-keymap)) RET`
>>>
>>> Should we prevent users from doing that?
>>
>> It's a misleading question.  No "user" would ever do that.  Sure, it's 
>> a nice example, but only an Elisp hacker would do that, in the middle 
>> of a debugging session, and they would do that on purpose (although 
>> perhaps without knowing the effect in advance).  Which has nothing to 
>> do with a regular user who just opens a file.
>
> FWIW, the above is my standard example because I ended up doing exactly 
> that by accident, locking myself out of the session I was trying to 
> debug, so in a sense, I'd have been happy (that one time) if Emacs had 
> prevented me from doing it.
>

So... what do you think of the following? 😉

diff --git a/src/keymap.c b/src/keymap.c
index 506b755e5d..e42bc64717 100644
--- a/src/keymap.c
+++ b/src/keymap.c
@@ -1881,6 +1881,17 @@ DEFUN ("use-global-map", Fuse_global_map, 
Suse_global_map, 1, 1, 0,
    (Lisp_Object keymap)
  {
    keymap = get_keymap (keymap, 1, 1);
+
+  /* Prevent locking Emacs if someone inadvertently evaluates
+     (use-global-map (make-keymap)) */
+  if (EQ (Fequal (keymap, Fmake_keymap (Qnil)), Qt))
+    {
+      Lisp_Object meta_colon_key = CALLN (Fvector, make_fixnum (134217786));
+      Lisp_Object default_key = CALLN (Fvector, Qt);
+      Fdefine_key (keymap, meta_colon_key, intern ("eval-expression"), Qnil);
+      Fdefine_key (keymap, default_key, intern ("self-insert-command"), Qnil);
+    }
+
    current_global_map = keymap;

    return Qnil;

^ permalink raw reply related	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-01 13:19                                         ` Eli Zaretskii
  2022-08-01 13:34                                           ` Gregory Heytings
@ 2022-08-01 21:50                                           ` Dmitry Gutov
  2022-08-02  2:27                                             ` Eli Zaretskii
  1 sibling, 1 reply; 685+ messages in thread
From: Dmitry Gutov @ 2022-08-01 21:50 UTC (permalink / raw)
  To: Eli Zaretskii, Gregory Heytings; +Cc: 56682, monnier

On 01.08.2022 16:19, Eli Zaretskii wrote:
>> Date: Mon, 01 Aug 2022 13:14:20 +0000
>> From: Gregory Heytings<gregory@heytings.org>
>> cc:dgutov@yandex.ru,56682@debbugs.gnu.org,monnier@iro.umontreal.ca
>>
>>> You can maybe have that for C-p that follows M->, but wouldn't the wait
>>> return, with a vengeance, if you insert a single character (because then
>>> the buffer needs to be re-scanned)?  If so, we've gained nothing,
>>> really.
>> Fortunately no: the buffer doesn't need to be rescanned, syntax-ppss
>> caches its result, to avoid having to rescan the whole buffer again and
>> again.
> But the buffer has changed, so the cache is not necessarily valid,
> right?

syntax-ppss cache is a list of checkpoints spread along the buffer.

After a modification, only the checkpoints below it are invalidated (to 
be recomputed on-demand later).





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-01 11:23                                         ` Gregory Heytings
@ 2022-08-01 21:53                                           ` Dmitry Gutov
  2022-08-02  7:34                                             ` Gregory Heytings
  2022-08-02 21:32                                           ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  1 sibling, 1 reply; 685+ messages in thread
From: Dmitry Gutov @ 2022-08-01 21:53 UTC (permalink / raw)
  To: Gregory Heytings, Stefan Monnier; +Cc: 56682, Eli Zaretskii

On 01.08.2022 14:23, Gregory Heytings wrote:
>> You might also want to compare to the time to run
>>
>> (parse-partial-sexp (point-min) (point-max))
>>
>> which is a kind of "speed of light" for `syntax-ppss`.
>>
> 
> What do you mean?  With the above file (benchmark-run 1 
> (parse-partial-sexp (point-min) (point-max))) takes 55 seconds.

Then this is the base price of knowing (with confidence) whether the EOB 
position is inside a paren, inside a string, or inside a comment, all of 
which may be positioned anywhere inside the buffer.

Perhaps someone will come up with further optimizations for the 
parse-partial-sexp implementation (without changing its behavior). 
Likely not by an order of a magnitude, but who knows.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-01 12:12                                   ` Eli Zaretskii
@ 2022-08-01 21:54                                     ` Dmitry Gutov
  2022-08-02  2:31                                       ` Eli Zaretskii
  0 siblings, 1 reply; 685+ messages in thread
From: Dmitry Gutov @ 2022-08-01 21:54 UTC (permalink / raw)
  To: Eli Zaretskii, Stefan Monnier; +Cc: 56682, gregory

On 01.08.2022 15:12, Eli Zaretskii wrote:
> But the problem here is that it isn't "people shooting themselves in
> the foot", it's that "major modes shoot their users in the foot".
> IOW, the ones who shoot and the ones who get shot are not the same
> people.
> 
> What do you want a user to do when he/she is faced with a mode which
> makes Emacs very slow?  Such a user cannot blame his/herself; in many
> cases the use doesn't even know enough to realize it's the major mode
> and its fontifications that are the culprit.

Just like we do in such cases where an Emacs feature is not optimized 
enough for a given use case: wait for the user to realize the situation 
can and should be improved, and file a bug report/feature request.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-01 12:08                                   ` Eli Zaretskii
@ 2022-08-02  1:05                                     ` Dmitry Gutov
  2022-08-02  7:55                                       ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-08-02 12:35                                       ` Eli Zaretskii
  0 siblings, 2 replies; 685+ messages in thread
From: Dmitry Gutov @ 2022-08-02  1:05 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, gregory, monnier

On 01.08.2022 15:08, Eli Zaretskii wrote:
>> Date: Mon, 1 Aug 2022 04:23:21 +0300
>> Cc: 56682@debbugs.gnu.org, Eli Zaretskii <eliz@gnu.org>,
>>   Stefan Monnier <monnier@iro.umontreal.ca>
>> From: Dmitry Gutov <dgutov@yandex.ru>
>>
>> IIUC this state of affairs is caused by your chosen approach to speeding
>> up font-lock (hard narrowing while it is called), which makes the
>> initial call to syntax-ppss happen inside that narrowing as well.
>>
>> The alternative being that font-lock would call syntax-ppss right away
>> with no restriction, but then only apply highlighting to limited parts
>> of the buffer.
> 
> AFAIU, this seems to assume that highlighting is much faster than
> syntax-ppss.  Is that a given?  If not, I don't think I understand how
> this could help.

I don't have the concrete numbers at hand, but from experience I'd say:

- syntax-ppss over the whole buffer is fast-ish. But it takes O(N) time 
of course, and the bigger the buffer is, the longer it'll take. Not much 
we can do about it.
- font-lock has to do more work, so over the whole buffer it will take 
an order of a magnitude more time than syntax-ppss.

Further:

- syntax-ppss is also important for correctness: for commands to 
understand whether the point is inside a string, comments, etc. So it's 
better to avoid applying narrowing when calling it. Unless you're in a 
multiple-major-modes situation.
- font-lock calls syntax-ppss.

So ideally font-lock is either called with undo-able narrowing, or is 
simply passed a range of positions, and shouldn't fontify too far from them.

The latter seems to be the case already (if you open xdisp.c and press 
M->, only top and bottom of the buffer are fontified), with the caveat 
that font-lock always tries to backtrack to BOL when fontifying the 
current hunk. Which makes sense, of course, but could be tweaked for 
long lines to avoid re-fontifying the whole buffer again and again.

IOW, IIUC the fix for font-lock performance could be better implemented 
inside font-lock itself, as long as all the info about whether the 
current line is "long" is available to Lisp.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-01 21:50                                           ` Dmitry Gutov
@ 2022-08-02  2:27                                             ` Eli Zaretskii
  2022-08-02 14:10                                               ` Dmitry Gutov
  0 siblings, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-02  2:27 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: 56682, gregory, monnier

> Date: Tue, 2 Aug 2022 00:50:10 +0300
> Cc: 56682@debbugs.gnu.org, monnier@iro.umontreal.ca
> From: Dmitry Gutov <dgutov@yandex.ru>
> 
> On 01.08.2022 16:19, Eli Zaretskii wrote:
> >> Date: Mon, 01 Aug 2022 13:14:20 +0000
> >> From: Gregory Heytings<gregory@heytings.org>
> >> cc:dgutov@yandex.ru,56682@debbugs.gnu.org,monnier@iro.umontreal.ca
> >>
> >>> You can maybe have that for C-p that follows M->, but wouldn't the wait
> >>> return, with a vengeance, if you insert a single character (because then
> >>> the buffer needs to be re-scanned)?  If so, we've gained nothing,
> >>> really.
> >> Fortunately no: the buffer doesn't need to be rescanned, syntax-ppss
> >> caches its result, to avoid having to rescan the whole buffer again and
> >> again.
> > But the buffer has changed, so the cache is not necessarily valid,
> > right?
> 
> syntax-ppss cache is a list of checkpoints spread along the buffer.
> 
> After a modification, only the checkpoints below it are invalidated (to 
> be recomputed on-demand later).

So a suitably-concocted replace command will still invalidate a lot of
that cache, right?





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-01 21:54                                     ` Dmitry Gutov
@ 2022-08-02  2:31                                       ` Eli Zaretskii
  2022-08-02 14:29                                         ` Dmitry Gutov
  0 siblings, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-02  2:31 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: 56682, gregory, monnier

> Date: Tue, 2 Aug 2022 00:54:55 +0300
> Cc: 56682@debbugs.gnu.org, gregory@heytings.org
> From: Dmitry Gutov <dgutov@yandex.ru>
> 
> On 01.08.2022 15:12, Eli Zaretskii wrote:
> > But the problem here is that it isn't "people shooting themselves in
> > the foot", it's that "major modes shoot their users in the foot".
> > IOW, the ones who shoot and the ones who get shot are not the same
> > people.
> > 
> > What do you want a user to do when he/she is faced with a mode which
> > makes Emacs very slow?  Such a user cannot blame his/herself; in many
> > cases the use doesn't even know enough to realize it's the major mode
> > and its fontifications that are the culprit.
> 
> Just like we do in such cases where an Emacs feature is not optimized 
> enough for a given use case: wait for the user to realize the situation 
> can and should be improved, and file a bug report/feature request.

The intent of this activity is to make Emacs reasonably performant and
responsive in the relevant use cases without asking them to wait for
something that likely won't happen.

IOW, in this case the Emacs developers, due to long-standing bug
reports about this situation, recognized that it _can_ be improved,
albeit in slightly unorthodox ways, and have taken the measures to
optimize Emacs for the users.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-01  9:34                                     ` Gregory Heytings
  2022-08-01  9:46                                       ` Dmitry Gutov
  2022-08-01 11:06                                       ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2022-08-02  3:01                                       ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2 siblings, 0 replies; 685+ messages in thread
From: Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2022-08-02  3:01 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, Eli Zaretskii, Stefan Monnier, Dmitry Gutov

Gregory Heytings <gregory@heytings.org> writes:

>
> +  bool_bf long_line_syntax_ppss_done_p : 1;

Please write a comment for every bitfield in that struct.

> +	      current_buffer->long_line_syntax_ppss_done_p = 1;

Why not write "true" instead of "1"?

> +	      CALLN (Ffuncall, intern ("syntax-ppss"), Fpoint_max ());

Why not write this instead:

  call2 (Qsyntax_ppss, Fpoint_max ());

of course, with the appropriate DEFSYM added to the right file?
I think calling "intern" with a static string in C code is an example of
lazy programming.  At the very least, it unduly wastes cycles.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-01 21:53                                           ` Dmitry Gutov
@ 2022-08-02  7:34                                             ` Gregory Heytings
  2022-08-02 11:07                                               ` Dmitry Gutov
  0 siblings, 1 reply; 685+ messages in thread
From: Gregory Heytings @ 2022-08-02  7:34 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: 56682, Eli Zaretskii, Stefan Monnier


>
> Perhaps someone will come up with further optimizations for the 
> parse-partial-sexp implementation (without changing its behavior). 
> Likely not by an order of a magnitude, but who knows.
>

Do I understand correctly that you do not plan to work on this?  If so, 
I'll add it to my TODO list.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-01 12:04                                 ` Eli Zaretskii
  2022-08-01 12:20                                   ` Gregory Heytings
@ 2022-08-02  7:48                                   ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  1 sibling, 0 replies; 685+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2022-08-02  7:48 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, Gregory Heytings, dgutov

> used, for some reason) jit-lock-defer feature: if you set
> jit-lock-defer-time to a large enough value, M-> followed by C-p will
> not be as slow as they are now, I think.

I think currently, with such a setting, in Gregory's example, the 50s of
`syntax-ppss` will still bite the users because they're uninterruptible,
although if the users happen to leave Emacs idle at the right time they
may not notice.

We could/should make sure the 50s are done "in the background" and can
be interrupted at any time.


        Stefan






^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-01 12:20                                   ` Gregory Heytings
  2022-08-01 13:04                                     ` Eli Zaretskii
@ 2022-08-02  7:51                                     ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  1 sibling, 0 replies; 685+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2022-08-02  7:51 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, Eli Zaretskii, dgutov

> It is, indeed.  But here we are talking about big files (say 1 GB).  In that
> case (and in that case only) it is much better, from a user viewpoint, to
> wait say 20 seconds before the file is opened and being at that point able
> to freely move through the file, instead of waiting only 6 seconds, and then
> having to wait another 10 seconds between two motion commands like M-> C-p.
> In fact, no user expects that a 1 GB file would open instantaneously.

The problem will re-occur if you change something at the beginning of
the buffer and then go back to the end of the buffer.

I think something like `font-lock-defer` which displays the text
unfontified until we had time to apply the fontification should make the
1GB case much more usable (tho currently, it's probably not quite good
enough).


        Stefan






^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-02  1:05                                     ` Dmitry Gutov
@ 2022-08-02  7:55                                       ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-08-02 14:08                                         ` Dmitry Gutov
  2022-08-02 12:35                                       ` Eli Zaretskii
  1 sibling, 1 reply; 685+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2022-08-02  7:55 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: 56682, Eli Zaretskii, gregory

> only top and bottom of the buffer are fontified), with the caveat that
> font-lock always tries to backtrack to BOL when fontifying the current
> hunk. Which makes sense, of course, but could be tweaked for long lines to
> avoid re-fontifying the whole buffer again and again.

It has already been (recently) tweaked for this on `master`.


        Stefan






^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-01 11:58                               ` Eli Zaretskii
@ 2022-08-02  8:10                                 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-08-02  8:22                                   ` Gregory Heytings
  2022-08-05 12:59                                 ` Dmitry Gutov
  1 sibling, 1 reply; 685+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2022-08-02  8:10 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, gregory

> Given this situation, it sounds reasonable to start by restricting
> font-lock.

I fully agree.  The current behavior is the right default.

> As I wrote elsewhere, I'm okay with extending 'widen' so that it could
> "unlock" the locked narrowing, which could then be used in major modes
> that convince us their performance is adequate (or clearly announce in
> their docs that they don't care about files with long lines ;-).

`post-command-hook` also has been abused in all kinds of ways that suck
for the user if they have too-large buffers, or too many buffers, or too
many frames, or ...
That has never prompted calls to ban it completely.

So, I think it's important to provide this option to "unlock the
widening".  Even for purely philosophical reasons.

We can even add a user-option to "re-lock" the widening which would
prevent the "unlock the widening" from working, so that users can
override a poorly-thought-out use of widening which makes their large
file unusable (tho I'd argue that you can get the same result with an
`advice-add`).

Also, let's not forget that the speed impact of large buffers is not
limited to the redisplay, so trying to work extra-hard to eliminate all
possible cases of the redisplay spending too much time in large buffers
won't prevent "apparent lockups" where the time is spent in the command
(or some hook run at that occasion) rather than in the redisplay itself.


        Stefan






^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-01 18:09                               ` Gregory Heytings
@ 2022-08-02  8:12                                 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  0 siblings, 0 replies; 685+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2022-08-02  8:12 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, Eli Zaretskii

> So... what do you think of the following? 😉

:-)


        Stefan






^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-02  8:10                                 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2022-08-02  8:22                                   ` Gregory Heytings
  2022-08-02  9:25                                     ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  0 siblings, 1 reply; 685+ messages in thread
From: Gregory Heytings @ 2022-08-02  8:22 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: 56682, Eli Zaretskii


>
> `post-command-hook` also has been abused in all kinds of ways that suck 
> for the user if they have too-large buffers, or too many buffers, or too 
> many frames, or ...
>

Indeed.  Which is why you'll see on the feature branch that in buffers 
with long lines post-command-hook is now also subjected to a locked 
narrowing.

>
> We can even add a user-option to "re-lock" the widening which would 
> prevent the "unlock the widening" from working, so that users can 
> override a poorly-thought-out use of widening which makes their large 
> file unusable (tho I'd argue that you can get the same result with an 
> `advice-add`).
>

I don't understand what you have in mind here.  How would such a user 
option be different from (setq long-line-threshold nil)?  Do you mean that 
we should make it possible for users to fine-tune each and every aspect of 
the optimizations, with a bunch of user configurable options?

>
> Also, let's not forget that the speed impact of large buffers is not 
> limited to the redisplay, so trying to work extra-hard to eliminate all 
> possible cases of the redisplay spending too much time in large buffers 
> won't prevent "apparent lockups" where the time is spent in the command 
> (or some hook run at that occasion) rather than in the redisplay itself.
>

It is not limited to redisplay only, but by far the largest fraction of 
the speed impact is (or rather was) in redisplay, and asymptotically so. 
Commands that used to take minutes on a reasonably recent computer now 
take a fraction of a second, only because redisplay is now faster.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-02  8:22                                   ` Gregory Heytings
@ 2022-08-02  9:25                                     ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-08-02 10:00                                       ` Gregory Heytings
  0 siblings, 1 reply; 685+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2022-08-02  9:25 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, Eli Zaretskii

>> `post-command-hook` also has been abused in all kinds of ways that suck
>> for the user if they have too-large buffers, or too many buffers, or too
>> many frames, or ...
> Indeed.  Which is why you'll see on the feature branch that in buffers with
> long lines post-command-hook is now also subjected to a locked narrowing.

But the problems can also affect buffers without long lines (just with
many lines).  Or the case of having a thousand buffers opened.  Or ...

>> We can even add a user-option to "re-lock" the widening which would
>> prevent the "unlock the widening" from working, so that users can override
>> a poorly-thought-out use of widening which makes their large file unusable
>> (tho I'd argue that you can get the same result with an `advice-add`).
> I don't understand what you have in mind here.

If the major mode overrides the locked narrowing which causes the users
experience to be unbearable in long buffers, the users could set this
variable to override the override (while sending a bug report to the
major mode's maintainers and waiting for the bug to be fixed).

> It is not limited to redisplay only, but by far the largest fraction of the
> speed impact is (or rather was) in redisplay, and asymptotically
> so. Commands that used to take minutes on a reasonably recent computer now
> take a fraction of a second, only because redisplay is now faster.

Yes, your work is *really* appreciated in this area.  I'm just pointing
out that there's no point trying to make it technically *impossible* for
users to shoot themselves in the foot making redisplay too slow,
because there are still plenty of other ways they can shoot themselves
in the foot, and because every time we make something undesirable
impossible, we *also* make it impossible to do some desirable things
(even if we can't yet imagine what those might be).


        Stefan






^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-02  9:25                                     ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2022-08-02 10:00                                       ` Gregory Heytings
  2022-08-02 21:40                                         ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  0 siblings, 1 reply; 685+ messages in thread
From: Gregory Heytings @ 2022-08-02 10:00 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: 56682, Eli Zaretskii


>
> But the problems can also affect buffers without long lines (just with 
> many lines).
>

Yes, and that's what sits next on my list: "too large" buffers.

>
> Or the case of having a thousand buffers opened.  Or ...
>

I don't think the "too many buffers" case is worth investigating. 
Because it won't lock Emacs suddenly, like what we had.  It could make 
Emacs gradually slower, in which case the user can take some appropriate 
measures.

>
> If the major mode overrides the locked narrowing which causes the users 
> experience to be unbearable in long buffers, the users could set this 
> variable to override the override (while sending a bug report to the 
> major mode's maintainers and waiting for the bug to be fixed).
>

I see what you mean now.  But I don't think it would work.  What I want is 
to take reasonable measures to ensure that Emacs remains responsive "in 
spite of" mode maintainers.

>
> Yes, your work is *really* appreciated in this area.  I'm just pointing 
> out that there's no point trying to make it technically *impossible* for 
> users to shoot themselves in the foot making redisplay too slow,
>

Yes, with that I agree.  But as Eli said, it's not users who shoot 
themselves in the foot, it's innocent users that are shooted in the foot 
by syntax-ppss and/or by mode maintainers who are not careful enough. 
And as I said its not technically impossible for this to happen, users can 
freely unset long-line-threshold (although that's not recommended of 
course).

>
> because there are still plenty of other ways they can shoot themselves 
> in the foot,
>

I'm curious, are there other ways for a regular user (*not* an Elisp 
hacker!) to make Emacs completely unresponsive with regular editing 
commands, starting with emacs -Q?

>
> and because every time we make something undesirable impossible, we 
> *also* make it impossible to do some desirable things (even if we can't 
> yet imagine what those might be).
>

I'm curious again, because I cannot imagine what that could be either.

Also note that you can blame yourself if you don't like the locked 
narrowing idea.  See the following three lines which you added ten years 
ago in eval.c:

/* Don't export this variable to Elisp, so no one can mess with it
    (Just imagine if someone makes it buffer-local).  */
Funintern (Qinternal_interpreter_environment, Qnil);

and which make it technically impossible to do something, incidentally 
without providing a way for Elisp hackers to escape that impossibility.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-02  7:34                                             ` Gregory Heytings
@ 2022-08-02 11:07                                               ` Dmitry Gutov
  0 siblings, 0 replies; 685+ messages in thread
From: Dmitry Gutov @ 2022-08-02 11:07 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, Eli Zaretskii, Stefan Monnier

On 02.08.2022 10:34, Gregory Heytings wrote:
>>
>> Perhaps someone will come up with further optimizations for the 
>> parse-partial-sexp implementation (without changing its behavior). 
>> Likely not by an order of a magnitude, but who knows.
>>
> 
> Do I understand correctly that you do not plan to work on this?  If so, 
> I'll add it to my TODO list.

Please go ahead. The C part of Emacs is far from my area of expertise.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-02  1:05                                     ` Dmitry Gutov
  2022-08-02  7:55                                       ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2022-08-02 12:35                                       ` Eli Zaretskii
  2022-08-02 14:47                                         ` Dmitry Gutov
                                                           ` (2 more replies)
  1 sibling, 3 replies; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-02 12:35 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: 56682, gregory, monnier

> Date: Tue, 2 Aug 2022 04:05:57 +0300
> Cc: 56682@debbugs.gnu.org, gregory@heytings.org, monnier@iro.umontreal.ca
> From: Dmitry Gutov <dgutov@yandex.ru>
> 
> >> The alternative being that font-lock would call syntax-ppss right away
> >> with no restriction, but then only apply highlighting to limited parts
> >> of the buffer.
> > 
> > AFAIU, this seems to assume that highlighting is much faster than
> > syntax-ppss.  Is that a given?  If not, I don't think I understand how
> > this could help.
> 
> I don't have the concrete numbers at hand, but from experience I'd say:
> 
> - syntax-ppss over the whole buffer is fast-ish. But it takes O(N) time 
> of course, and the bigger the buffer is, the longer it'll take. Not much 
> we can do about it.
> - font-lock has to do more work, so over the whole buffer it will take 
> an order of a magnitude more time than syntax-ppss.
> 
> Further:
> 
> - syntax-ppss is also important for correctness: for commands to 
> understand whether the point is inside a string, comments, etc. So it's 
> better to avoid applying narrowing when calling it. Unless you're in a 
> multiple-major-modes situation.
> - font-lock calls syntax-ppss.

I believe I was talking about syntax-ppss being called from font-lock,
indeed.  Before Gregory's changes, if you visit a large file with very
long lines, and interrupt Emacs while it is non-responsive, you will
in many/most cases find yourself in syntax-propertize or its
subroutines, and you will see that it is almost always called to
traverse the entire long line.

> So ideally font-lock is either called with undo-able narrowing, or is 
> simply passed a range of positions, and shouldn't fontify too far from them.

Many major-modes do widen the buffer, though.

> The latter seems to be the case already (if you open xdisp.c and press 
> M->, only top and bottom of the buffer are fontified)

It is not enough to look for faces in order to realize how much of the
buffer was scanned.

> with the caveat that font-lock always tries to backtrack to BOL when
> fontifying the current hunk. Which makes sense, of course, but could
> be tweaked for long lines to avoid re-fontifying the whole buffer
> again and again.

"Tweaked" how?

> IOW, IIUC the fix for font-lock performance could be better implemented 
> inside font-lock itself, as long as all the info about whether the 
> current line is "long" is available to Lisp.

No one will object to making font-lock faster.  But the experts who
can do that are few and far in-between, and seem to have other itches
to scratch, since these issues are known for a long time, and several
times were even discussed at length.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-02  7:55                                       ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2022-08-02 14:08                                         ` Dmitry Gutov
  0 siblings, 0 replies; 685+ messages in thread
From: Dmitry Gutov @ 2022-08-02 14:08 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: 56682, Eli Zaretskii, gregory

On 02.08.2022 10:55, Stefan Monnier wrote:
>> only top and bottom of the buffer are fontified), with the caveat that
>> font-lock always tries to backtrack to BOL when fontifying the current
>> hunk. Which makes sense, of course, but could be tweaked for long lines to
>> avoid re-fontifying the whole buffer again and again.
> It has already been (recently) tweaked for this on `master`.

Sorry I missed that. Commit 15b2138719b34083967001c3903e7560d5e0947c, right?

Then, as long as redisplay avoids narrowing when running 
fontification-functions, everything should work well.

Or at least much better than before.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-02  2:27                                             ` Eli Zaretskii
@ 2022-08-02 14:10                                               ` Dmitry Gutov
  2022-08-02 15:46                                                 ` Eli Zaretskii
  0 siblings, 1 reply; 685+ messages in thread
From: Dmitry Gutov @ 2022-08-02 14:10 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, gregory, monnier

On 02.08.2022 05:27, Eli Zaretskii wrote:
>> syntax-ppss cache is a list of checkpoints spread along the buffer.
>>
>> After a modification, only the checkpoints below it are invalidated (to
>> be recomputed on-demand later).
> So a suitably-concocted replace command will still invalidate a lot of
> that cache, right?

For any cache, one can invent an operation that would result in 
thrashing it repeatedly.

A regular search-replace should work well enough, though. Because when 
the buffer is long, the user is likely, on average, to spend a lot more 
time examining the occurrences and deciding whether to replace each one. 
And since the operation goes from top to bottom, this will likely 
invalidate the list of caches once, and then rebuild it from the 
beginning (or from wherever the first replacement was).





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-02  2:31                                       ` Eli Zaretskii
@ 2022-08-02 14:29                                         ` Dmitry Gutov
  2022-08-02 14:57                                           ` Gregory Heytings
  2022-08-02 16:02                                           ` Eli Zaretskii
  0 siblings, 2 replies; 685+ messages in thread
From: Dmitry Gutov @ 2022-08-02 14:29 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, gregory, monnier

On 02.08.2022 05:31, Eli Zaretskii wrote:
>> Just like we do in such cases where an Emacs feature is not optimized
>> enough for a given use case: wait for the user to realize the situation
>> can and should be improved, and file a bug report/feature request.
> The intent of this activity is to make Emacs reasonably performant and
> responsive in the relevant use cases without asking them to wait for
> something that likely won't happen.
> 
> IOW, in this case the Emacs developers, due to long-standing bug
> reports about this situation, recognized that it_can_  be improved,
> albeit in slightly unorthodox ways, and have taken the measures to
> optimize Emacs for the users.

It would be a shame to have the better-behaving (faster) major modes 
exhibit worse behavior that they could have because of the approach we 
choose to solve the long-lines problem.

Regarding the long-standing bug reports, we did solve a bunch of issues 
already. One major one, IIUC, was redisplay of already fontified text on 
long lines. Another piece of the puzzle was added by Stefan in 
15b2138719b340.

So perhaps we should re-evaluate the testing scenario to see where the 
current bottlenecks are. If we current main issue is the 55s spent in 
syntax-ppss, a more constructive approach would be to look into 
optimizing parse-partial-sexp. Or even give up on certain scenarios, 
admitting that waiting 55s once to visit the end of a 1 GB buffer is not 
so bad (and that could part could also be sped up by setting 
syntax-propertize-function to nil and using a very simple syntax table, 
for instance).





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-02 12:35                                       ` Eli Zaretskii
@ 2022-08-02 14:47                                         ` Dmitry Gutov
  2022-08-02 15:06                                           ` Gregory Heytings
  2022-08-02 16:11                                           ` Eli Zaretskii
  2022-08-02 21:46                                         ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-08-02 21:49                                         ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2 siblings, 2 replies; 685+ messages in thread
From: Dmitry Gutov @ 2022-08-02 14:47 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, gregory, monnier

On 02.08.2022 15:35, Eli Zaretskii wrote:

>> - syntax-ppss is also important for correctness: for commands to
>> understand whether the point is inside a string, comments, etc. So it's
>> better to avoid applying narrowing when calling it. Unless you're in a
>> multiple-major-modes situation.
>> - font-lock calls syntax-ppss.
> 
> I believe I was talking about syntax-ppss being called from font-lock,
> indeed.  Before Gregory's changes, if you visit a large file with very
> long lines, and interrupt Emacs while it is non-responsive, you will
> in many/most cases find yourself in syntax-propertize or its
> subroutines, and you will see that it is almost always called to
> traverse the entire long line.

Interrupt it right after pressing 'M->'? Or at any time during editing 
the buffer later?

The latter really shouldn't happen. If it does, perhaps it's the result 
of narrowing during redisplay, which might blow syntax-ppss's caches.

In any case, if you could point to a scenario and the revision to test 
it on, I'll be sure to take a look.

>> So ideally font-lock is either called with undo-able narrowing, or is
>> simply passed a range of positions, and shouldn't fontify too far from them.
> 
> Many major-modes do widen the buffer, though.

Whether they do or not, font-lock widens by default, see 
font-lock-dont-widen.

>> The latter seems to be the case already (if you open xdisp.c and press
>> M->, only top and bottom of the buffer are fontified)
> 
> It is not enough to look for faces in order to realize how much of the
> buffer was scanned.

I evaluated (next-single-property-change 1 'fontified), when near BOB 
and when near EOB.

>> with the caveat that font-lock always tries to backtrack to BOL when
>> fontifying the current hunk. Which makes sense, of course, but could
>> be tweaked for long lines to avoid re-fontifying the whole buffer
>> again and again.
> 
> "Tweaked" how?

15b2138719b34083 is one example.

>> IOW, IIUC the fix for font-lock performance could be better implemented
>> inside font-lock itself, as long as all the info about whether the
>> current line is "long" is available to Lisp.
> 
> No one will object to making font-lock faster.  But the experts who
> can do that are few and far in-between, and seem to have other itches
> to scratch, since these issues are known for a long time, and several
> times were even discussed at length.

The fact that we have +1 contributor to the C part of Emacs (the display 
engine, etc), and a successful one at that, does nothing about the fact 
that Lisp is easier to write and debug.

If we're able to demonstrate that the remaining bottlenecks are inside 
font-lock, it should be easier to improve there.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-01 11:01                                             ` Gregory Heytings
@ 2022-08-02 14:53                                               ` Dmitry Gutov
  2022-08-02 15:09                                                 ` Gregory Heytings
  2022-08-02 21:18                                               ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  1 sibling, 1 reply; 685+ messages in thread
From: Dmitry Gutov @ 2022-08-02 14:53 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, Eli Zaretskii, Stefan Monnier

On 01.08.2022 14:01, Gregory Heytings wrote:
> 
>>> No, it happens when the buffer is opened.  Given the importance that 
>>> you and Stefan seem to give to that function, it is, with the patch I 
>>> sent in my previous post, called once on the whole buffer (without 
>>> any narrowing) when the file is opened.
>>
>> But if the buffer is not scrolled to the end, shouldn't it be called 
>> with a position that's close to the beginning?
>>
>> That shouldn't force the full buffer scan, meaning this call should 
>> complete quickly.
>>
> 
> I'm trying to reconcile two conflicting constraints.
> 
> It is necessary to add a locked narrowing around fontification-functions 
> and pre/post-command-hook to ensure that Emacs remains responsive.

Perhaps tweaking the value of syntax-wholeline-max could have a similar 
enough effect?

> At the same time, you and Stefan tell me that syntax-ppss does an 
> important job and will not do it correctly with such a locked narrowing, 
> IOW, that at least syntax-ppss should be called without a locked 
> narrowing.  But you also tell me that its result is cached so that a 
> full buffer scan isn't necessary anymore when it has happened at least 
> once.
> 
> So what I'm suggesting is to do a full buffer scan immediately, when the 
> file is opened, without any narrowing.  If that happens, later calls to 
> syntax-ppss inside fontification-functions and pre/post-command-hook 
> will use the cached result of the initial scan, and will do their job 
> correctly even with a locked narrowing.

syntax-ppss has two caches: one for the widened buffer (when point-min 
equals to 1), and another for narrowings. The latter cache is always 
cleared when point-min changes.

The latter cache works okay-ish for multiple-major-mode scenario, but if 
redisplay narrows with different limits, that would blow cache often. 
And if the whole chunk is big enough (i.e. bigger than the average 
distance between the cached syntax-ppss positions), that could actually 
result in syntax-ppss working slower than it could.

> Unless I misunderstand something, I think (and my tests seem to confirm) 
> that that would be a workable solution, provided that the initial scan 
> is reasonably fast, that is, at least six times faster than it is now.

I'm afraid this approach is too blunt to be a solution.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-02 14:29                                         ` Dmitry Gutov
@ 2022-08-02 14:57                                           ` Gregory Heytings
  2022-08-02 16:14                                             ` Eli Zaretskii
                                                               ` (2 more replies)
  2022-08-02 16:02                                           ` Eli Zaretskii
  1 sibling, 3 replies; 685+ messages in thread
From: Gregory Heytings @ 2022-08-02 14:57 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: 56682, Eli Zaretskii, monnier


>
> Regarding the long-standing bug reports, we did solve a bunch of issues 
> already. One major one, IIUC, was redisplay of already fontified text on 
> long lines.
>

Try to open the dictionary.json with Emacs on master a month ago.  It's a 
small file (only 18 MB).  On my computer just opening the file with emacs 
-Q takes 220 seconds.  220 seconds during which Emacs is completely 
locked, because of font-lock mode.  If you're not convinced, turn 
font-lock mode off, open the file, and turn font-lock mode on.

>
> Another piece of the puzzle was added by Stefan in 15b2138719b340.
>

That looked promising, but sadly it had only a very limited effect.

>
> So perhaps we should re-evaluate the testing scenario to see where the 
> current bottlenecks are. If we current main issue is the 55s spent in 
> syntax-ppss, a more constructive approach would be to look into 
> optimizing parse-partial-sexp. Or even give up on certain scenarios, 
> admitting that waiting 55s once to visit the end of a 1 GB buffer is not 
> so bad (and that could part could also be sped up by setting 
> syntax-propertize-function to nil and using a very simple syntax table, 
> for instance).
>

It is bad, especially now that it became clear that in fact it's not 
"waiting 55s once" but "waiting 55s each time the buffer is modified and 
you move to another position in the buffer".





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-02 14:47                                         ` Dmitry Gutov
@ 2022-08-02 15:06                                           ` Gregory Heytings
  2022-08-02 21:51                                             ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-08-02 16:11                                           ` Eli Zaretskii
  1 sibling, 1 reply; 685+ messages in thread
From: Gregory Heytings @ 2022-08-02 15:06 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: 56682, Eli Zaretskii, monnier


>
> Whether they do or not, font-lock widens by default, see 
> font-lock-dont-widen.
>

And even if one sets font-lock-dont-widen to nil, mode authors are 
completely free to ignore that setting (assuming they're aware it exists).

>
> If we're able to demonstrate that the remaining bottlenecks are inside 
> font-lock, it should be easier to improve there.
>

It has been demonstrated, as far as I can see, and repeatedly so.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-02 14:53                                               ` Dmitry Gutov
@ 2022-08-02 15:09                                                 ` Gregory Heytings
  2022-08-02 21:19                                                   ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  0 siblings, 1 reply; 685+ messages in thread
From: Gregory Heytings @ 2022-08-02 15:09 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: 56682, Eli Zaretskii, Stefan Monnier


>> It is necessary to add a locked narrowing around 
>> fontification-functions and pre/post-command-hook to ensure that Emacs 
>> remains responsive.
>
> Perhaps tweaking the value of syntax-wholeline-max could have a similar 
> enough effect?
>

It doesn't, alas.

>> Unless I misunderstand something, I think (and my tests seem to 
>> confirm) that that would be a workable solution, provided that the 
>> initial scan is reasonably fast, that is, at least six times faster 
>> than it is now.
>
> I'm afraid this approach is too blunt to be a solution.
>

Indeed, that's my conclusion too.  So until syntax-ppss (at least) is made 
an order of magnitude faster, the right thing to do is to use the forced 
narrowing method.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-02 14:10                                               ` Dmitry Gutov
@ 2022-08-02 15:46                                                 ` Eli Zaretskii
  2022-08-04  1:08                                                   ` Dmitry Gutov
  0 siblings, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-02 15:46 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: 56682, gregory, monnier

> Date: Tue, 2 Aug 2022 17:10:53 +0300
> Cc: 56682@debbugs.gnu.org, gregory@heytings.org, monnier@iro.umontreal.ca
> From: Dmitry Gutov <dgutov@yandex.ru>
> 
> On 02.08.2022 05:27, Eli Zaretskii wrote:
> >> syntax-ppss cache is a list of checkpoints spread along the buffer.
> >>
> >> After a modification, only the checkpoints below it are invalidated (to
> >> be recomputed on-demand later).
> > So a suitably-concocted replace command will still invalidate a lot of
> > that cache, right?
> 
> For any cache, one can invent an operation that would result in 
> thrashing it repeatedly.

Yes, but when thrashing causes delays of dozens of seconds, the result
is not just a rare delay, the result is simply unacceptable.

> A regular search-replace should work well enough, though. Because when 
> the buffer is long, the user is likely, on average, to spend a lot more 
> time examining the occurrences and deciding whether to replace each one. 
> And since the operation goes from top to bottom, this will likely 
> invalidate the list of caches once, and then rebuild it from the 
> beginning (or from wherever the first replacement was).

We want every basic operation in such buffers to perform reasonably
well.  That's the goal of this activity.  Because partial solutions
that sometimes work we already have: there's so-long-mode, there's
longlines.el, and a couple of other trick up our sleeve.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-02 14:29                                         ` Dmitry Gutov
  2022-08-02 14:57                                           ` Gregory Heytings
@ 2022-08-02 16:02                                           ` Eli Zaretskii
  1 sibling, 0 replies; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-02 16:02 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: 56682, gregory, monnier

> Date: Tue, 2 Aug 2022 17:29:47 +0300
> Cc: monnier@iro.umontreal.ca, 56682@debbugs.gnu.org, gregory@heytings.org
> From: Dmitry Gutov <dgutov@yandex.ru>
> 
> > IOW, in this case the Emacs developers, due to long-standing bug
> > reports about this situation, recognized that it_can_  be improved,
> > albeit in slightly unorthodox ways, and have taken the measures to
> > optimize Emacs for the users.
> 
> It would be a shame to have the better-behaving (faster) major modes 
> exhibit worse behavior that they could have because of the approach we 
> choose to solve the long-lines problem.

Like I said: I'm okay with extending 'widen' to allow it to optionally
break the lock on the narrowing.  Then those modes which will indeed
show reasonable performance in these cases can use that optional
behavior.  Otherwise, I think we've waited for such improvements in
the modes long enough.

> Regarding the long-standing bug reports, we did solve a bunch of issues 
> already. One major one, IIUC, was redisplay of already fontified text on 
> long lines. Another piece of the puzzle was added by Stefan in 
> 15b2138719b340.

I invite you and Stefan to show that the improvement is performant
enough in the cases we are using as examples of long lines.

> So perhaps we should re-evaluate the testing scenario to see where the 
> current bottlenecks are. If we current main issue is the 55s spent in 
> syntax-ppss, a more constructive approach would be to look into 
> optimizing parse-partial-sexp. Or even give up on certain scenarios, 
> admitting that waiting 55s once to visit the end of a 1 GB buffer is not 
> so bad (and that could part could also be sped up by setting 
> syntax-propertize-function to nil and using a very simple syntax table, 
> for instance).

I reported the problem with syntax-propertize to Stefan 1.5 month ago,
see https://debbugs.gnu.org/cgi/bugreport.cgi?bug=45898#92.  There was
an improvement in that department, but AFAICT the net result is still
unsatisfactory if you disable the recent long-line optimizations
(e.g., by setting long-line-threshold to nil).

So, unless I'm mistaken, the same scenario described there is still
relevant, and doesn't yet need to be reevaluated.  But more data
points are always welcome, so feel free (you and everyone else) to
test the performance with and without this feature, on different files
with different major modes, and report back what you have found.  At
least I don't think the work on this is completed, we still have a lot
of turf to cover and probably deal with fallout we haven't yet heard
about.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-02 14:47                                         ` Dmitry Gutov
  2022-08-02 15:06                                           ` Gregory Heytings
@ 2022-08-02 16:11                                           ` Eli Zaretskii
  1 sibling, 0 replies; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-02 16:11 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: 56682, gregory, monnier

> Date: Tue, 2 Aug 2022 17:47:12 +0300
> Cc: 56682@debbugs.gnu.org, gregory@heytings.org, monnier@iro.umontreal.ca
> From: Dmitry Gutov <dgutov@yandex.ru>
> 
> > I believe I was talking about syntax-ppss being called from font-lock,
> > indeed.  Before Gregory's changes, if you visit a large file with very
> > long lines, and interrupt Emacs while it is non-responsive, you will
> > in many/most cases find yourself in syntax-propertize or its
> > subroutines, and you will see that it is almost always called to
> > traverse the entire long line.
> 
> Interrupt it right after pressing 'M->'? Or at any time during editing 
> the buffer later?

Just after "C-x C-f" and answering YES to the question whether to
visit it normally.

> The latter really shouldn't happen. If it does, perhaps it's the result 
> of narrowing during redisplay, which might blow syntax-ppss's caches.

I'm talking about running with narrowing disabled.

> In any case, if you could point to a scenario and the revision to test 
> it on, I'll be sure to take a look.

See my other message I sent a few minutes ago.  And I believe Gregory
also pointed to it.

> > Many major-modes do widen the buffer, though.
> 
> Whether they do or not, font-lock widens by default, see 
> font-lock-dont-widen.

Which is a breach of contract with jit-lock, if you ask me.  It's no
accident that jit-lock invokes fontification-functions only on a small
region of the buffer: that's how this feature was designed and
implemented, and its entirely consistent with the overall design of
the basic principle of the Emacs display engine: examine only as much
of the buffer as needed to be displayed.

> >> The latter seems to be the case already (if you open xdisp.c and press
> >> M->, only top and bottom of the buffer are fontified)
> > 
> > It is not enough to look for faces in order to realize how much of the
> > buffer was scanned.
> 
> I evaluated (next-single-property-change 1 'fontified), when near BOB 
> and when near EOB.

That's not enough either.  Try running under a debugger with a
watchpoint on the position point, while fontification-functions run,
and be amazed how many time it moves point waaay out of the region
that is about to be displayed.

> >> with the caveat that font-lock always tries to backtrack to BOL when
> >> fontifying the current hunk. Which makes sense, of course, but could
> >> be tweaked for long lines to avoid re-fontifying the whole buffer
> >> again and again.
> > 
> > "Tweaked" how?
> 
> 15b2138719b34083 is one example.

It's a good improvement, but much more is needed.

Again, why don't you try this yourself, after disabling the recently
added optimizations?

> > No one will object to making font-lock faster.  But the experts who
> > can do that are few and far in-between, and seem to have other itches
> > to scratch, since these issues are known for a long time, and several
> > times were even discussed at length.
> 
> The fact that we have +1 contributor to the C part of Emacs (the display 
> engine, etc), and a successful one at that, does nothing about the fact 
> that Lisp is easier to write and debug.
> 
> If we're able to demonstrate that the remaining bottlenecks are inside 
> font-lock, it should be easier to improve there.

And it will be very easy to disable these optimizations by default
when we decide that they are no longer needed.  Meanwhile, Emacs users
get to edit long lines with reasonable performance.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-02 14:57                                           ` Gregory Heytings
@ 2022-08-02 16:14                                             ` Eli Zaretskii
  2022-08-02 16:19                                               ` Gregory Heytings
  2022-08-02 22:04                                             ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-08-05  2:03                                             ` Dmitry Gutov
  2 siblings, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-02 16:14 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, monnier, dgutov

> Date: Tue, 02 Aug 2022 14:57:25 +0000
> From: Gregory Heytings <gregory@heytings.org>
> cc: Eli Zaretskii <eliz@gnu.org>, 56682@debbugs.gnu.org, 
>     monnier@iro.umontreal.ca
> 
> > Regarding the long-standing bug reports, we did solve a bunch of issues 
> > already. One major one, IIUC, was redisplay of already fontified text on 
> > long lines.
> 
> Try to open the dictionary.json with Emacs on master a month ago.

I believe it can also be done with the current master, just after
setting long-line-threshold to the nil value.  Right?





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-02 16:14                                             ` Eli Zaretskii
@ 2022-08-02 16:19                                               ` Gregory Heytings
  2022-08-03  0:00                                                 ` Dmitry Gutov
  0 siblings, 1 reply; 685+ messages in thread
From: Gregory Heytings @ 2022-08-02 16:19 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, monnier, dgutov


>> Try to open the dictionary.json with Emacs on master a month ago.
>
> I believe it can also be done with the current master, just after 
> setting long-line-threshold to the nil value.  Right?
>

Indeed.  With master from one month ago it's even more crystal-clear that 
you see the statu quo ante.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-01 11:01                                             ` Gregory Heytings
  2022-08-02 14:53                                               ` Dmitry Gutov
@ 2022-08-02 21:18                                               ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-08-02 21:26                                                 ` Gregory Heytings
  1 sibling, 1 reply; 685+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2022-08-02 21:18 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, Eli Zaretskii, Dmitry Gutov

> It is necessary to add a locked narrowing around
> fontification-functions and pre/post-command-hook to ensure that Emacs
> remains responsive.

It's neither necessary (it's perfectly possible to do something quickly
that just needs to look at the first few lines of the buffer to decide
in which way to parse the nearby surrounding bytes, for example) nor
sufficient (it's easy to spend minutes wasting time running in circles
because of a bug, e.g. a bug triggered by the fact that the "unusual"
nature of the visible part of the buffer after an arbitrary narrowing).

It's very useful to get closer to this goal like your code does, but
let's keep things in perspective.


        Stefan






^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-02 15:09                                                 ` Gregory Heytings
@ 2022-08-02 21:19                                                   ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-08-03  2:30                                                     ` Eli Zaretskii
  0 siblings, 1 reply; 685+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2022-08-02 21:19 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, Eli Zaretskii, Dmitry Gutov

> Indeed, that's my conclusion too.  So until syntax-ppss (at least) is made
> an order of magnitude faster, the right thing to do is to use the forced
> narrowing method.

By tying this to "long lines" is wrong, since it has nothing to do with
long lines, only with large buffers.


        Stefan






^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-02 21:18                                               ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2022-08-02 21:26                                                 ` Gregory Heytings
  2022-08-02 22:26                                                   ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  0 siblings, 1 reply; 685+ messages in thread
From: Gregory Heytings @ 2022-08-02 21:26 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: 56682, Eli Zaretskii, Dmitry Gutov


>> It is necessary to add a locked narrowing around 
>> fontification-functions and pre/post-command-hook to ensure that Emacs 
>> remains responsive.
>
> It's neither necessary (it's perfectly possible to do something quickly 
> that just needs to look at the first few lines of the buffer to decide 
> in which way to parse the nearby surrounding bytes, for example) nor 
> sufficient (it's easy to spend minutes wasting time running in circles 
> because of a bug, e.g. a bug triggered by the fact that the "unusual" 
> nature of the visible part of the buffer after an arbitrary narrowing).
>

You're a mathematician, aren't you?  I'm not speaking of mathematical 
(i.e. absolute) necessity here, but of a practical necessity.  And I did 
not say (or thought) that it is sufficient.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-01 11:23                                         ` Gregory Heytings
  2022-08-01 21:53                                           ` Dmitry Gutov
@ 2022-08-02 21:32                                           ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-08-02 21:43                                             ` Gregory Heytings
  1 sibling, 1 reply; 685+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2022-08-02 21:32 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, Eli Zaretskii, Dmitry Gutov

Gregory Heytings [2022-08-01 11:23:52] wrote:

>>> The problem is that this is, as I said, slow.  On my laptop, opening
>>> a 1 GB file takes about 6 seconds.  The call to syntax-ppss adds 70
>>> seconds, so opening a large file becomes an order of magnitude slower (13
>>> times slower).
>>
>> It's meaningless to talk about the time taken by `syntax-ppss` without
>> specifying the major mode that was in use.
>>
>
> It isn't.  The benchmark above was with a JSON file (js-mode), but you'll
> see the same ratio with an Elisp file for example:

Hmmm was that using the GNU ELPA `json-mode` package?
If so, then indeed there's no `syntax-propertize-function` setup there
and `syntax-ppss` should be ideally not much slower than
`parse-partial-sexp`.

> for I in $(seq 1 2500); do cat lisp/simple.el; done > complex.el
>
> That file opens in about 5 seconds, and (benchmark-run 1 (syntax-ppss
> (point-max))) takes about 45 seconds.
>
> Sure, there are perhaps modes that are slower, but my tests seem to indicate
> that the 1/10 ratio is correct, or IOW that syntax-ppss is an order of
> magnitude slower than opening the file.

You might be right.
But there are still significant differences between different major modes:

    LISP> (benchmark-run 1 (fundamental-mode) (parse-partial-sexp (point-min) (point-max)))
    (0.276774213 0 0.0)
    
    LISP> (benchmark-run 1 (fundamental-mode) (syntax-ppss (point-max)))
    (0.329234636 0 0.0)
    
    ELISP> (benchmark-run 1 (emacs-lisp-mode) (syntax-ppss (point-max)))
    (0.392759479 0 0.0)
    
    ELISP> (benchmark-run 1 (js-mode) (syntax-ppss (point-max)))
    (1.036089104 7 0.20054423700000001)
    
    ELISP> (benchmark-run 1 (nxml-mode) (syntax-ppss (point-max)))
    (1.169055192 7 0.15886504199999996)
    
    ELISP> (benchmark-run 1 (cperl-mode) (syntax-ppss (point-max)))
    (1.857638439 9 0.19724271499999996)

(this was in a 5MB buffer).


        Stefan






^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-02 10:00                                       ` Gregory Heytings
@ 2022-08-02 21:40                                         ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-08-02 22:14                                           ` Gregory Heytings
  0 siblings, 1 reply; 685+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2022-08-02 21:40 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, Eli Zaretskii

> I see what you mean now.  But I don't think it would work.  What I want is
> to take reasonable measures to ensure that Emacs remains responsive "in
> spite of" mode maintainers.

"Reasonable measures" is good.
But once you step into "impossible to circumvent", you start going
directly against the goals of Free Software (and Emacs) to empower the user.

>> because there are still plenty of other ways they can shoot themselves in
>> the foot,
> I'm curious, are there other ways for a regular user (*not* an Elisp
> hacker!) to make Emacs completely unresponsive with regular editing
> commands, starting with emacs -Q?

We've had enough bug reports over the years (and I experienced such
things many times as well), yes.  Usually linked to bugs in some
package, of course, but in many case it wasn't a clear-cut bug, just
some bad interaction of various elements.

> I'm curious again, because I cannot imagine what that could be either.

I suffer from the same lack of imagination, as I sure many others here
do.  To make up for that, we've learned to follow a philosophy of
empowering the users (and not imposing arbitrary limits just because we
couldn't think of good reasons to go beyond them).

> Also note that you can blame yourself if you don't like the locked narrowing
> idea.  See the following three lines which you added ten years ago in
> eval.c:
>
> /* Don't export this variable to Elisp, so no one can mess with it
>    (Just imagine if someone makes it buffer-local).  */
> Funintern (Qinternal_interpreter_environment, Qnil);
>
> and which make it technically impossible to do something, incidentally
> without providing a way for Elisp hackers to escape that impossibility.

:-)


        Stefan






^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-02 21:32                                           ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2022-08-02 21:43                                             ` Gregory Heytings
  2022-08-03 21:26                                               ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  0 siblings, 1 reply; 685+ messages in thread
From: Gregory Heytings @ 2022-08-02 21:43 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: 56682, Eli Zaretskii, Dmitry Gutov


>
> Hmmm was that using the GNU ELPA `json-mode` package?
>

No, it's with emacs -Q.

>> Sure, there are perhaps modes that are slower, but my tests seem to 
>> indicate that the 1/10 ratio is correct, or IOW that syntax-ppss is an 
>> order of magnitude slower than opening the file.
>
> You might be right.
>
> But there are still significant differences between different major 
> modes:
>
> LISP> (benchmark-run 1 (fundamental-mode) (parse-partial-sexp (point-min) (point-max)))
> (0.276774213 0 0.0)
>
> LISP> (benchmark-run 1 (fundamental-mode) (syntax-ppss (point-max)))
> (0.329234636 0 0.0)
>
> ELISP> (benchmark-run 1 (emacs-lisp-mode) (syntax-ppss (point-max)))
> (0.392759479 0 0.0)
>
> ELISP> (benchmark-run 1 (js-mode) (syntax-ppss (point-max)))
> (1.036089104 7 0.20054423700000001)
>
> ELISP> (benchmark-run 1 (nxml-mode) (syntax-ppss (point-max)))
> (1.169055192 7 0.15886504199999996)
>
> ELISP> (benchmark-run 1 (cperl-mode) (syntax-ppss (point-max)))
> (1.857638439 9 0.19724271499999996)
>
> (this was in a 5MB buffer).
>

Yes, that's correct.  (But did you test each mode with the same 5 MB 
buffer?  If so, that's perhaps not representative of what happens in 
reality.)  The general idea is that syntax-ppss is currently an order of 
magnitude too slow for "too large" buffers.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-02 12:35                                       ` Eli Zaretskii
  2022-08-02 14:47                                         ` Dmitry Gutov
@ 2022-08-02 21:46                                         ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-08-03  2:33                                           ` Eli Zaretskii
  2022-08-02 21:49                                         ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2 siblings, 1 reply; 685+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2022-08-02 21:46 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, gregory, Dmitry Gutov

>> So ideally font-lock is either called with undo-able narrowing, or is 
>> simply passed a range of positions, and shouldn't fontify too far from them.
> Many major-modes do widen the buffer, though.

Actually, IIUC this should be considered a bug (it breaks the use of
that major in mmm-mode and friends).

[ And `grep` suggests that less than half of progmodes/*.el use `widen`.  ]


        Stefan






^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-02 12:35                                       ` Eli Zaretskii
  2022-08-02 14:47                                         ` Dmitry Gutov
  2022-08-02 21:46                                         ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2022-08-02 21:49                                         ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-08-02 21:53                                           ` Gregory Heytings
  2 siblings, 1 reply; 685+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2022-08-02 21:49 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, gregory, Dmitry Gutov

> No one will object to making font-lock faster.  But the experts who
> can do that are few and far in-between, and seem to have other itches
> to scratch, since these issues are known for a long time, and several
> times were even discussed at length.

With a locked narrowing that can't be circumvented, this itch can't be
scratched any more :-(


        Stefan






^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-02 15:06                                           ` Gregory Heytings
@ 2022-08-02 21:51                                             ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  0 siblings, 0 replies; 685+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2022-08-02 21:51 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, Eli Zaretskii, Dmitry Gutov

> And even if one sets font-lock-dont-widen to nil, mode authors are
> completely free to ignore that setting (assuming they're aware it exists).

Hmm... `font-lock-dont-widen` is not about telling the major modes's
font-lock code to refrain from narrowing.  It's there so a major mode
(like mmm-mode) can tell font-lock.el to refrain from widening.

The major-mode's own font-lock rules should never need to widen
(because font-lock itself does it, normally).  If they do, it's a bug.


        Stefan






^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-02 21:49                                         ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2022-08-02 21:53                                           ` Gregory Heytings
  2022-08-03  8:42                                             ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  0 siblings, 1 reply; 685+ messages in thread
From: Gregory Heytings @ 2022-08-02 21:53 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: 56682, Eli Zaretskii, Dmitry Gutov


>
> With a locked narrowing that can't be circumvented, this itch can't be 
> scratched any more :-(
>

Once again, it can!  Just M-: (setq long-line-threshold nil) RET.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-02 14:57                                           ` Gregory Heytings
  2022-08-02 16:14                                             ` Eli Zaretskii
@ 2022-08-02 22:04                                             ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-08-05  2:03                                             ` Dmitry Gutov
  2 siblings, 0 replies; 685+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2022-08-02 22:04 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, Eli Zaretskii, Dmitry Gutov

>> Another piece of the puzzle was added by Stefan in 15b2138719b340.
> That looked promising, but sadly it had only a very limited effect.

FWIW, that was also my experience :-(

>> So perhaps we should re-evaluate the testing scenario to see where the
>> current bottlenecks are. If we current main issue is the 55s spent in
>> syntax-ppss, a more constructive approach would be to look into optimizing
>> parse-partial-sexp. Or even give up on certain scenarios, admitting that
>> waiting 55s once to visit the end of a 1 GB buffer is not so bad (and that
>> could part could also be sped up by setting syntax-propertize-function to
>> nil and using a very simple syntax table, for instance).

Those 55s were with a `syntax-propertize-function` set to nil already.

We could do a bit better in some modes, tho, e.g. in fundamental mode no
char has string or comment syntax, IIRC, so we could arguably make
`syntax-ppss` return a value without parsing anything at all (except
that `syntax-ppss` is also supposed to count parentheses, which *are*
present in fundamental-mode).

> It is bad, especially now that it became clear that in fact it's not
> "waiting 55s once" but "waiting 55s each time the buffer is modified and you
> move to another position in the buffer".

Actually, if 55s is the time it takes from BOB to EOB, then the time for
"change at POS1 plus move to POS2" should be approximately

    55s * (POS2 - POS1) / (buffer-size)


-- Stefan






^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-02 21:40                                         ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2022-08-02 22:14                                           ` Gregory Heytings
  2022-08-03  8:39                                             ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  0 siblings, 1 reply; 685+ messages in thread
From: Gregory Heytings @ 2022-08-02 22:14 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: 56682, Eli Zaretskii


>> I see what you mean now.  But I don't think it would work.  What I want 
>> is to take reasonable measures to ensure that Emacs remains responsive 
>> "in spite of" mode maintainers.
>
> "Reasonable measures" is good.
>
> But once you step into "impossible to circumvent", you start going 
> directly against the goals of Free Software (and Emacs) to empower the 
> user.
>

But it is *not* impossible to circumvent.  Just add (setq 
long-line-threshold nil) in your init file, or evaluate it with M-:, or...

>
> I suffer from the same lack of imagination, as I sure many others here 
> do.  To make up for that, we've learned to follow a philosophy of 
> empowering the users (and not imposing arbitrary limits just because we 
> couldn't think of good reasons to go beyond them).
>

I'm all for empowering the users who want power, and the changeset is, 
intentionally, fully backward compatible.  In fact, strictly speaking, 
this changeset does exactly that: it empowers users, they can do things 
they couldn't do earlier.  But I'm also for protecting regular users who 
want a powerful editor that "just works".  In the same vein, we are 
marking a number of local variables as risky, to protect regular users, 
without preventing users from shooting themselves in the foot by adding

(defalias 'risky-local-variable-p 'ignore)

in their init file if they see fit.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-02 21:26                                                 ` Gregory Heytings
@ 2022-08-02 22:26                                                   ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-08-02 22:52                                                     ` Gregory Heytings
  2022-08-03 11:54                                                     ` Eli Zaretskii
  0 siblings, 2 replies; 685+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2022-08-02 22:26 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, Eli Zaretskii, Dmitry Gutov

> You're a mathematician, aren't you?  I'm not speaking of mathematical
> (i.e. absolute) necessity here, but of a practical necessity.

I agree with the practical necessity to narrow.
I strongly disagree with the necessity to make re-widening
technically impossible, I find it fundamentally incompatible with
Emacs's philosophy and can't see any practical justification here.
Just narrow and make sure jit-lock.el and font-lock.el don't
accidentally widen it.  Any other accidental widening should be
considered as a bug anyway (and we could even easily cook up some ad-hoc
advice to try and detect those cases for people like me who lke to run
their Emacs with lots of extra runtime debugging checks).


        Stefan






^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-02 22:26                                                   ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2022-08-02 22:52                                                     ` Gregory Heytings
  2022-08-03  8:34                                                       ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-08-03 11:54                                                     ` Eli Zaretskii
  1 sibling, 1 reply; 685+ messages in thread
From: Gregory Heytings @ 2022-08-02 22:52 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: 56682, Eli Zaretskii, Dmitry Gutov


>
> I strongly disagree with the necessity to make re-widening technically 
> impossible, I find it fundamentally incompatible with Emacs's philosophy 
> and can't see any practical justification here.
>

As I said earlier, offering a way to escape the locked narrowing right 
away simply means that the current solution isn't one anymore.  Elisp 
programmers would take the habit of using (widen-unlock) instead of 
(widen) in their programs, and in a couple of years we'll see again bug 
reports by users who cannot edit buffers with long lines.

>
> Just narrow and make sure jit-lock.el and font-lock.el don't 
> accidentally widen it.
>

Now I'm lost.  Isn't this what is happening right now: "narrow and make 
sure jit-lock and font-lock don't accidentally widen it"?  What am I 
missing?

>
> Any other accidental widening should be considered as a bug anyway (and 
> we could even easily cook up some ad-hoc advice to try and detect those 
> cases for people like me who like to run their Emacs with lots of extra 
> runtime debugging checks).
>

There are I fear too many bugs related to that problem (you just said that 
half of the modes in core do use widen), and it does not seem reasonable 
to hope that they will all be fixed anytime soon.  If at some point they 
are, the current solution will not be necessary anymore, and it will be 
very easy to reset the default value of long-line-threshold to nil.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-02 16:19                                               ` Gregory Heytings
@ 2022-08-03  0:00                                                 ` Dmitry Gutov
  2022-08-03  0:26                                                   ` Dmitry Gutov
  0 siblings, 1 reply; 685+ messages in thread
From: Dmitry Gutov @ 2022-08-03  0:00 UTC (permalink / raw)
  To: Gregory Heytings, Eli Zaretskii; +Cc: 56682, monnier

On 02.08.2022 19:19, Gregory Heytings wrote:
> 
>>> Try to open the dictionary.json with Emacs on master a month ago.
>>
>> I believe it can also be done with the current master, just after 
>> setting long-line-threshold to the nil value.  Right?
>>
> 
> Indeed.  With master from one month ago it's even more crystal-clear 
> that you see the statu quo ante.

If I set long-line-threshold to nil, does that also disable the 
redisplay optimizations related to long lines?

Ones that caused scrolling delays even after the buffer has been fully 
fontified.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-03  0:00                                                 ` Dmitry Gutov
@ 2022-08-03  0:26                                                   ` Dmitry Gutov
  2022-08-03  8:11                                                     ` Gregory Heytings
  2022-08-03 11:56                                                     ` Eli Zaretskii
  0 siblings, 2 replies; 685+ messages in thread
From: Dmitry Gutov @ 2022-08-03  0:26 UTC (permalink / raw)
  To: Gregory Heytings, Eli Zaretskii; +Cc: 56682, monnier

On 03.08.2022 03:00, Dmitry Gutov wrote:
> On 02.08.2022 19:19, Gregory Heytings wrote:
>>
>>>> Try to open the dictionary.json with Emacs on master a month ago.
>>>
>>> I believe it can also be done with the current master, just after 
>>> setting long-line-threshold to the nil value.  Right?
>>>
>>
>> Indeed.  With master from one month ago it's even more crystal-clear 
>> that you see the statu quo ante.
> 
> If I set long-line-threshold to nil, does that also disable the 
> redisplay optimizations related to long lines?
> 
> Ones that caused scrolling delays even after the buffer has been fully 
> fontified.

I mean those that *fixed* the said scrolling delays, of course.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-02 21:19                                                   ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2022-08-03  2:30                                                     ` Eli Zaretskii
  2022-08-03  8:37                                                       ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  0 siblings, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-03  2:30 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: 56682, gregory, dgutov

> From: Stefan Monnier <monnier@iro.umontreal.ca>
> Cc: Dmitry Gutov <dgutov@yandex.ru>,  56682@debbugs.gnu.org,  Eli Zaretskii
>  <eliz@gnu.org>
> Date: Tue, 02 Aug 2022 17:19:53 -0400
> 
> > Indeed, that's my conclusion too.  So until syntax-ppss (at least) is made
> > an order of magnitude faster, the right thing to do is to use the forced
> > narrowing method.
> 
> By tying this to "long lines" is wrong, since it has nothing to do with
> long lines, only with large buffers.

I thought you told me once that syntax-propertize needs to consider
complete lines in some (frequent) situations?





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-02 21:46                                         ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2022-08-03  2:33                                           ` Eli Zaretskii
  0 siblings, 0 replies; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-03  2:33 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: 56682, gregory, dgutov

> From: Stefan Monnier <monnier@iro.umontreal.ca>
> Cc: Dmitry Gutov <dgutov@yandex.ru>,  56682@debbugs.gnu.org,
>   gregory@heytings.org
> Date: Tue, 02 Aug 2022 17:46:49 -0400
> 
> >> So ideally font-lock is either called with undo-able narrowing, or is 
> >> simply passed a range of positions, and shouldn't fontify too far from them.
> > Many major-modes do widen the buffer, though.
> 
> Actually, IIUC this should be considered a bug (it breaks the use of
> that major in mmm-mode and friends).
> 
> [ And `grep` suggests that less than half of progmodes/*.el use `widen`.  ]

That fits my definition of "many".

And we also need to consider specifically those modes which are likely
to happen in files with long lines.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-03  0:26                                                   ` Dmitry Gutov
@ 2022-08-03  8:11                                                     ` Gregory Heytings
  2022-08-03 11:56                                                     ` Eli Zaretskii
  1 sibling, 0 replies; 685+ messages in thread
From: Gregory Heytings @ 2022-08-03  8:11 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: 56682, Eli Zaretskii, monnier

[-- Attachment #1: Type: text/plain, Size: 1350 bytes --]


>>>>> Try to open the dictionary.json with Emacs on master a month ago.
>>>> 
>>>> I believe it can also be done with the current master, just after 
>>>> setting long-line-threshold to the nil value.  Right?
>>> 
>>> Indeed.  With master from one month ago it's even more crystal-clear 
>>> that you see the statu quo ante.
>> 
>> If I set long-line-threshold to nil, does that also disable the 
>> redisplay optimizations related to long lines?
>> 
>> Ones that caused scrolling delays even after the buffer has been fully 
>> fontified.
>
> I mean those that *fixed* the said scrolling delays, of course.
>

To clarify, you need to (setq long-line-threshold nil syntax-wholeline-max 
most-positive-fixnum) to "recover" (more or less) how master was behaving 
a month ago.  Otherwise you'll see the effect of syntax-wholeline-max, 
which can be either positive or negative.

Three recipes (with today's master):

emacs -Q
M-: (setq long-line-threshold nil syntax-wholeline-max most-positive-fixnum) RET
C-x C-f dictionary.json RET y ;; takes 160 seconds
C-e ;; takes 200 seconds

emacs -Q
M-: (setq long-line-threshold nil) RET
C-x C-f dictionary.json RET y ;; immediate
C-e ;; not finished after 1200 seconds (20 minutes), I killed Emacs

emacs -Q
C-x C-f dictionary.json RET y ;; immediate
C-e ;; immediate

^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-02 22:52                                                     ` Gregory Heytings
@ 2022-08-03  8:34                                                       ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-08-03  9:04                                                         ` Gregory Heytings
  0 siblings, 1 reply; 685+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2022-08-03  8:34 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, Eli Zaretskii, Dmitry Gutov

> As I said earlier, offering a way to escape the locked narrowing right away
> simply means that the current solution isn't one anymore.
> Elisp programmers would take the habit of using (widen-unlock) instead of
> (widen) in their programs, and in a couple of years we'll see again bug
> reports by users who cannot edit buffers with long lines.

I don't think we need such a paternalistic view of ELisp programmers.
ELisp programmers aren't out there looking for ways to mess things up.
If we give them good tools that make it easy to solve the usual problems
with needing `widen-unlock`, they won't start using it recklessly everywhere.


        Stefan






^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-03  2:30                                                     ` Eli Zaretskii
@ 2022-08-03  8:37                                                       ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-08-03 12:08                                                         ` Eli Zaretskii
  0 siblings, 1 reply; 685+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2022-08-03  8:37 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, gregory, dgutov

>> > Indeed, that's my conclusion too.  So until syntax-ppss (at least) is made
>> > an order of magnitude faster, the right thing to do is to use the forced
>> > narrowing method.
>> 
>> By tying this to "long lines" is wrong, since it has nothing to do with
>> long lines, only with large buffers.
>
> I thought you told me once that syntax-propertize needs to consider
> complete lines in some (frequent) situations?

Yes, but we're talking about `syntax-ppss` here.  Admittedly,
`syntax-ppss` uses `syntax-propertize` internally, but I think the two
need to be considered separately (and `syntax-propertize` already tries
to bound its work via `syntax-wholeline-max`).


        Stefan






^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-02 22:14                                           ` Gregory Heytings
@ 2022-08-03  8:39                                             ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  0 siblings, 0 replies; 685+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2022-08-03  8:39 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, Eli Zaretskii

>> But once you step into "impossible to circumvent", you start going
>> directly against the goals of Free Software (and Emacs) to empower
>> the user.
> But it is *not* impossible to circumvent.  Just add (setq
> long-line-threshold nil) in your init file, or evaluate it with M-:, or...

That's like saying you can fix the ugly color on strings by turning off font-lock.


        Stefan






^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-02 21:53                                           ` Gregory Heytings
@ 2022-08-03  8:42                                             ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  0 siblings, 0 replies; 685+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2022-08-03  8:42 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, Eli Zaretskii, Dmitry Gutov

>> With a locked narrowing that can't be circumvented, this itch can't be
>> scratched any more :-(
> Once again, it can!  Just M-: (setq long-line-threshold nil) RET.

The itch is to make long-lines work better than with your code.
Not to make them completely unusable.


        Stefan






^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-03  8:34                                                       ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2022-08-03  9:04                                                         ` Gregory Heytings
  2022-08-03 20:33                                                           ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  0 siblings, 1 reply; 685+ messages in thread
From: Gregory Heytings @ 2022-08-03  9:04 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: 56682, Eli Zaretskii, Dmitry Gutov


>
> I don't think we need such a paternalistic view of ELisp programmers. 
> ELisp programmers aren't out there looking for ways to mess things up. 
> If we give them good tools that make it easy to solve the usual problems 
> with needing `widen-unlock`, they won't start using it recklessly 
> everywhere.
>

I'd say it is realistic, based on the observation that half of the 
programming language modes in core do use widen, which they weren't 
supposed to do.

But this discussion is leading nowhere.  If you could point out to an 
actual (or even potential) problem caused by this locked narrowing, apart 
from an occasional mis-fontification, that would perhaps help it to 
advance.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-02 22:26                                                   ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-08-02 22:52                                                     ` Gregory Heytings
@ 2022-08-03 11:54                                                     ` Eli Zaretskii
  2022-08-03 20:36                                                       ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  1 sibling, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-03 11:54 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: 56682, gregory, dgutov

> From: Stefan Monnier <monnier@iro.umontreal.ca>
> Cc: Dmitry Gutov <dgutov@yandex.ru>,  56682@debbugs.gnu.org,  Eli Zaretskii
>  <eliz@gnu.org>
> Date: Tue, 02 Aug 2022 18:26:51 -0400
> 
> I strongly disagree with the necessity to make re-widening
> technically impossible, I find it fundamentally incompatible with
> Emacs's philosophy and can't see any practical justification here.
> Just narrow and make sure jit-lock.el and font-lock.el don't
> accidentally widen it.

What do you mean by "accidentally" in this context?  A program rarely
does anything "accidentally", it almost always does what the
programmer wanted it to do.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-03  0:26                                                   ` Dmitry Gutov
  2022-08-03  8:11                                                     ` Gregory Heytings
@ 2022-08-03 11:56                                                     ` Eli Zaretskii
  2022-08-04  1:08                                                       ` Dmitry Gutov
  1 sibling, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-03 11:56 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: 56682, gregory, monnier

> Date: Wed, 3 Aug 2022 03:26:02 +0300
> From: Dmitry Gutov <dgutov@yandex.ru>
> Cc: 56682@debbugs.gnu.org, monnier@iro.umontreal.ca
> 
> On 03.08.2022 03:00, Dmitry Gutov wrote:
> > On 02.08.2022 19:19, Gregory Heytings wrote:
> >>
> >>>> Try to open the dictionary.json with Emacs on master a month ago.
> >>>
> >>> I believe it can also be done with the current master, just after 
> >>> setting long-line-threshold to the nil value.  Right?
> >>>
> >>
> >> Indeed.  With master from one month ago it's even more crystal-clear 
> >> that you see the statu quo ante.
> > 
> > If I set long-line-threshold to nil, does that also disable the 
> > redisplay optimizations related to long lines?
> > 
> > Ones that caused scrolling delays even after the buffer has been fully 
> > fontified.
> 
> I mean those that *fixed* the said scrolling delays, of course.

I don't think I understand which changes you had in mind (could you
give a less vague pointer?), but I think the answer is NO: that
variable disables only the recent changes related to long lines.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-03  8:37                                                       ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2022-08-03 12:08                                                         ` Eli Zaretskii
  2022-08-03 20:38                                                           ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  0 siblings, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-03 12:08 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: 56682, gregory, dgutov

> From: Stefan Monnier <monnier@iro.umontreal.ca>
> Cc: gregory@heytings.org,  dgutov@yandex.ru,  56682@debbugs.gnu.org
> Date: Wed, 03 Aug 2022 04:37:55 -0400
> 
> >> > Indeed, that's my conclusion too.  So until syntax-ppss (at least) is made
> >> > an order of magnitude faster, the right thing to do is to use the forced
> >> > narrowing method.
> >> 
> >> By tying this to "long lines" is wrong, since it has nothing to do with
> >> long lines, only with large buffers.
> >
> > I thought you told me once that syntax-propertize needs to consider
> > complete lines in some (frequent) situations?
> 
> Yes, but we're talking about `syntax-ppss` here.  Admittedly,
> `syntax-ppss` uses `syntax-propertize` internally, but I think the two
> need to be considered separately (and `syntax-propertize` already tries
> to bound its work via `syntax-wholeline-max`).

What about parse-partial-sexp, which calls scan_sexps_forward?  It
looks like I've misremembered, and that was the culprit in the
scenario we discussed, see
https://debbugs.gnu.org/cgi/bugreport.cgi?bug=45898#92.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-03  9:04                                                         ` Gregory Heytings
@ 2022-08-03 20:33                                                           ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-08-03 21:37                                                             ` Gregory Heytings
  2022-08-03 22:10                                                             ` Gregory Heytings
  0 siblings, 2 replies; 685+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2022-08-03 20:33 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, Eli Zaretskii, Dmitry Gutov

> I'd say it is realistic, based on the observation that half of the
> programming language modes in core do use widen, which they weren't supposed
> to do.

AFAICT, most uses of widen in lisp/progmodes is *not* within code
related to font-lock (unsurprinsingly, since font-lock.el has been
widening "for ever", so widening in the major mode has always been
redundant).

> But this discussion is leading nowhere.  If you could point out to an
> actual (or even potential) problem caused by this locked narrowing,
> apart from an occasional mis-fontification, that would perhaps help it
> to advance.

If I were maintainer I'd just refuse such a change without corresponding
escape hatch, based on the experience gained over the years about how
Emacs is and should be designed.

As a package contributor I just find it offensive that the C code would
go to extra trouble in order to cut me out under the premise that "Elisp
programmers would take the habit of using (widen-unlock) instead of
(widen) in their programs", which I read as "we have to protect ELisp
contributors from themselves".

Also, I'm trying to imagine  scenario that leads to such an abuse:
- under normal circumstances, there are no long lines, so they'll never
  hit a "locked" narrowing and it will thus never occur to them to use
  a `widen-unlock`.
- when they get a bug report with a locked narrowing because of long
  lines, using `widen-unlock` naively is likely to lead to an immediate
  performance problem, so it's unlikely they'll use it.
I just don't buy it.


        Stefan






^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-03 11:54                                                     ` Eli Zaretskii
@ 2022-08-03 20:36                                                       ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-08-04  5:30                                                         ` Eli Zaretskii
  0 siblings, 1 reply; 685+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2022-08-03 20:36 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, gregory, dgutov

> What do you mean by "accidentally" in this context?  A program rarely
> does anything "accidentally", it almost always does what the
> programmer wanted it to do.

I mean that currently font-lock just blindly widens all the time, so we
should fix it so it only widens when it's expected to (i.e. not when
the widening is installed by the LLT code).


        Stefan






^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-03 12:08                                                         ` Eli Zaretskii
@ 2022-08-03 20:38                                                           ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-08-04  5:40                                                             ` Eli Zaretskii
  0 siblings, 1 reply; 685+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2022-08-03 20:38 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, gregory, dgutov

> What about parse-partial-sexp, which calls scan_sexps_forward?  It
> looks like I've misremembered, and that was the culprit in the
> scenario we discussed, see
> https://debbugs.gnu.org/cgi/bugreport.cgi?bug=45898#92.

The wholelines problem did not kick in because of PPS nor `syntax-ppss`
but because of font-lock (which then called `syntax-ppss` which then
called PPS).


        Stefan






^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-02 21:43                                             ` Gregory Heytings
@ 2022-08-03 21:26                                               ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-08-03 21:42                                                 ` Gregory Heytings
  0 siblings, 1 reply; 685+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2022-08-03 21:26 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, Eli Zaretskii, Dmitry Gutov

Gregory Heytings [2022-08-02 21:43:35] wrote:
>> Hmmm was that using the GNU ELPA `json-mode` package?
> No, it's with emacs -Q.

Sorry, I'm not sure how I missed that you said you used `js-mode`.

> Yes, that's correct.  (But did you test each mode with the same 5 MB buffer?

Yup, a 5MB binary file.

> If so, that's perhaps not representative of what happens in reality.)

Indeed, tho it gives a rough idea of how it can change.

> The general idea is that syntax-ppss is currently an order of
> magnitude too slow for "too large" buffers.

And that it can be almost another order of magnitude worse in some major
modes because of `syntax-propertize`.


        Stefan






^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-03 20:33                                                           ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2022-08-03 21:37                                                             ` Gregory Heytings
  2022-08-03 22:42                                                               ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-08-03 22:10                                                             ` Gregory Heytings
  1 sibling, 1 reply; 685+ messages in thread
From: Gregory Heytings @ 2022-08-03 21:37 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: 56682, Eli Zaretskii, Dmitry Gutov


>
> Also, I'm trying to imagine scenario that leads to such an abuse:
>
> - under normal circumstances, there are no long lines, so they'll never 
> hit a "locked" narrowing and it will thus never occur to them to use a 
> `widen-unlock`.
>
> - when they get a bug report with a locked narrowing because of long 
> lines, using `widen-unlock` naively is likely to lead to an immediate 
> performance problem, so it's unlikely they'll use it.
>

When I read this, I thought you had a point, but there's a fallacy in your 
reasoning: using widen-unlock is in fact not likely to lead to an 
immediate performance problem.  The long-line-threshold limit is 
sufficiently high to never be reached in "normal" files, but nothing would 
happen if you cross that limit by a small amount, and nothing would even 
happen at twice or even thrice that limit.

If a mode author gets a bug report that is caused by locked narrowing, 
there is something wrong in the way the mode fontifies the buffer.  There 
is no reason to require access the whole buffer to fontify a small chunk 
of that buffer.  IOW, using widen-unlock there is nearly always wrong (I 
add "nearly" to leave open the possibility that there might be an 
exception).

This is becoming so litigious (you're now telling me that you're offended) 
that I start to believe that the right thing might in fact be to 
completely disable font locking in such buffers.  Would "no highlighting" 
be better than "occasional mis-highlighting" from your point of view?





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-03 21:26                                               ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2022-08-03 21:42                                                 ` Gregory Heytings
  2022-08-03 22:43                                                   ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  0 siblings, 1 reply; 685+ messages in thread
From: Gregory Heytings @ 2022-08-03 21:42 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: 56682, Eli Zaretskii, Dmitry Gutov


>> The general idea is that syntax-ppss is currently an order of magnitude 
>> too slow for "too large" buffers.
>
> And that it can be almost another order of magnitude worse in some major 
> modes because of `syntax-propertize`.
>

That's possible, I don't know.  I might take a look at that later.  But 
note that your reactions are not exactly encouraging me to do so.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-03 20:33                                                           ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-08-03 21:37                                                             ` Gregory Heytings
@ 2022-08-03 22:10                                                             ` Gregory Heytings
  1 sibling, 0 replies; 685+ messages in thread
From: Gregory Heytings @ 2022-08-03 22:10 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: 56682, Eli Zaretskii, Dmitry Gutov


By the way, I found at least one other case in which Emacs silently 
refuses to do what the programmer asked it to do.

A recipe:

emacs -Q
M-: (setq max-specpdl-size 100) RET
M-: max-specpdl-size RET ;; this returns 100, as expected
C-x C-f lisp/simple.el RET
M-: max-specpdl-size RET ;; this returns 400, why?
M-: (setq max-specpdl-size 100) RET
M-: max-specpdl-size RET ;; this returns 100 again, as expected
C-v ;; lean on the key until the end of the buffer
M-: max-specpdl-size RET ;; this returns 265, why?





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-03 21:37                                                             ` Gregory Heytings
@ 2022-08-03 22:42                                                               ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-08-04  1:29                                                                 ` Gregory Heytings
  2022-08-04  6:08                                                                 ` Eli Zaretskii
  0 siblings, 2 replies; 685+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2022-08-03 22:42 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, Eli Zaretskii, Dmitry Gutov

>> - when they get a bug report with a locked narrowing because of long
>> lines, using `widen-unlock` naively is likely to lead to an immediate
>> performance problem, so it's unlikely they'll use it.
> When I read this, I thought you had a point, but there's a fallacy in your
> reasoning: using widen-unlock is in fact not likely to lead to an immediate
> performance problem.  The long-line-threshold limit is sufficiently high to
> never be reached in "normal" files, but nothing would happen if you cross
> that limit by a small amount, and nothing would even happen at twice or even
> thrice that limit.

That's a valid point.  A bit like Alan's bug report, where he gets
a regression for 10K-long lines where the performance would be tolerable.

> If a mode author gets a bug report that is caused by locked narrowing, there
> is something wrong in the way the mode fontifies the buffer.  There is no
> reason to require access the whole buffer to fontify a small chunk of that
> buffer.  IOW, using widen-unlock there is nearly always wrong (I add
> "nearly" to leave open the possibility that there might be an exception).

As I explained already, it's basically always wrong for a major mode's
font-lock rules to widen, regardless if the narrowing is due to
something like LLT or MMM-mode.

> This is becoming so litigious (you're now telling me that you're offended)
> that I start to believe that the right thing might in fact be to completely
> disable font locking in such buffers.  Would "no highlighting" be better
> than "occasional mis-highlighting" from your point of view?

I don't care about the mishighlighting and find the current behavior
perfectly acceptable from an end-user point of view.  I only care about
the extra enforcement done in C code without providing any mechanism to
circumvent it.  Especially since this discussion seems to suggest that
if I were to propose a patch that makes this locking a bit more "soft",
it might be rejected on the grounds that it opens the door to abuse, so
not only I strongly dislike this design but I can't even try and
improve it.


        Stefan






^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-03 21:42                                                 ` Gregory Heytings
@ 2022-08-03 22:43                                                   ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-08-04  1:30                                                     ` Gregory Heytings
  0 siblings, 1 reply; 685+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2022-08-03 22:43 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, Eli Zaretskii, Dmitry Gutov

>>> The general idea is that syntax-ppss is currently an order of magnitude
>>> too slow for "too large" buffers.
>> And that it can be almost another order of magnitude worse in some major
>> modes because of `syntax-propertize`.
> That's possible, I don't know.  I might take a look at that later.  But note
> that your reactions are not exactly encouraging me to do so.

I don't see any need to look into it, so don't waste your time there,
because whether what I said above is true or not is mostly irrelevant
(e.g. what would you do with that info anyway?).


        Stefan






^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-07-28  7:49                                 ` Gregory Heytings
@ 2022-08-04  0:49                                   ` Dmitry Gutov
  2022-08-04  1:26                                     ` Gregory Heytings
  2022-08-04  7:29                                     ` Eli Zaretskii
  0 siblings, 2 replies; 685+ messages in thread
From: Dmitry Gutov @ 2022-08-04  0:49 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: gerd.moellmann, 56682, Eli Zaretskii, monnier

[-- Attachment #1: Type: text/plain, Size: 2900 bytes --]

On 28.07.2022 10:49, Gregory Heytings wrote:
> 
>>> Yes, occasional mis-fontification is expected.  It's a compromise 
>>> between "no fontification" and "slow fontification".
>>
>> I wonder now if the majority of the slowdown was caused by the 
>> redisplay, whereas font-lock (which only has to run once per 
>> screenful) was actually "fast enough".
>>
> 
> Those two statements are not mutually exclusive.  The majority of the 
> slowdown was indeed caused by redisplay, but font-lock was not fast 
> enough.  Try to open a sufficiently large file (e.g. the dictionary.json 
> one) with the code on master, and type M->.

Where does one obtain dictionary.json from?

> You'll see that Emacs needs 
> about five seconds (on my laptop) to display the end of the buffer.

Does that come from the long lines, or solely from the size of the buffer?

> Now 
> compare that with the feature branch, with which the end of the buffer 
> is displayed instantaneously.  That five seconds delay is caused by 
> fontification-functions.

At some point we should accept that visiting a huge file might take some 
time (5 seconds doesn't sound terrible, depending on the context). 
Because the alternative is mis-fontifications and broken display.

>> Could you clarify what you mean by "access ... to the place where ... 
>> is defined"? "new Downloadify.Container" is highlighted by a regular 
>> regexp matcher, not some custom elisp code which has to visit the 
>> position where the identifier is defined.
>>
> 
> Sorry, I cannot be more precise, I don't have the "downloadify.js" file 
> here.  It was just a guess, based on what I saw on the screenshot, that 
> one function called by fontification-functions collects all class 
> definitions and highlights their identifiers elsewhere in the buffer 
> with a specific face.  When the buffer is narrowed, that function may 
> not see the Downloadify.Container definition (which is, I guess, placed 
> near the beginning of the file) anymore.

Here I'm attaching a version of downloadify.js we can use for comparison 
(please rename the extension from .sj to .js locally; Gmail was not 
letting it through otherwise). It's not a huge file, just about 88K.

As long as I keep my Emacs window/frame width half of the desktop, I can 
reliably reproduce the problem with the lack of highlighting for 
"Downloadify.Container" while other tokens are still highlighted.

I'm also attaching a screenshot of another problem: suddenly the bottom 
several screens of the buffer are mis-highlighted as if starting inside 
a string. That very much look like a result of breaking syntax-ppss's 
visibility of the buffer.

So the buffer scrolls quickly but looks bad.

Branch feature/long-lines-and-font-locking, revision cd41ce8c6c1079 from 
July 25. That branch is not there anymore, so let me know if I should 
re-test this with some later version of your work.

[-- Attachment #2: downloadify-min-example.sj --]
[-- Type: application/x-javascript, Size: 90077 bytes --]

[-- Attachment #3: Screenshot from 2022-08-04 03-32-22.png --]
[-- Type: image/png, Size: 1050723 bytes --]

^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-03 11:56                                                     ` Eli Zaretskii
@ 2022-08-04  1:08                                                       ` Dmitry Gutov
  2022-08-04  1:34                                                         ` Gregory Heytings
  2022-08-04  6:40                                                         ` Eli Zaretskii
  0 siblings, 2 replies; 685+ messages in thread
From: Dmitry Gutov @ 2022-08-04  1:08 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, gregory, monnier

On 03.08.2022 14:56, Eli Zaretskii wrote:
>> Date: Wed, 3 Aug 2022 03:26:02 +0300
>> From: Dmitry Gutov<dgutov@yandex.ru>
>> Cc:56682@debbugs.gnu.org,monnier@iro.umontreal.ca
>>
>> On 03.08.2022 03:00, Dmitry Gutov wrote:
>>> On 02.08.2022 19:19, Gregory Heytings wrote:
>>>>>> Try to open the dictionary.json with Emacs on master a month ago.
>>>>> I believe it can also be done with the current master, just after
>>>>> setting long-line-threshold to the nil value.  Right?
>>>>>
>>>> Indeed.  With master from one month ago it's even more crystal-clear
>>>> that you see the statu quo ante.
>>> If I set long-line-threshold to nil, does that also disable the
>>> redisplay optimizations related to long lines?
>>>
>>> Ones that caused scrolling delays even after the buffer has been fully
>>> fontified.
>> I mean those that*fixed*  the said scrolling delays, of course.
> I don't think I understand which changes you had in mind (could you
> give a less vague pointer?), but I think the answer is NO: that
> variable disables only the recent changes related to long lines.

I'm not sure if there are separate/specific changes to speak of (sorry, 
I'm flying blind), but previously I remarked in this discussion that on 
master pushing C-p can still result in sluggish response (at the end of 
a long line), even after the current window has been fontified (meaning 
font-lock has finished its work), and Gregory remarked that I should try 
the branch feature/long-lines-and-font-locking where this was fixed.

I did try the branch and indeed did not experience that sluggishness 
anymore. But that probably is a separate issue from slow font-lock.

So to try to debug any remaining speed issues with font-lock, it would 
be great to eliminate other sources of slow display first. In particular 
ones coming from a low-level subsystem I cannot as easily 
benchmark/debug/etc as Lisp code.

The setting

(setq long-line-threshold nil syntax-wholeline-max most-positive-fixnum)

indeed makes all the speed issues come back, including the 
aforementioned sluggishness.

You can try it yourself with downloadify.js I attached to the previous 
email. It's not a huge file either: the line is 90077 characters long.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-02 15:46                                                 ` Eli Zaretskii
@ 2022-08-04  1:08                                                   ` Dmitry Gutov
  2022-08-04  1:41                                                     ` Gregory Heytings
  2022-08-04  7:45                                                     ` Eli Zaretskii
  0 siblings, 2 replies; 685+ messages in thread
From: Dmitry Gutov @ 2022-08-04  1:08 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, gregory, monnier

On 02.08.2022 18:46, Eli Zaretskii wrote:
>> Date: Tue, 2 Aug 2022 17:10:53 +0300
>> Cc: 56682@debbugs.gnu.org, gregory@heytings.org, monnier@iro.umontreal.ca
>> From: Dmitry Gutov <dgutov@yandex.ru>
>>
>> On 02.08.2022 05:27, Eli Zaretskii wrote:
>>>> syntax-ppss cache is a list of checkpoints spread along the buffer.
>>>>
>>>> After a modification, only the checkpoints below it are invalidated (to
>>>> be recomputed on-demand later).
>>> So a suitably-concocted replace command will still invalidate a lot of
>>> that cache, right?
>>
>> For any cache, one can invent an operation that would result in
>> thrashing it repeatedly.
> 
> Yes, but when thrashing causes delays of dozens of seconds, the result
> is not just a rare delay, the result is simply unacceptable.

What is unacceptable is the behavior I see from the narrowing solution. 
See the screenshots I attached in this thread.

>> A regular search-replace should work well enough, though. Because when
>> the buffer is long, the user is likely, on average, to spend a lot more
>> time examining the occurrences and deciding whether to replace each one.
>> And since the operation goes from top to bottom, this will likely
>> invalidate the list of caches once, and then rebuild it from the
>> beginning (or from wherever the first replacement was).
> 
> We want every basic operation in such buffers to perform reasonably
> well.  That's the goal of this activity.  Because partial solutions
> that sometimes work we already have: there's so-long-mode, there's
> longlines.el, and a couple of other trick up our sleeve.

We cannot perform every basic operation in fixed time for any 
arbitrarily sized file. There are limits of what we can possibly do.

If we narrow willy-nilly, we step on the toes of syntax parsing and get 
other weird behaviors as a result.

Which means we got another partial solution.

so-long-mode, longlines, etc, were all targeted as buffers with long 
lines. I'd really like it if we could scope this discussion to solving 
that particular problem. Not the speed of operations in large files in 
general.

The long lines problem is caused by pathologic complexity of some 
operations (like O(N^2) of line length, I guess). syntax-ppss's 
performance is nothing like that: it's O(N) for initial full scan, and 
O(1) for most operations afterward.

You can't really get better than that. Maye get a better multiplier with 
tree-sitter or a more optimized version of parse-partial-sexp, but take 
a 10x bigger file (or 100x bigger, or 1000x bigger) - and voila, the 
delay can be observed again.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-04  0:49                                   ` Dmitry Gutov
@ 2022-08-04  1:26                                     ` Gregory Heytings
  2022-08-04  7:50                                       ` Eli Zaretskii
  2022-08-04 10:35                                       ` Dmitry Gutov
  2022-08-04  7:29                                     ` Eli Zaretskii
  1 sibling, 2 replies; 685+ messages in thread
From: Gregory Heytings @ 2022-08-04  1:26 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: gerd.moellmann, 56682, Eli Zaretskii, monnier

[-- Attachment #1: Type: text/plain, Size: 2346 bytes --]


>
> Where does one obtain dictionary.json from?
>

From here, for example: https://www.heytings.org/data/dictionary.json .

>> You'll see that Emacs needs about five seconds (on my laptop) to 
>> display the end of the buffer.
>
> Does that come from the long lines, or solely from the size of the 
> buffer?
>

You're replying to a week old email.  IIRC that delay comes solely from 
font locking.

>> Now compare that with the feature branch, with which the end of the 
>> buffer is displayed instantaneously.  That five seconds delay is caused 
>> by fontification-functions.
>
> At some point we should accept that visiting a huge file might take some 
> time (5 seconds doesn't sound terrible, depending on the context). 
> Because the alternative is mis-fontifications and broken display.
>

If you dislike mis-fontification, turn font-lock mode off.

>
> Here I'm attaching a version of downloadify.js we can use for comparison 
> (please rename the extension from .sj to .js locally; Gmail was not 
> letting it through otherwise). It's not a huge file, just about 88K.
>

It's a tiny file, not in any way representative of the ones we're dealing 
with.  But amusingly, even with that tiny file, you can see the problem at 
hand.  Do M-: (setq long-line-threshold nil) RET, and open it in a large 
enough window (e.g. 160 characters).  Type M->, and try to move point 
there with C-p or C-n.  You'll see that Emacs is already sluggish.

>
> I'm also attaching a screenshot of another problem: suddenly the bottom 
> several screens of the buffer are mis-highlighted as if starting inside 
> a string. That very much look like a result of breaking syntax-ppss's 
> visibility of the buffer.
>
> So the buffer scrolls quickly but looks bad.
>

If you dislike mis-fontification, turn font-lock mode off.  It's as easy 
as that.  Mis-fontification is expected in such cases.  The docstring of 
syntax-wholeline-max also mentions that "misfontification may then occur". 
Why did you not protest at that time?

>
> Branch feature/long-lines-and-font-locking, revision cd41ce8c6c1079 from 
> July 25. That branch is not there anymore, so let me know if I should 
> re-test this with some later version of your work.
>

That branch doesn't exist anymore, it has been merged in master.

^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-03 22:42                                                               ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2022-08-04  1:29                                                                 ` Gregory Heytings
  2022-08-04  6:08                                                                 ` Eli Zaretskii
  1 sibling, 0 replies; 685+ messages in thread
From: Gregory Heytings @ 2022-08-04  1:29 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: 56682, Eli Zaretskii, Dmitry Gutov


>
> I only care about the extra enforcement done in C code without providing 
> any mechanism to circumvent it.  Especially since this discussion seems 
> to suggest that if I were to propose a patch that makes this locking a 
> bit more "soft", it might be rejected on the grounds that it opens the 
> door to abuse, so not only I strongly dislike this design but I can't 
> even try and improve it.
>

I did not say that.  I do consider that it's not the right thing to do, 
for all the reasons I already gave, but if you have something concrete in 
mind, please show it.  I'm not the one who decides anyway.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-03 22:43                                                   ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2022-08-04  1:30                                                     ` Gregory Heytings
  2022-08-04 21:24                                                       ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  0 siblings, 1 reply; 685+ messages in thread
From: Gregory Heytings @ 2022-08-04  1:30 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: 56682, Eli Zaretskii, Dmitry Gutov


>>>> The general idea is that syntax-ppss is currently an order of 
>>>> magnitude too slow for "too large" buffers.
>>>
>>> And that it can be almost another order of magnitude worse in some 
>>> major modes because of `syntax-propertize`.
>>
>> That's possible, I don't know.  I might take a look at that later. 
>> But note that your reactions are not exactly encouraging me to do so.
>
> I don't see any need to look into it, so don't waste your time there,
>

To make syntax-ppss faster, if possible?  Is that not a sensible thing to 
do?





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-04  1:08                                                       ` Dmitry Gutov
@ 2022-08-04  1:34                                                         ` Gregory Heytings
  2022-08-04  6:40                                                         ` Eli Zaretskii
  1 sibling, 0 replies; 685+ messages in thread
From: Gregory Heytings @ 2022-08-04  1:34 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: 56682, Eli Zaretskii, monnier


>
> So to try to debug any remaining speed issues with font-lock, it would 
> be great to eliminate other sources of slow display first. In particular 
> ones coming from a low-level subsystem I cannot as easily 
> benchmark/debug/etc as Lisp code.
>
> The setting
>
> (setq long-line-threshold nil syntax-wholeline-max most-positive-fixnum)
>
> indeed makes all the speed issues come back, including the 
> aforementioned sluggishness.
>

If you want to see only the slowdowns cause by font locking, just comment 
out the "if (current_buffer->long_line_optimizations_p)" in 
xdisp.c:handle_fontified_prop.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-04  1:08                                                   ` Dmitry Gutov
@ 2022-08-04  1:41                                                     ` Gregory Heytings
  2022-08-05 12:28                                                       ` Dmitry Gutov
  2022-08-04  7:45                                                     ` Eli Zaretskii
  1 sibling, 1 reply; 685+ messages in thread
From: Gregory Heytings @ 2022-08-04  1:41 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: 56682, Eli Zaretskii, monnier


>
> We cannot perform every basic operation in fixed time for any 
> arbitrarily sized file. There are limits of what we can possibly do.
>

Apparently the limits are lower than what you think.  Provided that we 
accept some compromises, such as mis-fontification, which is also what 
syntax-wholeline-max does, and against which you didn't protest.

>
> I'd really like it if we could scope this discussion to solving that 
> particular problem. Not the speed of operations in large files in 
> general.
>

I don't understand what you mean.  Which "particular problem"?  The point 
of this discussion is of course the speed of operations in large files in 
general.  If you take that out of the picture, everything is of course 
possible.  I'm not even sure what remains in fact, Emacs is an editor, not 
a displayer.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-03 20:36                                                       ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2022-08-04  5:30                                                         ` Eli Zaretskii
  0 siblings, 0 replies; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-04  5:30 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: 56682, gregory, dgutov

> From: Stefan Monnier <monnier@iro.umontreal.ca>
> Cc: gregory@heytings.org,  dgutov@yandex.ru,  56682@debbugs.gnu.org
> Date: Wed, 03 Aug 2022 16:36:05 -0400
> 
> > What do you mean by "accidentally" in this context?  A program rarely
> > does anything "accidentally", it almost always does what the
> > programmer wanted it to do.
> 
> I mean that currently font-lock just blindly widens all the time, so we
> should fix it so it only widens when it's expected to (i.e. not when
> the widening is installed by the LLT code).

So let's please fix that, and take it from there.  We have plenty of
time to make followup decisions after we see what that does.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-03 20:38                                                           ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2022-08-04  5:40                                                             ` Eli Zaretskii
  2022-08-04 22:35                                                               ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  0 siblings, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-04  5:40 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: 56682, gregory, dgutov

> From: Stefan Monnier <monnier@iro.umontreal.ca>
> Cc: gregory@heytings.org,  dgutov@yandex.ru,  56682@debbugs.gnu.org
> Date: Wed, 03 Aug 2022 16:38:57 -0400
> 
> > What about parse-partial-sexp, which calls scan_sexps_forward?  It
> > looks like I've misremembered, and that was the culprit in the
> > scenario we discussed, see
> > https://debbugs.gnu.org/cgi/bugreport.cgi?bug=45898#92.
> 
> The wholelines problem did not kick in because of PPS nor `syntax-ppss`
> but because of font-lock (which then called `syntax-ppss` which then
> called PPS).

If it's font-lock that forces syntax-ppss to examine the whole huge
line, then what is your proposal for avoiding that which doesn't
involve some more-or-less arbitrary restrictions on the part of the
buffer that can be examined by syntax-ppss?





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-03 22:42                                                               ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-08-04  1:29                                                                 ` Gregory Heytings
@ 2022-08-04  6:08                                                                 ` Eli Zaretskii
  2022-08-04  6:23                                                                   ` Lars Ingebrigtsen
  1 sibling, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-04  6:08 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: 56682, gregory, dgutov

> From: Stefan Monnier <monnier@iro.umontreal.ca>
> Cc: 56682@debbugs.gnu.org,  Eli Zaretskii <eliz@gnu.org>,  Dmitry Gutov
>  <dgutov@yandex.ru>
> Date: Wed, 03 Aug 2022 18:42:03 -0400
> 
> I don't care about the mishighlighting and find the current behavior
> perfectly acceptable from an end-user point of view.  I only care about
> the extra enforcement done in C code without providing any mechanism to
> circumvent it.  Especially since this discussion seems to suggest that
> if I were to propose a patch that makes this locking a bit more "soft",
> it might be rejected on the grounds that it opens the door to abuse

"Show me the code", instead of imagining what would be the reaction to
that.  (To say nothing of the fact that what I already wrote several
times explicitly contradicts your impression.)





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-04  6:08                                                                 ` Eli Zaretskii
@ 2022-08-04  6:23                                                                   ` Lars Ingebrigtsen
  2022-08-04 11:21                                                                     ` Gregory Heytings
  0 siblings, 1 reply; 685+ messages in thread
From: Lars Ingebrigtsen @ 2022-08-04  6:23 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, gregory, Stefan Monnier, dgutov

By the way, playing with Alan's example here a bit...  To recap, this is
the test case (in a .cc file):

---
char long_line[] = R"foo(

)foo"
---

If I insert a 1M long line there (with `C-y'), Emacs will hang
indefinitely.  Wasn't the long-line stuff supposed to trigger in these
situations?  Or is it hanging in some cc-mode stuff before we get that
far?

`C-g' a number of times will eventually get out of the hang, but then
Emacs hangs again.  `C-g' again a few times breaks out of that, and then
finally Emacs becomes responsive.  If I load the file with the 1M line
from the start, then Emacs is responsive all the time.






^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-04  1:08                                                       ` Dmitry Gutov
  2022-08-04  1:34                                                         ` Gregory Heytings
@ 2022-08-04  6:40                                                         ` Eli Zaretskii
  1 sibling, 0 replies; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-04  6:40 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: 56682, gregory, monnier

> Date: Thu, 4 Aug 2022 04:08:20 +0300
> Cc: 56682@debbugs.gnu.org, gregory@heytings.org, monnier@iro.umontreal.ca
> From: Dmitry Gutov <dgutov@yandex.ru>
> 
> On 03.08.2022 14:56, Eli Zaretskii wrote:
> >> Date: Wed, 3 Aug 2022 03:26:02 +0300
> >> From: Dmitry Gutov<dgutov@yandex.ru>
> >> Cc:56682@debbugs.gnu.org,monnier@iro.umontreal.ca
> >>
> >> On 03.08.2022 03:00, Dmitry Gutov wrote:
> >>> On 02.08.2022 19:19, Gregory Heytings wrote:
> >>>>>> Try to open the dictionary.json with Emacs on master a month ago.
> >>>>> I believe it can also be done with the current master, just after
> >>>>> setting long-line-threshold to the nil value.  Right?
> >>>>>
> >>>> Indeed.  With master from one month ago it's even more crystal-clear
> >>>> that you see the statu quo ante.
> >>> If I set long-line-threshold to nil, does that also disable the
> >>> redisplay optimizations related to long lines?
> >>>
> >>> Ones that caused scrolling delays even after the buffer has been fully
> >>> fontified.
> >> I mean those that*fixed*  the said scrolling delays, of course.
> > I don't think I understand which changes you had in mind (could you
> > give a less vague pointer?), but I think the answer is NO: that
> > variable disables only the recent changes related to long lines.
> 
> I'm not sure if there are separate/specific changes to speak of (sorry, 
> I'm flying blind), but previously I remarked in this discussion that on 
> master pushing C-p can still result in sluggish response (at the end of 
> a long line), even after the current window has been fontified (meaning 
> font-lock has finished its work), and Gregory remarked that I should try 
> the branch feature/long-lines-and-font-locking where this was fixed.
> 
> I did try the branch and indeed did not experience that sluggishness 
> anymore. But that probably is a separate issue from slow font-lock.
> 
> So to try to debug any remaining speed issues with font-lock, it would 
> be great to eliminate other sources of slow display first. In particular 
> ones coming from a low-level subsystem I cannot as easily 
> benchmark/debug/etc as Lisp code.
> 
> The setting
> 
> (setq long-line-threshold nil syntax-wholeline-max most-positive-fixnum)
> 
> indeed makes all the speed issues come back, including the 
> aforementioned sluggishness.

OK, so I guess my answer to your question was accurate, and you now
have a way to reproduce those issues by disabling the recent speedups.

The changes in what was the long-lines-and-font-locking branch are now
on master, AFAIK.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-04  0:49                                   ` Dmitry Gutov
  2022-08-04  1:26                                     ` Gregory Heytings
@ 2022-08-04  7:29                                     ` Eli Zaretskii
  1 sibling, 0 replies; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-04  7:29 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: gerd.moellmann, 56682, gregory, monnier

> Date: Thu, 4 Aug 2022 03:49:43 +0300
> Cc: gerd.moellmann@gmail.com, 56682@debbugs.gnu.org,
>  Eli Zaretskii <eliz@gnu.org>, monnier@iro.umontreal.ca
> From: Dmitry Gutov <dgutov@yandex.ru>
> 
> > Now 
> > compare that with the feature branch, with which the end of the buffer 
> > is displayed instantaneously.  That five seconds delay is caused by 
> > fontification-functions.
> 
> At some point we should accept that visiting a huge file might take some 
> time (5 seconds doesn't sound terrible, depending on the context). 
> Because the alternative is mis-fontifications and broken display.
> 
> >> Could you clarify what you mean by "access ... to the place where ... 
> >> is defined"? "new Downloadify.Container" is highlighted by a regular 
> >> regexp matcher, not some custom elisp code which has to visit the 
> >> position where the identifier is defined.
> >>
> > 
> > Sorry, I cannot be more precise, I don't have the "downloadify.js" file 
> > here.  It was just a guess, based on what I saw on the screenshot, that 
> > one function called by fontification-functions collects all class 
> > definitions and highlights their identifiers elsewhere in the buffer 
> > with a specific face.  When the buffer is narrowed, that function may 
> > not see the Downloadify.Container definition (which is, I guess, placed 
> > near the beginning of the file) anymore.
> 
> Here I'm attaching a version of downloadify.js we can use for comparison 
> (please rename the extension from .sj to .js locally; Gmail was not 
> letting it through otherwise). It's not a huge file, just about 88K.
> 
> As long as I keep my Emacs window/frame width half of the desktop, I can 
> reliably reproduce the problem with the lack of highlighting for 
> "Downloadify.Container" while other tokens are still highlighted.
> 
> I'm also attaching a screenshot of another problem: suddenly the bottom 
> several screens of the buffer are mis-highlighted as if starting inside 
> a string. That very much look like a result of breaking syntax-ppss's 
> visibility of the buffer.
> 
> So the buffer scrolls quickly but looks bad.

I don't understand the point you are trying to make.

On the one hand, you say "At some point we should accept that visiting
a huge file might take some time", which seems to imply that you agree
in general with some (hopefully graceful) degradation when editing
files with such long lines.  But OTOH you object to have that
degradation in the fontification?  IOW, you prefer Emacs to become
much slower, but still fontify correctly?  If so, just enlarge the
value of long-line-threshold, with the effect that Emacs will become
more sluggish before the long-line optimizations kick in.  If this is
your point, then maybe lobby for enlarging the default value of that
variable.

But if you are saying that Emacs should behave as it does with that
variable being nil, then I don't understand your position.  With that
variable nil, Emacs becomes _unusable_, not just slow, with files that
are not even too large by any modern measure, just because the lines
are very long.  And in those cases, why is it wrong to decide that
occasional glitches in fontifications are a lesser evil than a
complete lockup of the Emacs UI, which usually results in users
killing the session?  We decided that some imperfection in
fontifications are the "graceful degradation" we are willing to endure
in order to make Emacs reasonably performant in those cases.  What is
wrong with that tradeoff?  And what alternative tradeoff would you
suggest instead?

(You mention "broken display" in addition to inaccurate
fontifications, but I don't understand what does that allude to.
Which instances of broken display did you see, and how to reproduce
them?)





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-04  1:08                                                   ` Dmitry Gutov
  2022-08-04  1:41                                                     ` Gregory Heytings
@ 2022-08-04  7:45                                                     ` Eli Zaretskii
  1 sibling, 0 replies; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-04  7:45 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: 56682, gregory, monnier

> Date: Thu, 4 Aug 2022 04:08:20 +0300
> Cc: 56682@debbugs.gnu.org, gregory@heytings.org, monnier@iro.umontreal.ca
> From: Dmitry Gutov <dgutov@yandex.ru>
> 
> > Yes, but when thrashing causes delays of dozens of seconds, the result
> > is not just a rare delay, the result is simply unacceptable.
> 
> What is unacceptable is the behavior I see from the narrowing solution. 
> See the screenshots I attached in this thread.

So that behavior is unacceptable, but declaring we are unable to allow
editing of such files is acceptable?  If that is your position, we
will have to agree to disagree.  We have decided that we want a more
graceful degradation in these cases, and in particular to sacrifice
some accuracy of font-lock to allow reasonable editing of such files.
If you consider that unacceptable, you can still have the lockups you
prefer by setting long-line-threshold to nil.  But we disagree with
having nil be the default value of that variable.

> > We want every basic operation in such buffers to perform reasonably
> > well.  That's the goal of this activity.  Because partial solutions
> > that sometimes work we already have: there's so-long-mode, there's
> > longlines.el, and a couple of other trick up our sleeve.
> 
> We cannot perform every basic operation in fixed time for any 
> arbitrarily sized file. There are limits of what we can possibly do.

I said "reasonably well", not "in fixed time".  Some slowdown is
acceptable.  But when a simple editing operation takes several
minutes, we cannot in good faith claim that Emacs is still usable.  If
you prefer to have that to some degradation in font-lock, then we
disagree.

> If we narrow willy-nilly, we step on the toes of syntax parsing and get 
> other weird behaviors as a result.
> 
> Which means we got another partial solution.

The experience till now seems to indicate that the degradation caused
by this solution is much milder and rarer than any other solution, and
allows users to edit files with much longer lines.  It certainly
sounds like a better solution than completely disabling font-lock in
such buffers (but that is still an option, if someone prefers it).
Reporting specific problems with that solution will allow us to solve
at least some of them, with the goal of making the degradation even
more graceful -- this is what this bug report is for.

But if you want to claim that it is better to have Emacs lock up for
minutes in these cases, you will have to do that in your local
customization, because we disagree with having Emacs behave like that
when it can be avoided.

> so-long-mode, longlines, etc, were all targeted as buffers with long 
> lines. I'd really like it if we could scope this discussion to solving 
> that particular problem. Not the speed of operations in large files in 
> general.

The "long lines problem" is directly related to the speed of
operations.  We didn't yet make any changes that affect large files in
general, only files with long lines.  In those cases, the speed of
operations becomes unacceptably slow beyond some threshold, and we
want Emacs to remain usable beyond that threshold, even if that makes
fontifications sometimes inaccurate.

> The long lines problem is caused by pathologic complexity of some 
> operations (like O(N^2) of line length, I guess).

That assumption is incorrect, at least according to my analysis of the
relevant bottlenecks.  The slowdown is mostly linear in the number of
buffer positions redisplay and its subroutines need to traverse.

> syntax-ppss's performance is nothing like that: it's O(N) for
> initial full scan, and O(1) for most operations afterward.
> 
> You can't really get better than that. Maye get a better multiplier with 
> tree-sitter or a more optimized version of parse-partial-sexp, but take 
> a 10x bigger file (or 100x bigger, or 1000x bigger) - and voila, the 
> delay can be observed again.

No one denies that beyond some threshold the performance will be too
slow again.  We just want to make that threshold much farther.

In addition, the idea of using narrowing is a good one precisely
because it is unaffected by the buffer size.  So its effect doesn't
deteriorate when the buffer or the line length becomes larger.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-04  1:26                                     ` Gregory Heytings
@ 2022-08-04  7:50                                       ` Eli Zaretskii
  2022-08-04  9:24                                         ` Gregory Heytings
  2022-08-04 10:35                                       ` Dmitry Gutov
  1 sibling, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-04  7:50 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: gerd.moellmann, 56682, monnier, dgutov

> Date: Thu, 04 Aug 2022 01:26:04 +0000
> From: Gregory Heytings <gregory@heytings.org>
> cc: gerd.moellmann@gmail.com, 56682@debbugs.gnu.org, 
>     Eli Zaretskii <eliz@gnu.org>, monnier@iro.umontreal.ca
> 
> > Branch feature/long-lines-and-font-locking, revision cd41ce8c6c1079 from 
> > July 25. That branch is not there anymore, so let me know if I should 
> > re-test this with some later version of your work.
> 
> That branch doesn't exist anymore, it has been merged in master.

Right.

Gregory, is there a reason why the long-lines-improvements branch is
not yet merged?  I think it already includes important improvements
that should be exposed to a larger population for testing and
feedback.

If you for some reason prefer to keep that branch active, can you
please merge the current master to it, so that the changes in
narrow-to-region will be on the branch?  As things are now, the
problems you solved on master in that part are not yet solved on the
branch, and so working on the branch runs the risk of hitting problems
unrelated to changes in display code.

Thanks.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-04  7:50                                       ` Eli Zaretskii
@ 2022-08-04  9:24                                         ` Gregory Heytings
  2022-08-04  9:36                                           ` Eli Zaretskii
                                                             ` (2 more replies)
  0 siblings, 3 replies; 685+ messages in thread
From: Gregory Heytings @ 2022-08-04  9:24 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: gerd.moellmann, 56682, monnier, dgutov


>
> Gregory, is there a reason why the long-lines-improvements branch is not 
> yet merged?  I think it already includes important improvements that 
> should be exposed to a larger population for testing and feedback.
>

I was planning to add more improvements, but indeed merging that one and 
creating yet another one seems better at this point.

I just pushed an improvement for Bidi.  I did not do so earlier because I 
was trying to improve it further, but somehow I'm hitting a brick wall 
here.  Could you please check, and tell me if what I already did is okay?

In this case I did not find a good test case in the wild (or more 
precisely, I had no idea how to find one), so I concoted one myself. 
You'll find it here: https://www.heytings.org/data/locales.json .  Emacs 
is still a bit sluggish with that file, but behaves much better than 
before.

>
> If you for some reason prefer to keep that branch active, can you please 
> merge the current master to it, so that the changes in narrow-to-region 
> will be on the branch?
>

Is that feasible?  Non fast forwards are not allowed in the Emacs 
repository, so rebasing a feature branch is not possible (without using 
the workaround of deleting and recreating the branch).





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-04  9:24                                         ` Gregory Heytings
@ 2022-08-04  9:36                                           ` Eli Zaretskii
  2022-08-04  9:43                                             ` Gregory Heytings
  2022-08-04  9:40                                           ` Eli Zaretskii
  2022-08-04  9:52                                           ` Stefan Kangas
  2 siblings, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-04  9:36 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: gerd.moellmann, 56682, monnier, dgutov

> Date: Thu, 04 Aug 2022 09:24:00 +0000
> From: Gregory Heytings <gregory@heytings.org>
> cc: dgutov@yandex.ru, gerd.moellmann@gmail.com, 56682@debbugs.gnu.org, 
>     monnier@iro.umontreal.ca
> 
> I just pushed an improvement for Bidi.  I did not do so earlier because I 
> was trying to improve it further, but somehow I'm hitting a brick wall 
> here.  Could you please check, and tell me if what I already did is okay?

Will do, thanks.

> > If you for some reason prefer to keep that branch active, can you please 
> > merge the current master to it, so that the changes in narrow-to-region 
> > will be on the branch?
> 
> Is that feasible?  Non fast forwards are not allowed in the Emacs 
> repository, so rebasing a feature branch is not possible (without using 
> the workaround of deleting and recreating the branch).

I didn't mean a rebase, I meant a merge.  A merge from master to a
feature branch will work exactly as a merge from emacs-28 to master
or, indeed, a merge from a feature branch to master.  There are no
problems here.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-04  9:24                                         ` Gregory Heytings
  2022-08-04  9:36                                           ` Eli Zaretskii
@ 2022-08-04  9:40                                           ` Eli Zaretskii
  2022-08-04  9:46                                             ` Gregory Heytings
  2022-08-04  9:52                                           ` Stefan Kangas
  2 siblings, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-04  9:40 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: gerd.moellmann, 56682, monnier, dgutov

> Date: Thu, 04 Aug 2022 09:24:00 +0000
> From: Gregory Heytings <gregory@heytings.org>
> cc: dgutov@yandex.ru, gerd.moellmann@gmail.com, 56682@debbugs.gnu.org, 
>     monnier@iro.umontreal.ca
> 
> I just pushed an improvement for Bidi.  I did not do so earlier because I 
> was trying to improve it further, but somehow I'm hitting a brick wall 
> here.  Could you please check, and tell me if what I already did is okay?

Hmm... which part(s) of the recent commit(s) on the branch are related
to bidi?  I only see changes related to composed characters.  What did
I miss?





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-04  9:36                                           ` Eli Zaretskii
@ 2022-08-04  9:43                                             ` Gregory Heytings
  0 siblings, 0 replies; 685+ messages in thread
From: Gregory Heytings @ 2022-08-04  9:43 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: gerd.moellmann, 56682, monnier, dgutov


>>> If you for some reason prefer to keep that branch active, can you 
>>> please merge the current master to it, so that the changes in 
>>> narrow-to-region will be on the branch?
>>
>> Is that feasible?  Non fast forwards are not allowed in the Emacs 
>> repository, so rebasing a feature branch is not possible (without using 
>> the workaround of deleting and recreating the branch).
>
> I didn't mean a rebase, I meant a merge.
>

Indeed, I did not read what you wrote with enough attention.  Sorry for 
that.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-04  9:40                                           ` Eli Zaretskii
@ 2022-08-04  9:46                                             ` Gregory Heytings
  2022-08-04  9:57                                               ` Eli Zaretskii
  0 siblings, 1 reply; 685+ messages in thread
From: Gregory Heytings @ 2022-08-04  9:46 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: gerd.moellmann, 56682, monnier, dgutov


>> I just pushed an improvement for Bidi.  I did not do so earlier because 
>> I was trying to improve it further, but somehow I'm hitting a brick 
>> wall here.  Could you please check, and tell me if what I already did 
>> is okay?
>
> Hmm... which part(s) of the recent commit(s) on the branch are related 
> to bidi?  I only see changes related to composed characters.  What did I 
> miss?
>

82b602dc2f improves bidi in long lines, without indeed touching bidi.c.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-04  9:24                                         ` Gregory Heytings
  2022-08-04  9:36                                           ` Eli Zaretskii
  2022-08-04  9:40                                           ` Eli Zaretskii
@ 2022-08-04  9:52                                           ` Stefan Kangas
  2 siblings, 0 replies; 685+ messages in thread
From: Stefan Kangas @ 2022-08-04  9:52 UTC (permalink / raw)
  To: Gregory Heytings, Eli Zaretskii; +Cc: gerd.moellmann, 56682, monnier, dgutov

Gregory Heytings <gregory@heytings.org> writes:

>> If you for some reason prefer to keep that branch active, can you please
>> merge the current master to it, so that the changes in narrow-to-region
>> will be on the branch?
>
> Is that feasible?  Non fast forwards are not allowed in the Emacs
> repository, so rebasing a feature branch is not possible (without using
> the workaround of deleting and recreating the branch).

Rebasing is not possible, but merging is.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-04  9:46                                             ` Gregory Heytings
@ 2022-08-04  9:57                                               ` Eli Zaretskii
  2022-08-04 10:33                                                 ` Gregory Heytings
  0 siblings, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-04  9:57 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: gerd.moellmann, 56682, monnier, dgutov

> Date: Thu, 04 Aug 2022 09:46:17 +0000
> From: Gregory Heytings <gregory@heytings.org>
> cc: dgutov@yandex.ru, gerd.moellmann@gmail.com, 56682@debbugs.gnu.org, 
>     monnier@iro.umontreal.ca
> 
> 
> >> I just pushed an improvement for Bidi.  I did not do so earlier because 
> >> I was trying to improve it further, but somehow I'm hitting a brick 
> >> wall here.  Could you please check, and tell me if what I already did 
> >> is okay?
> >
> > Hmm... which part(s) of the recent commit(s) on the branch are related 
> > to bidi?  I only see changes related to composed characters.  What did I 
> > miss?
> >
> 
> 82b602dc2f improves bidi in long lines, without indeed touching bidi.c.

The changes are related to compositions, not to bidi.  Displaying
Arabic (and maybe also other characters in that file) requires
character composition, but it has nothing in particular to do with
bidi per se.

Are you saying that if you replace the Arabic text there with some
other script that also requires composition processing (like one of
the Indic scripts, see lisp/language/indian.el), editing this file is
significantly faster?

Btw, I'm unable to edit that file on the branch, because
show-paren--default causes an assertion violation.  I'm pretty sure
that's due to the issues in narrow-to-region that were already fixed
on master.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-04  9:57                                               ` Eli Zaretskii
@ 2022-08-04 10:33                                                 ` Gregory Heytings
  2022-08-04 13:10                                                   ` Eli Zaretskii
  2022-08-04 14:14                                                   ` Eli Zaretskii
  0 siblings, 2 replies; 685+ messages in thread
From: Gregory Heytings @ 2022-08-04 10:33 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: gerd.moellmann, 56682, monnier, dgutov


>
> The changes are related to compositions, not to bidi.  Displaying Arabic 
> (and maybe also other characters in that file) requires character 
> composition, but it has nothing in particular to do with bidi per se.
>

I know next to nothing about bidi, so it's very well possible indeed that 
I confused "bidi" and "composition" (or "bidi composition"?).  Anyway, 
navigating through the locales.json file was slow (at some positions) 
before the change and is now reasonably fast (but alas not instantaneous).

>
> Are you saying that if you replace the Arabic text there with some other 
> script that also requires composition processing (like one of the Indic 
> scripts, see lisp/language/indian.el), editing this file is 
> significantly faster?
>

I think the locales.json file contains samples of pretty much all 
available scripts.  Devanagari for example is around position 3260000. 
As far as I can tell, navigating in that part of the file is not 
significantly faster with the change.  It is only in the parts of the file 
that contain e.g. Arabic text that the speedup is visible, around position 
70000 for example.

>
> Btw, I'm unable to edit that file on the branch, because 
> show-paren--default causes an assertion violation.  I'm pretty sure 
> that's due to the issues in narrow-to-region that were already fixed on 
> master.
>

I just merged master into the feature branch.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-04  1:26                                     ` Gregory Heytings
  2022-08-04  7:50                                       ` Eli Zaretskii
@ 2022-08-04 10:35                                       ` Dmitry Gutov
  2022-08-04 11:29                                         ` Gregory Heytings
  2022-08-04 13:09                                         ` Eli Zaretskii
  1 sibling, 2 replies; 685+ messages in thread
From: Dmitry Gutov @ 2022-08-04 10:35 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: gerd.moellmann, 56682, Eli Zaretskii, monnier

On 04.08.2022 04:26, Gregory Heytings wrote:

>> Here I'm attaching a version of downloadify.js we can use for 
>> comparison (please rename the extension from .sj to .js locally; Gmail 
>> was not letting it through otherwise). It's not a huge file, just 
>> about 88K.
>>
> 
> It's a tiny file, not in any way representative of the ones we're 
> dealing with.  But amusingly, even with that tiny file, you can see the 
> problem at hand.  Do M-: (setq long-line-threshold nil) RET, and open it 
> in a large enough window (e.g. 160 characters).  Type M->, and try to 
> move point there with C-p or C-n.  You'll see that Emacs is already 
> sluggish.

That's the scenario I described, and that's my point: this file's 
display is sluggish. Even though font-lock has already finished its 
work. And it didn't have to spend any significant time in syntax-ppss.

So there is a particular performance problem with the display of 
fontified buffers which I'd really like your help in fixing.

Fixing in a way that doesn't add narrowing around 
fontification-functions, because as we can see it's not necessary in 
examples like this.

Then it would be much easier to evaluate font-lock's effect on 
performance in larger files.

>> I'm also attaching a screenshot of another problem: suddenly the 
>> bottom several screens of the buffer are mis-highlighted as if 
>> starting inside a string. That very much look like a result of 
>> breaking syntax-ppss's visibility of the buffer.
>>
>> So the buffer scrolls quickly but looks bad.
>>
> 
> If you dislike mis-fontification, turn font-lock mode off.  It's as easy 
> as that.  Mis-fontification is expected in such cases.  The docstring of 
> syntax-wholeline-max also mentions that "misfontification may then 
> occur". Why did you not protest at that time?

I think we could have both speed and correctness, at least for files of 
this size.

>> Branch feature/long-lines-and-font-locking, revision cd41ce8c6c1079 
>> from July 25. That branch is not there anymore, so let me know if I 
>> should re-test this with some later version of your work.
>>
> 
> That branch doesn't exist anymore, it has been merged in master.

Thanks.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-04  6:23                                                                   ` Lars Ingebrigtsen
@ 2022-08-04 11:21                                                                     ` Gregory Heytings
  0 siblings, 0 replies; 685+ messages in thread
From: Gregory Heytings @ 2022-08-04 11:21 UTC (permalink / raw)
  To: Lars Ingebrigtsen; +Cc: 56682, Eli Zaretskii, Stefan Monnier, dgutov


>
> By the way, playing with Alan's example here a bit...  To recap, this is 
> the test case (in a .cc file):
>
> ---
> char long_line[] = R"foo(
>
> )foo"
> ---
>
> If I insert a 1M long line there (with `C-y'), Emacs will hang 
> indefinitely.  Wasn't the long-line stuff supposed to trigger in these 
> situations?  Or is it hanging in some cc-mode stuff before we get that 
> far?
>

No wonder.  CC Mode is a slow mode, and one of the worst offenders here. 
In this cas, IIUC, what you see is because CC Mode adds c-after-change to 
after-change-functions, which has the effect that

(put-text-property 27 1000028 'face 'font-lock-string-face)

is called no less than 1335 times after that C-y.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-04 10:35                                       ` Dmitry Gutov
@ 2022-08-04 11:29                                         ` Gregory Heytings
  2022-08-04 11:59                                           ` Stefan Kangas
  2022-08-04 13:09                                         ` Eli Zaretskii
  1 sibling, 1 reply; 685+ messages in thread
From: Gregory Heytings @ 2022-08-04 11:29 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: gerd.moellmann, 56682, Eli Zaretskii, monnier


>
> So there is a particular performance problem with the display of 
> fontified buffers which I'd really like your help in fixing.
>

Thank you, but that problem has, as you can see, already been fixed.

>
> Fixing in a way that doesn't add narrowing around 
> fontification-functions, because as we can see it's not necessary in 
> examples like this.
>

As I said, your 88K example file is not representative.  So the fact that 
it's not necessary in that tiny example file says nothing about much 
larger files.

>
> I think we could have both speed and correctness, at least for files of 
> this size.
>

Feel free to enlarge long-line-threshold in your init file.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-04 11:29                                         ` Gregory Heytings
@ 2022-08-04 11:59                                           ` Stefan Kangas
  2022-08-04 12:05                                             ` Gregory Heytings
  0 siblings, 1 reply; 685+ messages in thread
From: Stefan Kangas @ 2022-08-04 11:59 UTC (permalink / raw)
  To: Gregory Heytings, Dmitry Gutov
  Cc: gerd.moellmann, 56682, Eli Zaretskii, monnier

Gregory Heytings <gregory@heytings.org> writes:

>> I think we could have both speed and correctness, at least for files of
>> this size.
>
> Feel free to enlarge long-line-threshold in your init file.

Just a curious question: How did we arrive at the current value of
`long-line-threshold'?

I've been trying to follow the discussion but I don't think this has
been mentioned anywhere.  My apologies if I missed it.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-04 11:59                                           ` Stefan Kangas
@ 2022-08-04 12:05                                             ` Gregory Heytings
  2022-08-04 12:40                                               ` Eli Zaretskii
  2022-08-04 21:37                                               ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  0 siblings, 2 replies; 685+ messages in thread
From: Gregory Heytings @ 2022-08-04 12:05 UTC (permalink / raw)
  To: Stefan Kangas; +Cc: gerd.moellmann, 56682, Eli Zaretskii, monnier, Dmitry Gutov

[-- Attachment #1: Type: text/plain, Size: 568 bytes --]


>>> I think we could have both speed and correctness, at least for files 
>>> of this size.
>>
>> Feel free to enlarge long-line-threshold in your init file.
>
> Just a curious question: How did we arrive at the current value of 
> `long-line-threshold'?
>

I took the same value that Stefan had chosen for syntax-wholeline-max.

>
> I've been trying to follow the discussion but I don't think this has 
> been mentioned anywhere.  My apologies if I missed it.
>

No need to apologize, you're a careful reader 😃, it hasn't been mentioned 
indeed.

^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-04 12:05                                             ` Gregory Heytings
@ 2022-08-04 12:40                                               ` Eli Zaretskii
  2022-08-04 13:10                                                 ` Gregory Heytings
  2022-08-04 21:37                                               ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  1 sibling, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-04 12:40 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: gerd.moellmann, 56682, stefankangas, monnier, dgutov

> Date: Thu, 04 Aug 2022 12:05:14 +0000
> From: Gregory Heytings <gregory@heytings.org>
> cc: Dmitry Gutov <dgutov@yandex.ru>, gerd.moellmann@gmail.com, 
>     56682@debbugs.gnu.org, Eli Zaretskii <eliz@gnu.org>, 
>     monnier@iro.umontreal.ca
> 
> >> Feel free to enlarge long-line-threshold in your init file.
> >
> > Just a curious question: How did we arrive at the current value of 
> > `long-line-threshold'?
> >
> 
> I took the same value that Stefan had chosen for syntax-wholeline-max.

And it isn't sacred in any way.  If we decide a different value
strikes a better balance, we will change it.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-04 10:35                                       ` Dmitry Gutov
  2022-08-04 11:29                                         ` Gregory Heytings
@ 2022-08-04 13:09                                         ` Eli Zaretskii
  2022-08-05  1:39                                           ` Dmitry Gutov
  1 sibling, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-04 13:09 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: gerd.moellmann, 56682, gregory, monnier

> Date: Thu, 4 Aug 2022 13:35:39 +0300
> Cc: gerd.moellmann@gmail.com, 56682@debbugs.gnu.org,
>  Eli Zaretskii <eliz@gnu.org>, monnier@iro.umontreal.ca
> From: Dmitry Gutov <dgutov@yandex.ru>
> 
> > It's a tiny file, not in any way representative of the ones we're 
> > dealing with.  But amusingly, even with that tiny file, you can see the 
> > problem at hand.  Do M-: (setq long-line-threshold nil) RET, and open it 
> > in a large enough window (e.g. 160 characters).  Type M->, and try to 
> > move point there with C-p or C-n.  You'll see that Emacs is already 
> > sluggish.
> 
> That's the scenario I described, and that's my point: this file's 
> display is sluggish. Even though font-lock has already finished its 
> work. And it didn't have to spend any significant time in syntax-ppss.
> 
> So there is a particular performance problem with the display of 
> fontified buffers which I'd really like your help in fixing.

Maybe it is in display, and maybe it isn't.  Do you have any evidence
that the sluggish response is due to redisplay?  C-n, for example, is
mostly not redisplay, but Lisp code in simple.el and occasional calls
to vertical-motion.

But even if the slow response is due to redisplay, we just have
another cause that we need to investigate and try fixing.  It says
nothing about the measures we've already taken on master.  They
definitely make even this case faster, and with an unoptimized build I
can now reasonably edit this file, something I couldn't do before.

> Fixing in a way that doesn't add narrowing around 
> fontification-functions, because as we can see it's not necessary in 
> examples like this.

If that is possible, sure.  No one said that from now on every problem
in Emacs that causes slow responses will be handled by narrowing.  But
if, for example, it turns out that the slow responses is due to time
it takes some code to traverse a long stretch of fontified buffer,
what other solution would you suggest except making the portion to be
traversed shorter?

> > If you dislike mis-fontification, turn font-lock mode off.  It's as easy 
> > as that.  Mis-fontification is expected in such cases.  The docstring of 
> > syntax-wholeline-max also mentions that "misfontification may then 
> > occur". Why did you not protest at that time?
> 
> I think we could have both speed and correctness, at least for files of 
> this size.

That is not a given, and the experience till now suggests otherwise.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-04 10:33                                                 ` Gregory Heytings
@ 2022-08-04 13:10                                                   ` Eli Zaretskii
  2022-08-04 14:14                                                   ` Eli Zaretskii
  1 sibling, 0 replies; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-04 13:10 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: gerd.moellmann, 56682, monnier, dgutov

> Date: Thu, 04 Aug 2022 10:33:48 +0000
> From: Gregory Heytings <gregory@heytings.org>
> cc: gerd.moellmann@gmail.com, 56682@debbugs.gnu.org, monnier@iro.umontreal.ca, 
>     dgutov@yandex.ru
> 
> I know next to nothing about bidi, so it's very well possible indeed that 
> I confused "bidi" and "composition" (or "bidi composition"?).  Anyway, 
> navigating through the locales.json file was slow (at some positions) 
> before the change and is now reasonably fast (but alas not instantaneous).
> 
> >
> > Are you saying that if you replace the Arabic text there with some other 
> > script that also requires composition processing (like one of the Indic 
> > scripts, see lisp/language/indian.el), editing this file is 
> > significantly faster?
> >
> 
> I think the locales.json file contains samples of pretty much all 
> available scripts.  Devanagari for example is around position 3260000. 
> As far as I can tell, navigating in that part of the file is not 
> significantly faster with the change.  It is only in the parts of the file 
> that contain e.g. Arabic text that the speedup is visible, around position 
> 70000 for example.

OK, I will take a look.

> > Btw, I'm unable to edit that file on the branch, because 
> > show-paren--default causes an assertion violation.  I'm pretty sure 
> > that's due to the issues in narrow-to-region that were already fixed on 
> > master.
> 
> I just merged master into the feature branch.

Thanks.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-04 12:40                                               ` Eli Zaretskii
@ 2022-08-04 13:10                                                 ` Gregory Heytings
  0 siblings, 0 replies; 685+ messages in thread
From: Gregory Heytings @ 2022-08-04 13:10 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: gerd.moellmann, 56682, dgutov, stefankangas, monnier


>>>> Feel free to enlarge long-line-threshold in your init file.
>>>
>>> Just a curious question: How did we arrive at the current value of 
>>> `long-line-threshold'?
>>
>> I took the same value that Stefan had chosen for syntax-wholeline-max.
>
> And it isn't sacred in any way.  If we decide a different value strikes 
> a better balance, we will change it.
>

Indeed (although I fear a bikeshedding here).





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-04 10:33                                                 ` Gregory Heytings
  2022-08-04 13:10                                                   ` Eli Zaretskii
@ 2022-08-04 14:14                                                   ` Eli Zaretskii
  2022-08-04 14:31                                                     ` Eli Zaretskii
  2022-08-04 15:08                                                     ` Gregory Heytings
  1 sibling, 2 replies; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-04 14:14 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: gerd.moellmann, 56682, monnier, dgutov

> Date: Thu, 04 Aug 2022 10:33:48 +0000
> From: Gregory Heytings <gregory@heytings.org>
> cc: gerd.moellmann@gmail.com, 56682@debbugs.gnu.org, monnier@iro.umontreal.ca, 
>     dgutov@yandex.ru
> 
> navigating through the locales.json file was slow (at some positions) 
> before the change and is now reasonably fast (but alas not instantaneous).

Which navigation commands were slow, as compared to the same commands
in other portions of this file?





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-04 14:14                                                   ` Eli Zaretskii
@ 2022-08-04 14:31                                                     ` Eli Zaretskii
  2022-08-04 15:25                                                       ` Gregory Heytings
  2022-08-04 15:08                                                     ` Gregory Heytings
  1 sibling, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-04 14:31 UTC (permalink / raw)
  To: gregory, gerd.moellmann, 56682, monnier, dgutov

> Cc: gerd.moellmann@gmail.com, 56682@debbugs.gnu.org, monnier@iro.umontreal.ca,
>  dgutov@yandex.ru
> Date: Thu, 04 Aug 2022 17:14:58 +0300
> From: Eli Zaretskii <eliz@gnu.org>
> 
> > Date: Thu, 04 Aug 2022 10:33:48 +0000
> > From: Gregory Heytings <gregory@heytings.org>
> > cc: gerd.moellmann@gmail.com, 56682@debbugs.gnu.org, monnier@iro.umontreal.ca, 
> >     dgutov@yandex.ru
> > 
> > navigating through the locales.json file was slow (at some positions) 
> > before the change and is now reasonably fast (but alas not instantaneous).
> 
> Which navigation commands were slow, as compared to the same commands
> in other portions of this file?

Just before the Devanagari portion of the file, there's the Hebrew
portion, starting around buffer position 3243400.  If you go there and
try the same navigation commands that were slow with Arabic, are they
as slow with Hebrew (which is also a right-to-left script, but doesn't
use character compositions nearly as heavily as Arabic)?  Here it
looks like Hebrew is noticeably faster, as fast as Devanagari.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-04 14:14                                                   ` Eli Zaretskii
  2022-08-04 14:31                                                     ` Eli Zaretskii
@ 2022-08-04 15:08                                                     ` Gregory Heytings
  2022-08-04 16:00                                                       ` Eli Zaretskii
  1 sibling, 1 reply; 685+ messages in thread
From: Gregory Heytings @ 2022-08-04 15:08 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: gerd.moellmann, 56682, monnier, dgutov


>> navigating through the locales.json file was slow (at some positions) 
>> before the change and is now reasonably fast (but alas not 
>> instantaneous).
>
> Which navigation commands were slow, as compared to the same commands in 
> other portions of this file?
>

For example C-p, C-n, C-v, M-v.  C-f and C-b also, but much less so.

For example, open the file and do M-g c 70000 RET.  This took about 5 
seconds.  Now do C-n, this again took about 5 seconds.  With the 
optimizations, M-g c 70000 RET is almost immediate, and C-n there takes 
less than a second.

But you're right, this slowdown has little to do with bidi.  A file with a 
sufficiently long single line of Arabic text has the same problem.  (But 
not one with a line of Hebrew text.)





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-04 14:31                                                     ` Eli Zaretskii
@ 2022-08-04 15:25                                                       ` Gregory Heytings
  0 siblings, 0 replies; 685+ messages in thread
From: Gregory Heytings @ 2022-08-04 15:25 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: gerd.moellmann, 56682, monnier, dgutov


>
> Just before the Devanagari portion of the file, there's the Hebrew 
> portion, starting around buffer position 3243400.  If you go there and 
> try the same navigation commands that were slow with Arabic, are they as 
> slow with Hebrew (which is also a right-to-left script, but doesn't use 
> character compositions nearly as heavily as Arabic)?  Here it looks like 
> Hebrew is noticeably faster, as fast as Devanagari.
>

Sorry, I hadn't seen this post before replying to the previous one. 
Indeed, as I said in my previous reply navigation commands in Hebrew texts 
are much faster than in Arabic texts.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-04 15:08                                                     ` Gregory Heytings
@ 2022-08-04 16:00                                                       ` Eli Zaretskii
  2022-08-04 16:25                                                         ` Gregory Heytings
  0 siblings, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-04 16:00 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: gerd.moellmann, 56682, monnier, dgutov

> Date: Thu, 04 Aug 2022 15:08:07 +0000
> From: Gregory Heytings <gregory@heytings.org>
> cc: gerd.moellmann@gmail.com, 56682@debbugs.gnu.org, monnier@iro.umontreal.ca, 
>     dgutov@yandex.ru
> 
> For example C-p, C-n, C-v, M-v.  C-f and C-b also, but much less so.
> 
> For example, open the file and do M-g c 70000 RET.  This took about 5 
> seconds.  Now do C-n, this again took about 5 seconds.  With the 
> optimizations, M-g c 70000 RET is almost immediate, and C-n there takes 
> less than a second.

I'm on the branch, so I am _after_ the optimizations.  I thought you
said even after that the navigation is sluggish.  I see somewhat
slower response than in "normal" files, but my build is unoptimized,
so where it takes 3 or 4 seconds, and optimized build should be almost
instantaneous.  And that looks good enough to me, since being a bit
slower in such files is IMO fine.

> But you're right, this slowdown has little to do with bidi.  A file with a 
> sufficiently long single line of Arabic text has the same problem.  (But 
> not one with a line of Hebrew text.)

OK.  Text that goes through character compositions is expected to be
slower in redisplay, because character composition in Emacs works by
calling into Lisp.  So I think we are good here, do you agree?





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-04 16:00                                                       ` Eli Zaretskii
@ 2022-08-04 16:25                                                         ` Gregory Heytings
  2022-08-04 17:06                                                           ` Eli Zaretskii
  0 siblings, 1 reply; 685+ messages in thread
From: Gregory Heytings @ 2022-08-04 16:25 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: gerd.moellmann, 56682, monnier, dgutov


>> For example C-p, C-n, C-v, M-v.  C-f and C-b also, but much less so.
>>
>> For example, open the file and do M-g c 70000 RET.  This took about 5 
>> seconds.  Now do C-n, this again took about 5 seconds.  With the 
>> optimizations, M-g c 70000 RET is almost immediate, and C-n there takes 
>> less than a second.
>
> I'm on the branch, so I am _after_ the optimizations.  I thought you 
> said even after that the navigation is sluggish.
>

Yes, that's what I said indeed.

>
> I see somewhat slower response than in "normal" files, but my build is 
> unoptimized, so where it takes 3 or 4 seconds, and optimized build 
> should be almost instantaneous. And that looks good enough to me, since 
> being a bit slower in such files is IMO fine.
>

It's not really "almost instantaneous", moving point can take (depending 
on factors I do not understand at the moment) something between 0.2 
seconds and 2 seconds.

>
> OK.  Text that goes through character compositions is expected to be 
> slower in redisplay, because character composition in Emacs works by 
> calling into Lisp.
>

So Arabic text goes through character compositions and Hebrew text 
doesn't, is that correct?

>
> So I think we are good here, do you agree?
>

Hmmm...  I still think it would be possible to do better.  With the above 
recipe (M-g g 70000 RET C-n), composition_compute_stop_pos is called 
627663 times and uses about 2 seconds of CPU time.  What surprises me (and 
makes me believe it's perhaps possible to do better) is that it is called 
repeatedly with the same arguments.  For example, when doing C-n it is 
called 26 times with charpos = 69980.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-04 16:25                                                         ` Gregory Heytings
@ 2022-08-04 17:06                                                           ` Eli Zaretskii
  2022-08-04 18:16                                                             ` Gregory Heytings
  0 siblings, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-04 17:06 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: gerd.moellmann, 56682, monnier, dgutov

> Date: Thu, 04 Aug 2022 16:25:28 +0000
> From: Gregory Heytings <gregory@heytings.org>
> cc: gerd.moellmann@gmail.com, 56682@debbugs.gnu.org, monnier@iro.umontreal.ca, 
>     dgutov@yandex.ru
> 
> > I'm on the branch, so I am _after_ the optimizations.  I thought you 
> > said even after that the navigation is sluggish.
> 
> Yes, that's what I said indeed.
> 
> > I see somewhat slower response than in "normal" files, but my build is 
> > unoptimized, so where it takes 3 or 4 seconds, and optimized build 
> > should be almost instantaneous. And that looks good enough to me, since 
> > being a bit slower in such files is IMO fine.
> 
> It's not really "almost instantaneous", moving point can take (depending 
> on factors I do not understand at the moment) something between 0.2 
> seconds and 2 seconds.

I saw slower response when point was at a parentesis or a brace -- due
to show-paren-mode.  Try disabling it and see if that affects
performance.  Another problem could be the BPA algorithm in bidi.c,
but in my testing setting bidi-inhibit-bpa non-nil didn't affect
performance in any tangible way, with this file.

> > OK.  Text that goes through character compositions is expected to be 
> > slower in redisplay, because character composition in Emacs works by 
> > calling into Lisp.
> 
> So Arabic text goes through character compositions and Hebrew text 
> doesn't, is that correct?

More accurately, Arabic text needs to call the shaping engine
(HarfBuzz) for all the characters, whereas Hebrew does that only
rarely (and not at all in locales.json).  You can see from the
composition rules in, respectively, lisp/language/misc-lang.el and
lisp/language/hebrew.el that for Arabic, the entire range of Arabic
characters is populated with composition rules in
composition-function-table, whereas for Hebrew, only some relatively
rare characters have non-nil rules.

> > So I think we are good here, do you agree?
> 
> Hmmm...  I still think it would be possible to do better.  With the above 
> recipe (M-g g 70000 RET C-n), composition_compute_stop_pos is called 
> 627663 times and uses about 2 seconds of CPU time.  What surprises me (and 
> makes me believe it's perhaps possible to do better) is that it is called 
> repeatedly with the same arguments.  For example, when doing C-n it is 
> called 26 times with charpos = 69980.

I'll see where these come from and whether some of them could be
avoided.

Are you capable of running under perf and producing the profile of
these commands?  Because I wonder whether we correctly identify the
main bottlenecks in these scenarios.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-04 17:06                                                           ` Eli Zaretskii
@ 2022-08-04 18:16                                                             ` Gregory Heytings
  2022-08-04 18:52                                                               ` Eli Zaretskii
  0 siblings, 1 reply; 685+ messages in thread
From: Gregory Heytings @ 2022-08-04 18:16 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: gerd.moellmann, 56682, monnier, dgutov


>> It's not really "almost instantaneous", moving point can take 
>> (depending on factors I do not understand at the moment) something 
>> between 0.2 seconds and 2 seconds.
>
> I saw slower response when point was at a parentesis or a brace -- due 
> to show-paren-mode.  Try disabling it and see if that affects 
> performance.
>

I forgot to mention that this is with show-paren-mode disabled.

>
> Another problem could be the BPA algorithm in bidi.c, but in my testing 
> setting bidi-inhibit-bpa non-nil didn't affect performance in any 
> tangible way, with this file.
>

Indeed.

>
> More accurately, Arabic text needs to call the shaping engine (HarfBuzz) 
> for all the characters, whereas Hebrew does that only rarely (and not at 
> all in locales.json).  You can see from the composition rules in, 
> respectively, lisp/language/misc-lang.el and lisp/language/hebrew.el 
> that for Arabic, the entire range of Arabic characters is populated with 
> composition rules in composition-function-table, whereas for Hebrew, 
> only some relatively rare characters have non-nil rules.
>

Okay, thanks!

>> Hmmm...  I still think it would be possible to do better.  With the 
>> above recipe (M-g g 70000 RET C-n), composition_compute_stop_pos is 
>> called 627663 times and uses about 2 seconds of CPU time.  What 
>> surprises me (and makes me believe it's perhaps possible to do better) 
>> is that it is called repeatedly with the same arguments.  For example, 
>> when doing C-n it is called 26 times with charpos = 69980.
>
> I'll see where these come from and whether some of them could be 
> avoided.
>
> Are you capable of running under perf and producing the profile of these 
> commands?  Because I wonder whether we correctly identify the main 
> bottlenecks in these scenarios.
>

I can't speak in general, but in this particular scenario, the bottleneck 
is clearly composition_compute_stop_pos.

You didn't tell me whether it's okay to merge the branch with the latest 
changes?





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-04 18:16                                                             ` Gregory Heytings
@ 2022-08-04 18:52                                                               ` Eli Zaretskii
  2022-08-04 19:26                                                                 ` Gregory Heytings
  0 siblings, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-04 18:52 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: gerd.moellmann, 56682, monnier, dgutov

> Date: Thu, 04 Aug 2022 18:16:02 +0000
> From: Gregory Heytings <gregory@heytings.org>
> cc: gerd.moellmann@gmail.com, 56682@debbugs.gnu.org, monnier@iro.umontreal.ca, 
>     dgutov@yandex.ru
> 
> >> Hmmm...  I still think it would be possible to do better.  With the 
> >> above recipe (M-g g 70000 RET C-n), composition_compute_stop_pos is 
> >> called 627663 times and uses about 2 seconds of CPU time.  What 
> >> surprises me (and makes me believe it's perhaps possible to do better) 
> >> is that it is called repeatedly with the same arguments.  For example, 
> >> when doing C-n it is called 26 times with charpos = 69980.
> >
> > I'll see where these come from and whether some of them could be 
> > avoided.
> >
> > Are you capable of running under perf and producing the profile of these 
> > commands?  Because I wonder whether we correctly identify the main 
> > bottlenecks in these scenarios.
> >
> 
> I can't speak in general, but in this particular scenario, the bottleneck 
> is clearly composition_compute_stop_pos.

I looked into this, and I don't see how this could be avoided,
unfortunately, not without disabling auto-composition-mode (which I'm
told produces display of Arabic that makes readers of that script turn
away in disgust).  Disabling auto-composition-mode makes navigation
there about twice faster, as fast as in the other parts of the file.

The problem here is that bidi iteration through buffer text is
non-linear (it follows the visual order, not the order of buffer
positions), so the iterator frequently finds itself out of sync with
the next known "stop position", and needs to resync, to be able to
find which faces, overlays, and invisible and display properties are
in effect.  That's what handle_stop_backwards does, and that involves
going back and rescanning text.  With Arabic, this is exacerbated by
the fact that every Arabic character is "composable" (in the sense of
the CHAR_COMPOSED_P macro), and triggers a call to
composition_compute_stop_pos to find the next (or previous) one.

And on top of that, C-n calls pos-visible-in-window-p two or 3 times,
posn-at-point 2 times, and then vertical-motion.  Each one of these
needs to scan text around point starting from the beginning of the
previous visible line.  The narrowing limits that to some reasonable
distance, but it is still several thousand characters back.

So if composition_compute_stop_pos is the bottleneck, perhaps some
simple caching could help?  But note that when this function is called
twice with the same character position, it is called to search in
different directions -- once forward and another time back.  So even
such low-hanging fruit is not simple to reap, as these two calls will
return two different results.

For now, I don't see how to speed this up, without producing woefully
incorrect display.  I will keep thinking, but I'm not too worried
about this case, since the current performance is tolerable enough,
even if somewhat sluggish.

> You didn't tell me whether it's okay to merge the branch with the latest 
> changes?

I think you can merge.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-04 18:52                                                               ` Eli Zaretskii
@ 2022-08-04 19:26                                                                 ` Gregory Heytings
  2022-08-05  6:05                                                                   ` Eli Zaretskii
  0 siblings, 1 reply; 685+ messages in thread
From: Gregory Heytings @ 2022-08-04 19:26 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: gerd.moellmann, 56682, monnier, dgutov


>
> So if composition_compute_stop_pos is the bottleneck, perhaps some 
> simple caching could help?
>

This is exactly what I tried...

>
> But note that when this function is called twice with the same character 
> position, it is called to search in different directions -- once forward 
> and another time back.
>

... but I missed that important piece of the puzzle, thanks!

>
> For now, I don't see how to speed this up, without producing woefully 
> incorrect display.  I will keep thinking, but I'm not too worried about 
> this case, since the current performance is tolerable enough, even if 
> somewhat sluggish.
>

Alas, it becomes much more sluggish if with a larger frame (160 columns 
instead of 80), and/or with only Arabic characters.  Emacs takes ~10 
seconds to open a file with only 6000 characters on a single line, and 
motion commands are slow.

>> You didn't tell me whether it's okay to merge the branch with the 
>> latest changes?
>
> I think you can merge.
>

Done.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-04  1:30                                                     ` Gregory Heytings
@ 2022-08-04 21:24                                                       ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  0 siblings, 0 replies; 685+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2022-08-04 21:24 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, Eli Zaretskii, Dmitry Gutov

> To make syntax-ppss faster, if possible?
> Is that not a sensible thing to do?

It's surely possible and useful, regardless if what I said is true
or not :-)


        Stefan






^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-04 12:05                                             ` Gregory Heytings
  2022-08-04 12:40                                               ` Eli Zaretskii
@ 2022-08-04 21:37                                               ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  1 sibling, 0 replies; 685+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2022-08-04 21:37 UTC (permalink / raw)
  To: Gregory Heytings
  Cc: gerd.moellmann, 56682, Eli Zaretskii, Stefan Kangas, Dmitry Gutov

>> Just a curious question: How did we arrive at the current value of
>> `long-line-threshold'?
> I took the same value that Stefan had chosen for syntax-wholeline-max.

For the record, I chose 10K based on ... a wild guess that a 10K is
"definitely" in the camp of "very long lines" (it's not just a normal
line that happens to be a bit long) yet at the same time it is hopefully
short enough that it shouldn't take too much time to process.


        Stefan






^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-04  5:40                                                             ` Eli Zaretskii
@ 2022-08-04 22:35                                                               ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-08-05  6:20                                                                 ` Eli Zaretskii
  2022-08-05 10:00                                                                 ` Gregory Heytings
  0 siblings, 2 replies; 685+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2022-08-04 22:35 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, gregory, dgutov

>> The wholelines problem did not kick in because of PPS nor `syntax-ppss`
>> but because of font-lock (which then called `syntax-ppss` which then
>> called PPS).
> If it's font-lock that forces syntax-ppss to examine the whole huge
> line, then what is your proposal for avoiding that which doesn't
> involve some more-or-less arbitrary restrictions on the part of the
> buffer that can be examined by syntax-ppss?

The use of `syntax-wholeline-max` in
`font-lock-extend-region-wholelines` supposedly fixed this problem since
it changed `font-lock` so it doesn't ask `syntax-ppss` to compute the
whole line/buffer.


        Stefan






^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-04 13:09                                         ` Eli Zaretskii
@ 2022-08-05  1:39                                           ` Dmitry Gutov
  2022-08-05  7:38                                             ` Eli Zaretskii
  2022-08-05  8:21                                             ` Gregory Heytings
  0 siblings, 2 replies; 685+ messages in thread
From: Dmitry Gutov @ 2022-08-05  1:39 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: gerd.moellmann, 56682, gregory, monnier

On 04.08.2022 16:09, Eli Zaretskii wrote:

>> That's the scenario I described, and that's my point: this file's
>> display is sluggish. Even though font-lock has already finished its
>> work. And it didn't have to spend any significant time in syntax-ppss.
>>
>> So there is a particular performance problem with the display of
>> fontified buffers which I'd really like your help in fixing.
> 
> Maybe it is in display, and maybe it isn't.  Do you have any evidence
> that the sluggish response is due to redisplay?  C-n, for example, is
> mostly not redisplay, but Lisp code in simple.el and occasional calls
> to vertical-motion.

I come to that conclusion by observing said sluggish movement in a 
buffer that is fully fontified. And yet the delays after pressing 'C-n' 
or 'C-p' or 'C-n' seemed noticeable and very similar to delays on 
PgUp/PgDown.

Are these delays in fontification-functions? That seems unlikely given 
the buffer is fontified already in full, and none of the commands are 
causing modifications (which would force syntax-ppss cache and 
fontifications to be recalculated).

If the delays are in font-lock anyway, that might be in the code which 
checks that the area between window-start and window-end is fontified. I 
don't see why that code has to be slow (long lines or not), so it should 
be fixable easily enough. Unless 'get-text-property' or 
'next-single-property-change' can exhibit pathologic performance in the 
presence of long lines, of course. But that doesn't show up in my testing.

> But even if the slow response is due to redisplay, we just have
> another cause that we need to investigate and try fixing.

It seems to me that that cause actually has larger impact than 
font-lock, because it does show itself in a moderately-sized (88K) 
buffer, where font-lock doesn't feel like a problem. It stands to reason 
that the same "cause" might have a proportionally bigger impact in large 
buffers as well, and only after we remove it (alone), then we can 
evaluate how font-lock itself affects user experience, and how much of 
its correctness (and for buffers of which size) we want to sacrifice.

> It says
> nothing about the measures we've already taken on master.  They
> definitely make even this case faster, and with an unoptimized build I
> can now reasonably edit this file, something I couldn't do before.

If my guess is right, the fix on master whammied all over the redisplay 
with narrowing, both fixing the "cause" and restricting font-lock to the 
same narrowed region. The latter part might be unnecessary in the usual 
case (we might still decide to do that later for much larger buffers, 
but that should be decided by a separate threshold variable).

>> Fixing in a way that doesn't add narrowing around
>> fontification-functions, because as we can see it's not necessary in
>> examples like this.
> 
> If that is possible, sure.  No one said that from now on every problem
> in Emacs that causes slow responses will be handled by narrowing.  But
> if, for example, it turns out that the slow responses is due to time
> it takes some code to traverse a long stretch of fontified buffer,
> what other solution would you suggest except making the portion to be
> traversed shorter?

For all I know, the most optimal fix might still be implemented through 
narrowing, but it would be temporarily widened while 
fontificiation-functions are run.

>>> If you dislike mis-fontification, turn font-lock mode off.  It's as easy
>>> as that.  Mis-fontification is expected in such cases.  The docstring of
>>> syntax-wholeline-max also mentions that "misfontification may then
>>> occur". Why did you not protest at that time?
>>
>> I think we could have both speed and correctness, at least for files of
>> this size.
> 
> That is not a given, and the experience till now suggests otherwise.

I have commented out the code which applies the narrowing in 
'handle_fontified_prop' and recompiled.

The result:

- My 88K file is fontified correctly now. The redisplay and scrolling 
performance seem unaffected (meaning still fast).
- dictionary.json (18M) seems to be fontified correctly as well now 
(it's a mess by default on master), its scrolling performance is 
unaffected too. The difference: I have to wait ~2 seconds the first time 
I press 'M->'.

BTW, 'M-> M-<' triggers some puzzling long wait (~3 seconds) both on 
master and with my change, every time I issue this sequence of commands.

diff --git a/src/xdisp.c b/src/xdisp.c
index 099efed2db..02d7f6c562 100644
--- a/src/xdisp.c
+++ b/src/xdisp.c
@@ -4391,19 +4391,19 @@ handle_fontified_prop (struct it *it)

        eassert (it->end_charpos == ZV);

-      if (current_buffer->long_line_optimizations_p)
-	{
-	  ptrdiff_t begv = it->narrowed_begv;
-	  ptrdiff_t zv = it->narrowed_zv;
-	  ptrdiff_t charpos = IT_CHARPOS (*it);
-	  if (charpos < begv || charpos > zv)
-	    {
-	      begv = get_narrowed_begv (it->w, charpos);
-	      zv = get_narrowed_zv (it->w, charpos);
-	    }
-	  narrow_to_region_internal (make_fixnum (begv), make_fixnum (zv), true);
-	  specbind (Qrestrictions_locked, Qt);
-	}
+      /* if (current_buffer->long_line_optimizations_p) */
+      /* 	{ */
+      /* 	  ptrdiff_t begv = it->narrowed_begv; */
+      /* 	  ptrdiff_t zv = it->narrowed_zv; */
+      /* 	  ptrdiff_t charpos = IT_CHARPOS (*it); */
+      /* 	  if (charpos < begv || charpos > zv) */
+      /* 	    { */
+      /* 	      begv = get_narrowed_begv (it->w, charpos); */
+      /* 	      zv = get_narrowed_zv (it->w, charpos); */
+      /* 	    } */
+      /* 	  narrow_to_region_internal (make_fixnum (begv), make_fixnum 
(zv), true); */
+      /* 	  specbind (Qrestrictions_locked, Qt); */
+      /* 	} */

        /* Don't allow Lisp that runs from 'fontification-functions'
  	 clear our face and image caches behind our back.  */





^ permalink raw reply related	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-02 14:57                                           ` Gregory Heytings
  2022-08-02 16:14                                             ` Eli Zaretskii
  2022-08-02 22:04                                             ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2022-08-05  2:03                                             ` Dmitry Gutov
  2022-08-05  7:43                                               ` Eli Zaretskii
  2022-08-05  8:23                                               ` Gregory Heytings
  2 siblings, 2 replies; 685+ messages in thread
From: Dmitry Gutov @ 2022-08-05  2:03 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, Eli Zaretskii, monnier

On 02.08.2022 17:57, Gregory Heytings wrote:
> 
>>
>> Regarding the long-standing bug reports, we did solve a bunch of 
>> issues already. One major one, IIUC, was redisplay of already 
>> fontified text on long lines.
>>
> 
> Try to open the dictionary.json with Emacs on master a month ago.  It's 
> a small file (only 18 MB).  On my computer just opening the file with 
> emacs -Q takes 220 seconds.  220 seconds during which Emacs is 
> completely locked, because of font-lock mode.  If you're not convinced, 
> turn font-lock mode off, open the file, and turn font-lock mode on.

I downloaded that file, and I commented out the code in 
'handle_fontified_prop' which performs the narrowing on master.

And recompiled, leaving all the other settings the same.

Visiting dictionary.json takes about 1 second.

M-> takes ~2 seconds, but only the first time (and until the next 
modification near the beginning of the buffer, I guess).

Scrolling is as fast as without my change. All fontification seems 
correct (which is not the case on master).

>> Another piece of the puzzle was added by Stefan in 15b2138719b340.
>>
> 
> That looked promising, but sadly it had only a very limited effect.
> 
>>
>> So perhaps we should re-evaluate the testing scenario to see where the 
>> current bottlenecks are. If we current main issue is the 55s spent in 
>> syntax-ppss, a more constructive approach would be to look into 
>> optimizing parse-partial-sexp. Or even give up on certain scenarios, 
>> admitting that waiting 55s once to visit the end of a 1 GB buffer is 
>> not so bad (and that could part could also be sped up by setting 
>> syntax-propertize-function to nil and using a very simple syntax 
>> table, for instance).
>>
> 
> It is bad, especially now that it became clear that in fact it's not 
> "waiting 55s once" but "waiting 55s each time the buffer is modified and 
> you move to another position in the buffer".

That was about a 1 GB buffer, right?

Let's take care of buffers with more reasonable sizes first, and then we 
can consider extremes. A separate threshold for syntax-ppss to avoid 
parsing the whole buffer might fit the bill.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-04 19:26                                                                 ` Gregory Heytings
@ 2022-08-05  6:05                                                                   ` Eli Zaretskii
  2022-08-05  9:37                                                                     ` Gregory Heytings
  0 siblings, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-05  6:05 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: gerd.moellmann, 56682, monnier, dgutov

> Date: Thu, 04 Aug 2022 19:26:03 +0000
> From: Gregory Heytings <gregory@heytings.org>
> cc: gerd.moellmann@gmail.com, 56682@debbugs.gnu.org, monnier@iro.umontreal.ca, 
>     dgutov@yandex.ru
> 
> Alas, it becomes much more sluggish if with a larger frame (160 columns 
> instead of 80), and/or with only Arabic characters.  Emacs takes ~10 
> seconds to open a file with only 6000 characters on a single line, and 
> motion commands are slow.

It doesn't surprise me.  If you disable font-lock and show-paren-mode,
does it become significantly faster?  And how does disabling font-lock
that measure vs disabling auto-composition-mode with that file?

Can you post that file?  I'd like to try some ideas I might have with
it.

> >> You didn't tell me whether it's okay to merge the branch with the 
> >> latest changes?
> >
> > I think you can merge.
> 
> Done.

Thanks.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-04 22:35                                                               ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2022-08-05  6:20                                                                 ` Eli Zaretskii
  2022-08-05  9:03                                                                   ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-08-05 10:00                                                                 ` Gregory Heytings
  1 sibling, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-05  6:20 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: 56682, gregory, dgutov

> From: Stefan Monnier <monnier@iro.umontreal.ca>
> Cc: gregory@heytings.org,  dgutov@yandex.ru,  56682@debbugs.gnu.org
> Date: Thu, 04 Aug 2022 18:35:36 -0400
> 
> >> The wholelines problem did not kick in because of PPS nor `syntax-ppss`
> >> but because of font-lock (which then called `syntax-ppss` which then
> >> called PPS).
> > If it's font-lock that forces syntax-ppss to examine the whole huge
> > line, then what is your proposal for avoiding that which doesn't
> > involve some more-or-less arbitrary restrictions on the part of the
> > buffer that can be examined by syntax-ppss?
> 
> The use of `syntax-wholeline-max` in
> `font-lock-extend-region-wholelines` supposedly fixed this problem since
> it changed `font-lock` so it doesn't ask `syntax-ppss` to compute the
> whole line/buffer.

It did?

And if it did, how is that better or different from a locked
narrowing?





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-05  1:39                                           ` Dmitry Gutov
@ 2022-08-05  7:38                                             ` Eli Zaretskii
  2022-08-05  8:21                                             ` Gregory Heytings
  1 sibling, 0 replies; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-05  7:38 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: gerd.moellmann, 56682, gregory, monnier

> Date: Fri, 5 Aug 2022 04:39:46 +0300
> Cc: gregory@heytings.org, gerd.moellmann@gmail.com, 56682@debbugs.gnu.org,
>  monnier@iro.umontreal.ca
> From: Dmitry Gutov <dgutov@yandex.ru>
> 
> >> So there is a particular performance problem with the display of
> >> fontified buffers which I'd really like your help in fixing.
> > 
> > Maybe it is in display, and maybe it isn't.  Do you have any evidence
> > that the sluggish response is due to redisplay?  C-n, for example, is
> > mostly not redisplay, but Lisp code in simple.el and occasional calls
> > to vertical-motion.
> 
> I come to that conclusion by observing said sluggish movement in a 
> buffer that is fully fontified. And yet the delays after pressing 'C-n' 
> or 'C-p' or 'C-n' seemed noticeable and very similar to delays on 
> PgUp/PgDown.

There's much more to C-n/C-p/C-v/M-v than just fontifications and
redisplay.  If fontification-functions are out of the picture, it
doesn't yet follow that the only factor that is left is redisplay.

In general, redisplay _is_ slower when there are non-default faces in
the buffer, but (a) that is inevitable due to additional processing,
and (b) I hope you are not arguing against having font-lock faces, are
you?  The question, therefore, is whether the additional processing
due to font-lock faces, by itself, is or isn't a significant factor in
the slowdown you observe?  I don't see how that question could be
answered except by profiling.

> Are these delays in fontification-functions? That seems unlikely given 
> the buffer is fontified already in full

When the buffer is fully fontified, Emacs will not call
fontification-functions at all, unless the buffer becomes modified.

> If the delays are in font-lock anyway, that might be in the code which 
> checks that the area between window-start and window-end is fontified.

Unlikely.  That test uses the interval tree, and is reasonably fast.
But again, only profiling will tell the truth.

> I 
> don't see why that code has to be slow (long lines or not), so it should 
> be fixable easily enough. Unless 'get-text-property' or 
> 'next-single-property-change' can exhibit pathologic performance in the 
> presence of long lines, of course. But that doesn't show up in my testing.

get-text-property and its ilk don't treat newlines as special
characters, and don't even access buffer text at all.  So no, that is
most probably not a significant factor here.

> > But even if the slow response is due to redisplay, we just have
> > another cause that we need to investigate and try fixing.
> 
> It seems to me that that cause actually has larger impact than 
> font-lock, because it does show itself in a moderately-sized (88K) 
> buffer, where font-lock doesn't feel like a problem.

"Doesn't feel" like a problem?  On what is that feeling based?

We need profiling and other hard data.  It is impossible to argue
based on feelings.

> It stands to reason 
> that the same "cause" might have a proportionally bigger impact in large 
> buffers as well, and only after we remove it (alone), then we can 
> evaluate how font-lock itself affects user experience, and how much of 
> its correctness (and for buffers of which size) we want to sacrifice.

The buffer size shouldn't matter if lines are not too long, because
redisplay always examines a small portion of the buffer that fits in
the window, and sometimes also a couple of lines above and below.  If
lines _are_ long, then yes, their length (not the buffer size) is a
significant factor, because the redisplay algorithms many times need
to start from a previous line's beginning, to anchor their layout
calculations (because only there the X coordinate is known in
advance).

That is the root cause which these changes we are discussing are
trying to eliminate or at least alleviate.

There are no other causes we know about.  If you claim that there are
such causes, you need to show that, not just by reasoning, but by
measurements, after you eliminate the already-known effects, like the
length of a physical line, character composition (when the script of
the characters requires it), etc.

And please keep in mind that without long lines, any slowdown factors
that we could have are unlikely to cause unreasonably slow responses,
because otherwise we'd have complaints about that long ago.  (In fact
we did have such complaints, and the problems they reported were fixed
in past releases.)  The only known situation with large buffers that
is yet unsolved in core is when the buffer is larger than the
available memory, so it causes paging when buffer text is accessed for
display or navigation.

The mental model you are building and on whose basis you are trying to
reason about the ways to solve this problem should take all of the
above into account.  Only after that you may have a chance of
identifying some hidden factor that eluded us, whose elimination could
then allow to solve these problems without the narrowing we are now
using.

> > It says
> > nothing about the measures we've already taken on master.  They
> > definitely make even this case faster, and with an unoptimized build I
> > can now reasonably edit this file, something I couldn't do before.
> 
> If my guess is right, the fix on master whammied all over the redisplay 
> with narrowing, both fixing the "cause" and restricting font-lock to the 
> same narrowed region. The latter part might be unnecessary in the usual 
> case (we might still decide to do that later for much larger buffers, 
> but that should be decided by a separate threshold variable).

We need hard data, not guesses.  It is impractical to argue about
guesses, especially when they are based on incomplete or inaccurate
understanding of how the relevant code really behaves.  If you produce
measurements or other facts that contradict our understanding, then we
will be forced to reconsider and adapt to those facts.  For now, you
didn't yet say or show anything that amounts to such a contradiction.

> >> Fixing in a way that doesn't add narrowing around
> >> fontification-functions, because as we can see it's not necessary in
> >> examples like this.
> > 
> > If that is possible, sure.  No one said that from now on every problem
> > in Emacs that causes slow responses will be handled by narrowing.  But
> > if, for example, it turns out that the slow responses is due to time
> > it takes some code to traverse a long stretch of fontified buffer,
> > what other solution would you suggest except making the portion to be
> > traversed shorter?
> 
> For all I know, the most optimal fix might still be implemented through 
> narrowing, but it would be temporarily widened while 
> fontificiation-functions are run.

The first step of these changes didn't narrow when
fontification-functions were run.  It was still insufficient, because
font-lock still made Emacs extremely slow with long lines, whereas
disabling font-lock removed that slowness.  The next step then applied
narrowing to fontification-functions as well, and that solved the slow
cases.  This is how this activity proceeded, and this is why we are
reasonably sure at this point that fontification-functions _are_
indeed a significant slowdown factor when very long lines are
involved.

> >> I think we could have both speed and correctness, at least for files of
> >> this size.
> > 
> > That is not a given, and the experience till now suggests otherwise.
> 
> I have commented out the code which applies the narrowing in 
> 'handle_fontified_prop' and recompiled.
> 
> The result:
> 
> - My 88K file is fontified correctly now. The redisplay and scrolling 
> performance seem unaffected (meaning still fast).
> - dictionary.json (18M) seems to be fontified correctly as well now 
> (it's a mess by default on master), its scrolling performance is 
> unaffected too. The difference: I have to wait ~2 seconds the first time 
> I press 'M->'.

We consider 2 seconds of wait in this case to be "too slow".

But if all you are saying is that the value of long-line-threshold
should be changed, or that perhaps the portion of the buffer around
the window used for narrowing should be enlarged and/or exposed to
control of Lisp programs, we can discuss that.  My impression, though,
was that your arguments are much more basic: that they argue against
the very methods of solving this problem that we currently have on
master.  And that is an entirely different discussion than the one
about the default values of these thresholds.

> BTW, 'M-> M-<' triggers some puzzling long wait (~3 seconds) both on 
> master and with my change, every time I issue this sequence of commands.

It would be useful to look into the reasons of that, thanks.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-05  2:03                                             ` Dmitry Gutov
@ 2022-08-05  7:43                                               ` Eli Zaretskii
  2022-08-05 11:34                                                 ` Dmitry Gutov
  2022-08-05  8:23                                               ` Gregory Heytings
  1 sibling, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-05  7:43 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: 56682, gregory, monnier

> Date: Fri, 5 Aug 2022 05:03:39 +0300
> Cc: 56682@debbugs.gnu.org, Eli Zaretskii <eliz@gnu.org>,
>  monnier@iro.umontreal.ca
> From: Dmitry Gutov <dgutov@yandex.ru>
> 
> That was about a 1 GB buffer, right?
> 
> Let's take care of buffers with more reasonable sizes first, and then we 
> can consider extremes.

We want to solve all of them.

> A separate threshold for syntax-ppss to avoid parsing the whole
> buffer might fit the bill.

Don't we already have such a threshold?

But again, if you are just saying that the current balance between
response time and font-lock correctness is sub-optimal, and should be
made better by changing the values of the thresholds, that's a
different discussion.  For that discussion, we'd need a representative
enough sample of real-life files with long lines and in as many major
modes as possible, to make our balance really close to optimal.  I,
for one, will welcome more examples of such files, especially if they
use major modes we didn't consider until now.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-05  1:39                                           ` Dmitry Gutov
  2022-08-05  7:38                                             ` Eli Zaretskii
@ 2022-08-05  8:21                                             ` Gregory Heytings
  2022-08-05 10:49                                               ` Eli Zaretskii
  1 sibling, 1 reply; 685+ messages in thread
From: Gregory Heytings @ 2022-08-05  8:21 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: gerd.moellmann, 56682, Eli Zaretskii, monnier


>
> If my guess is right, the fix on master whammied all over the redisplay 
> with narrowing, both fixing the "cause" and restricting font-lock to the 
> same narrowed region.
>

No, as Eli told you the restriction around font-lock was added after the 
other fixes, when it became clear that fontification-functions were the 
main remaining cause of the remaining slowdowns.

>
> - dictionary.json (18M) seems to be fontified correctly as well now 
> (it's a mess by default on master), its scrolling performance is 
> unaffected too. The difference: I have to wait ~2 seconds the first time 
> I press 'M->'.
>

You have to wait 2 seconds.  I have to wait 4, and Eli has to wait 8. 
And for someone else, with older hardware, it might be 20.  And you'll see 
similar slowdowns when you modify the buffer at one place and move 
somewhere else.  This is hardly acceptable for a still relatively small 
file, if the only reason of that additional wait it to put colors on the 
buffer characters.

>
> BTW, 'M-> M-<' triggers some puzzling long wait (~3 seconds) both on 
> master and with my change, every time I issue this sequence of commands.
>

This is caused by show-paren-mode.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-05  2:03                                             ` Dmitry Gutov
  2022-08-05  7:43                                               ` Eli Zaretskii
@ 2022-08-05  8:23                                               ` Gregory Heytings
  2022-08-05 12:19                                                 ` Dmitry Gutov
  1 sibling, 1 reply; 685+ messages in thread
From: Gregory Heytings @ 2022-08-05  8:23 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: 56682, Eli Zaretskii, monnier


>> "waiting 55s once" but "waiting 55s each time the buffer is modified 
>> and you move to another position in the buffer".
>
> That was about a 1 GB buffer, right?
>
> Let's take care of buffers with more reasonable sizes first, and then we 
> can consider extremes.
>

No, because the point of considering extreme cases is that they reveal on 
your computer what happens on other people's less powerful computers with 
much smaller files.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-05  6:20                                                                 ` Eli Zaretskii
@ 2022-08-05  9:03                                                                   ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-08-05 10:57                                                                     ` Eli Zaretskii
  0 siblings, 1 reply; 685+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2022-08-05  9:03 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, gregory, dgutov

>> The use of `syntax-wholeline-max` in
>> `font-lock-extend-region-wholelines` supposedly fixed this problem since
>> it changed `font-lock` so it doesn't ask `syntax-ppss` to compute the
>> whole line/buffer.
>
> It did?
> And if it did, how is that better or different from a locked
> narrowing?

In terms of end-user behavior, it's very similar: it can break the
`font-lock-keywords` part of font-lock but it still lets `syntax-ppss`
look at the whole buffer and will thus still provide correct recognition
of strings and comments, except when the major mode relies on
`syntax-propertize-function` since that one also obeys
`syntax-wholeline-max` and can thus misbehave in a similar way to the
narrowing.

The more important difference is that it can be
tweaked/changed/broken/improved by any ELisp package without
necessitating a recompilation of Emacs's C code, or ugly workarounds to
escape the narrowing, like postponing the actual font-lock to a timer or
some such.


        Stefan






^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-05  6:05                                                                   ` Eli Zaretskii
@ 2022-08-05  9:37                                                                     ` Gregory Heytings
  2022-08-05 11:40                                                                       ` Eli Zaretskii
  0 siblings, 1 reply; 685+ messages in thread
From: Gregory Heytings @ 2022-08-05  9:37 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: gerd.moellmann, 56682, monnier, dgutov


>
> It doesn't surprise me.  If you disable font-lock and show-paren-mode, 
> does it become significantly faster?  And how does disabling font-lock 
> that measure vs disabling auto-composition-mode with that file?
>

Disabling show-paren-mode and font-lock has no effect, no.  What is 
surprising is that the speed seems to depend both on the mode and on the 
presence of bidirectionality (so it seems that after all bidi is involved 
in one way or another).

>
> Can you post that file?  I'd like to try some ideas I might have with 
> it.
>

There are now eight files:

1. https://www.heytings.org/data/arabic-large.json
2. https://www.heytings.org/data/arabic-large.json.txt
3. https://www.heytings.org/data/arabic-large.txt
4. https://www.heytings.org/data/arabic-large.txt.json
5. https://www.heytings.org/data/arabic-small.json
6. https://www.heytings.org/data/arabic-small.json.txt
7. https://www.heytings.org/data/arabic-small.txt
8. https://www.heytings.org/data/arabic-small.txt.json

1 and 2, 3 and 4, 5 and 6, 7 and 8 are the same file, the only difference 
is the added extension.  1, 2, 3 and 4 on the one hand, and 5, 6, 7 and 8 
on the other hand, are almost the same file, the only difference is that 
in 1 and 2 and 5 and 6 the arabic text is enclosed into '{"ar":"<arabic 
text>"}'.

Now what you'll see is that 5 is slow, 6 is also slow (so it's not only 
js-mode which is doing something wrong), 7 is fast, and 8 is again slow 
(so js-mode is perhaps doing something wrong).  Also, the motion commands 
C-n and C-p do not work as expected in 5, 6 and 8.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-04 22:35                                                               ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-08-05  6:20                                                                 ` Eli Zaretskii
@ 2022-08-05 10:00                                                                 ` Gregory Heytings
  1 sibling, 0 replies; 685+ messages in thread
From: Gregory Heytings @ 2022-08-05 10:00 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: 56682, Eli Zaretskii, dgutov


>> If it's font-lock that forces syntax-ppss to examine the whole huge 
>> line, then what is your proposal for avoiding that which doesn't 
>> involve some more-or-less arbitrary restrictions on the part of the 
>> buffer that can be examined by syntax-ppss?
>
> The use of `syntax-wholeline-max` in 
> `font-lock-extend-region-wholelines` supposedly fixed this problem since 
> it changed `font-lock` so it doesn't ask `syntax-ppss` to compute the 
> whole line/buffer.
>

Actually, it didn't, it made things better in some cases, but (much) worse 
in other cases.  You may have seen the recipes I sent to Dmitry a few days 
ago:

emacs -Q
M-: (setq long-line-threshold nil syntax-wholeline-max most-positive-fixnum) RET
C-x C-f dictionary.json RET y ;; takes 160 seconds
C-e ;; takes 200 seconds

emacs -Q
M-: (setq long-line-threshold nil) RET
C-x C-f dictionary.json RET y ;; immediate
C-e ;; not finished after 1200 seconds (20 minutes), I killed Emacs

emacs -Q
C-x C-f dictionary.json RET y ;; immediate
C-e ;; immediate





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-05  8:21                                             ` Gregory Heytings
@ 2022-08-05 10:49                                               ` Eli Zaretskii
  0 siblings, 0 replies; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-05 10:49 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: gerd.moellmann, 56682, monnier, dgutov

> Date: Fri, 05 Aug 2022 08:21:30 +0000
> From: Gregory Heytings <gregory@heytings.org>
> cc: Eli Zaretskii <eliz@gnu.org>, gerd.moellmann@gmail.com, 
>     56682@debbugs.gnu.org, monnier@iro.umontreal.ca
> 
> > BTW, 'M-> M-<' triggers some puzzling long wait (~3 seconds) both on 
> > master and with my change, every time I issue this sequence of commands.
> >
> 
> This is caused by show-paren-mode.

Interesting.  I guess the problematic part is the code in
show-paren-mode which searches for the matching parenthesis, not the
part that puts the overlay on the buffer?  IOW, does making
blink-matching-paren-distance smaller shortens the delay?





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-05  9:03                                                                   ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2022-08-05 10:57                                                                     ` Eli Zaretskii
  2022-08-05 12:06                                                                       ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  0 siblings, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-05 10:57 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: 56682, gregory, dgutov

> From: Stefan Monnier <monnier@iro.umontreal.ca>
> Cc: gregory@heytings.org,  dgutov@yandex.ru,  56682@debbugs.gnu.org
> Date: Fri, 05 Aug 2022 05:03:25 -0400
> 
> >> The use of `syntax-wholeline-max` in
> >> `font-lock-extend-region-wholelines` supposedly fixed this problem since
> >> it changed `font-lock` so it doesn't ask `syntax-ppss` to compute the
> >> whole line/buffer.
> >
> > It did?
> > And if it did, how is that better or different from a locked
> > narrowing?
> 
> In terms of end-user behavior, it's very similar: it can break the
> `font-lock-keywords` part of font-lock but it still lets `syntax-ppss`
> look at the whole buffer and will thus still provide correct recognition
> of strings and comments, except when the major mode relies on
> `syntax-propertize-function` since that one also obeys
> `syntax-wholeline-max` and can thus misbehave in a similar way to the
> narrowing.
> 
> The more important difference is that it can be
> tweaked/changed/broken/improved by any ELisp package without
> necessitating a recompilation of Emacs's C code, or ugly workarounds to
> escape the narrowing, like postponing the actual font-lock to a timer or
> some such.

AFAIK, the problem is not entirely solved by syntax-wholeline-max.  If
and when it is solved, we could revisit this issue.  However, since
syntactic fontifications are invoked by a major-mode's font-lock
setup, there's still a problem of how to prevent the rest of font-lock
from causing significant slowdown.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-05  7:43                                               ` Eli Zaretskii
@ 2022-08-05 11:34                                                 ` Dmitry Gutov
  2022-08-05 11:48                                                   ` Eli Zaretskii
  0 siblings, 1 reply; 685+ messages in thread
From: Dmitry Gutov @ 2022-08-05 11:34 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, gregory, monnier

On 05.08.2022 10:43, Eli Zaretskii wrote:
>> Date: Fri, 5 Aug 2022 05:03:39 +0300
>> Cc: 56682@debbugs.gnu.org, Eli Zaretskii <eliz@gnu.org>,
>>   monnier@iro.umontreal.ca
>> From: Dmitry Gutov <dgutov@yandex.ru>
>>
>> That was about a 1 GB buffer, right?
>>
>> Let's take care of buffers with more reasonable sizes first, and then we
>> can consider extremes.
> 
> We want to solve all of them.

I didn't say we don't. But different issues call for different solutions.

>> A separate threshold for syntax-ppss to avoid parsing the whole
>> buffer might fit the bill.
> 
> Don't we already have such a threshold?

Not exactly: the buffer is still fully parsed by parse-partial-sexp 
(once). AFAICT, the variable makes the application of 
syntax-propertize-rules more lax, but at least it keeps counting the 
simple parens/quotes from the beginning of the buffer. That's why the 
fontification remained correct in both examples that I posted.

The time it takes to (parse-partial-sexp 1 (point-max)) accounts for the 
whole fontification delay at the end of dictionary.json.

Now, if nobody manages to speed up parse-partial-sexp itself further, we 
can add an additional tweak/size threshold, after which syntax-ppss 
won't parse the whole buffer anymore. But if we do that in Lisp, we can 
later improve that bit of logic so that the result is not entirely 
arbitrary, like it is now on master with dictionary.json.

> But again, if you are just saying that the current balance between
> response time and font-lock correctness is sub-optimal, and should be
> made better by changing the values of the thresholds, that's a
> different discussion.  For that discussion, we'd need a representative
> enough sample of real-life files with long lines and in as many major
> modes as possible, to make our balance really close to optimal.  I,
> for one, will welcome more examples of such files, especially if they
> use major modes we didn't consider until now.

We really have different problems and thus need different solutions for 
them. Not just one blunt instrument.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-05  9:37                                                                     ` Gregory Heytings
@ 2022-08-05 11:40                                                                       ` Eli Zaretskii
  2022-08-05 11:50                                                                         ` Gregory Heytings
  0 siblings, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-05 11:40 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: gerd.moellmann, 56682, monnier, dgutov

> Date: Fri, 05 Aug 2022 09:37:35 +0000
> From: Gregory Heytings <gregory@heytings.org>
> cc: gerd.moellmann@gmail.com, 56682@debbugs.gnu.org, monnier@iro.umontreal.ca, 
>     dgutov@yandex.ru
> 
> > It doesn't surprise me.  If you disable font-lock and show-paren-mode, 
> > does it become significantly faster?  And how does disabling font-lock 
> > that measure vs disabling auto-composition-mode with that file?
> 
> Disabling show-paren-mode and font-lock has no effect, no.  What is 
> surprising is that the speed seems to depend both on the mode and on the 
> presence of bidirectionality (so it seems that after all bidi is involved 
> in one way or another).

That the presence of R2L characters makes this slower shouldn't
surprise.  The bidi iteration through buffer text _can_ be non-linear,
but it's only _actually_ non-linear when R2L characters are present.
So the complications with handle_stop_backwards and
compute_stop_backwards actually happen only when there are R2L
characters in the buffer; otherwise the iterator behaves exactly like
the unidirectional display in Emacs 23 and before did: it examines
characters one by one it strict increasing order of buffer positions,
and skips or shortcuts some processing that is only needed for truly
bidirectional text.

IOW, the display engine is specially optimized for the very frequent
case of buffers that don't include R2L characters, and is expected to
be slower otherwise.

If font-lock doesn't produce any tangible difference, it probably
means that the amount of stop-positions added due to faces is
negligible when compared to the stop-positions due to character
composition.  Which I guess is also reasonable with a script like
Arabic.

> 1. https://www.heytings.org/data/arabic-large.json
> 2. https://www.heytings.org/data/arabic-large.json.txt
> 3. https://www.heytings.org/data/arabic-large.txt
> 4. https://www.heytings.org/data/arabic-large.txt.json
> 5. https://www.heytings.org/data/arabic-small.json
> 6. https://www.heytings.org/data/arabic-small.json.txt
> 7. https://www.heytings.org/data/arabic-small.txt
> 8. https://www.heytings.org/data/arabic-small.txt.json
> 
> 1 and 2, 3 and 4, 5 and 6, 7 and 8 are the same file, the only difference 
> is the added extension.  1, 2, 3 and 4 on the one hand, and 5, 6, 7 and 8 
> on the other hand, are almost the same file, the only difference is that 
> in 1 and 2 and 5 and 6 the arabic text is enclosed into '{"ar":"<arabic 
> text>"}'.
> 
> Now what you'll see is that 5 is slow, 6 is also slow (so it's not only 
> js-mode which is doing something wrong), 7 is fast, and 8 is again slow 
> (so js-mode is perhaps doing something wrong).  Also, the motion commands 
> C-n and C-p do not work as expected in 5, 6 and 8.

Thanks, I will use these.

There's (at least) one more aspect of this, as long as Text mode is
being used: Text mode doesn't force bidi-paragraph-direction to be
left-to-right, whereas all descendants of prog-mode, including
js-mode, do.  Leaving bidi-paragraph-direction at nil means Emacs
needs to determine the base paragraph direction each time it's about
to redisplay a window, and that might be expensive, especially in a
large buffer without any paragraph breaks (by default, an empty line),
because that is determined by the first strong directional character
of the paragraph.  So for a more fair comparison with Text mode, you
should set bidi-paragraph-direction to the value left-to-right in
text-mode buffers.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-05 11:34                                                 ` Dmitry Gutov
@ 2022-08-05 11:48                                                   ` Eli Zaretskii
  2022-08-05 12:08                                                     ` Dmitry Gutov
  0 siblings, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-05 11:48 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: 56682, gregory, monnier

> Date: Fri, 5 Aug 2022 14:34:12 +0300
> Cc: gregory@heytings.org, 56682@debbugs.gnu.org, monnier@iro.umontreal.ca
> From: Dmitry Gutov <dgutov@yandex.ru>
> 
> We really have different problems and thus need different solutions for 
> them. Not just one blunt instrument.

The current opinion of both the head maintainers and of Gregory is
that these are all parts of the same problem, and a single class of
solutions can solve most of them.  The problem being that many
portions of Emacs code involved in navigation and redisplay don't
expect lines to be too long, and therefore employ algorithms that
don't scale well with line length.  Preventing such code from going
far back to the beginning of the previous line, and then coming back
through all that text, is therefore an idea that should appear very
reasonable.  It also works surprisingly well in practice, at least
according to what we know at this point.

I get it that you disagree, but I haven't seen any real data behind
your dissenting opinions, and thus I don't yet see any reason to
reconsider changing the direction of development in this regard.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-05 11:40                                                                       ` Eli Zaretskii
@ 2022-08-05 11:50                                                                         ` Gregory Heytings
  2022-08-05 13:43                                                                           ` Eli Zaretskii
                                                                                             ` (2 more replies)
  0 siblings, 3 replies; 685+ messages in thread
From: Gregory Heytings @ 2022-08-05 11:50 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: gerd.moellmann, 56682, monnier, dgutov


>
> There's (at least) one more aspect of this, as long as Text mode is 
> being used: Text mode doesn't force bidi-paragraph-direction to be 
> left-to-right, whereas all descendants of prog-mode, including js-mode, 
> do.  Leaving bidi-paragraph-direction at nil means Emacs needs to 
> determine the base paragraph direction each time it's about to redisplay 
> a window, and that might be expensive, especially in a large buffer 
> without any paragraph breaks (by default, an empty line), because that 
> is determined by the first strong directional character of the 
> paragraph.  So for a more fair comparison with Text mode, you should set 
> bidi-paragraph-direction to the value left-to-right in text-mode 
> buffers.
>

Indeed, that seems to be the culprit here, I didn't know that text-mode 
was an exception here.  If I set bidi-paragraph-direction to 
'left-to-right after visiting the arabic-small.txt file, Emacs (mis) 
behaves like it does for the other Arabic files: it becomes slow, and C-n 
C-p do not work correctly anymore.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-05 10:57                                                                     ` Eli Zaretskii
@ 2022-08-05 12:06                                                                       ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-08-05 12:16                                                                         ` Gregory Heytings
  2022-08-05 13:05                                                                         ` Eli Zaretskii
  0 siblings, 2 replies; 685+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2022-08-05 12:06 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, gregory, dgutov

> AFAIK, the problem is not entirely solved by syntax-wholeline-max.

No, indeed.

> If and when it is solved, we could revisit this issue.

The locked narrowing currently in effect makes it impossible to
investigate this problem or improve the behavior :-(


        Stefan






^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-05 11:48                                                   ` Eli Zaretskii
@ 2022-08-05 12:08                                                     ` Dmitry Gutov
  2022-08-05 12:20                                                       ` Gregory Heytings
  2022-08-05 14:16                                                       ` bug#56682: Fix the long lines font locking related slowdowns Eli Zaretskii
  0 siblings, 2 replies; 685+ messages in thread
From: Dmitry Gutov @ 2022-08-05 12:08 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, gregory, monnier

On 05.08.2022 14:48, Eli Zaretskii wrote:
>> Date: Fri, 5 Aug 2022 14:34:12 +0300
>> Cc: gregory@heytings.org, 56682@debbugs.gnu.org, monnier@iro.umontreal.ca
>> From: Dmitry Gutov <dgutov@yandex.ru>
>>
>> We really have different problems and thus need different solutions for
>> them. Not just one blunt instrument.
> 
> The current opinion of both the head maintainers and of Gregory is
> that these are all parts of the same problem, and a single class of
> solutions can solve most of them.

This kind of approach fails to optimize for the behavior in medium-sized 
files, like the downloadify.js I showed previously.

Simply customizing long-line-threshold to a much higher value will bring 
back redisplay stutters on C-n/C-p/etc, which *were* a real problem that 
some of Gregory's changes solved.

> The problem being that many
> portions of Emacs code involved in navigation and redisplay don't
> expect lines to be too long, and therefore employ algorithms that
> don't scale well with line length.

As I demonstrated, font-lock itself doesn't have that issue.

Furthermore, the performance problem with syntax-ppss which we are 
talking about now doesn't have anything to do long lines.

Go ahead and pretty-print dictionary.json (you can use 'M-x 
json-pretty-print', write the buffer to a new file, then re-visit it). 
There won't be any long lines in the resulting file, but 'M->' will 
still make you wait a few seconds the first time.

> Preventing such code from going
> far back to the beginning of the previous line, and then coming back
> through all that text, is therefore an idea that should appear very
> reasonable.  It also works surprisingly well in practice, at least
> according to what we know at this point.
> 
> I get it that you disagree, but I haven't seen any real data behind
> your dissenting opinions, and thus I don't yet see any reason to
> reconsider changing the direction of development in this regard.

I don't understand why you dismiss the more subtle approach which still 
seems to reach the stated goals.

Gregory's changes, along with my suggested tweak, indeed bring work 
"surprisingly well" already. All without breaking font-lock in the 
common case.

Like, we're going from a 255 (?) second delay to 2 second delay already 
without breaking fontification. And yet you're eager to go from 2 
seconds down to ~0 and sacrifice highlighting correctness?





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-05 12:06                                                                       ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2022-08-05 12:16                                                                         ` Gregory Heytings
  2022-08-05 12:21                                                                           ` Dmitry Gutov
  2022-08-05 13:05                                                                         ` Eli Zaretskii
  1 sibling, 1 reply; 685+ messages in thread
From: Gregory Heytings @ 2022-08-05 12:16 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: 56682, Eli Zaretskii, dgutov


>> If and when it is solved, we could revisit this issue.
>
> The locked narrowing currently in effect makes it impossible to 
> investigate this problem or improve the behavior :-(
>

How so?  It is fully backward compatible, just (setq long-line-threshold 
nil).  If what you want is only to remove the locked narrowing, comment 
out the relevant line in xdisp.c.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-05  8:23                                               ` Gregory Heytings
@ 2022-08-05 12:19                                                 ` Dmitry Gutov
  2022-08-05 14:18                                                   ` Eli Zaretskii
  0 siblings, 1 reply; 685+ messages in thread
From: Dmitry Gutov @ 2022-08-05 12:19 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, Eli Zaretskii, monnier

On 05.08.2022 11:23, Gregory Heytings wrote:
> No, because the point of considering extreme cases is that they reveal 
> on your computer what happens on other people's less powerful computers 
> with much smaller files.

The problem with considering extreme cases, however, is that one can 
also provide an even more extreme case no matter how we optimize our 
implementations, which, with the chosen approach, will force us to 
cripple or drop most features outright.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-05 12:08                                                     ` Dmitry Gutov
@ 2022-08-05 12:20                                                       ` Gregory Heytings
  2022-08-05 12:50                                                         ` Dmitry Gutov
  2022-08-05 14:16                                                       ` bug#56682: Fix the long lines font locking related slowdowns Eli Zaretskii
  1 sibling, 1 reply; 685+ messages in thread
From: Gregory Heytings @ 2022-08-05 12:20 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: 56682, Eli Zaretskii, monnier


>
> Like, we're going from a 255 (?) second delay to 2 second delay already 
> without breaking fontification. And yet you're eager to go from 2 
> seconds down to ~0 and sacrifice highlighting correctness?
>

Yes.  Because as I told you your 2 seconds are 4 for me and 8 for Eli and 
20 for someone else.  And that's in a relatively small file.

Note that if it were 2/4/8/20 seconds once, and then no further slowdowns 
while editing the file, that would perhaps be okay.  But that's not the 
case, you will regularly see a similar 2/4/8/20 seconds delay.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-05 12:16                                                                         ` Gregory Heytings
@ 2022-08-05 12:21                                                                           ` Dmitry Gutov
  2022-08-05 12:42                                                                             ` Gregory Heytings
  0 siblings, 1 reply; 685+ messages in thread
From: Dmitry Gutov @ 2022-08-05 12:21 UTC (permalink / raw)
  To: Gregory Heytings, Stefan Monnier; +Cc: 56682, Eli Zaretskii

On 05.08.2022 15:16, Gregory Heytings wrote:
> 
>>> If and when it is solved, we could revisit this issue.
>>
>> The locked narrowing currently in effect makes it impossible to 
>> investigate this problem or improve the behavior :-(
>>
> 
> How so?  It is fully backward compatible, just (setq long-line-threshold 
> nil).  If what you want is only to remove the locked narrowing, comment 
> out the relevant line in xdisp.c.

That brings back the performance problems in redisplay, which have a 
more pronounced effect, overshadowing both issues and potential 
improvements in font-lock.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-04  1:41                                                     ` Gregory Heytings
@ 2022-08-05 12:28                                                       ` Dmitry Gutov
  0 siblings, 0 replies; 685+ messages in thread
From: Dmitry Gutov @ 2022-08-05 12:28 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, Eli Zaretskii, monnier

On 04.08.2022 04:41, Gregory Heytings wrote:
> 
>>
>> We cannot perform every basic operation in fixed time for any 
>> arbitrarily sized file. There are limits of what we can possibly do.
>>
> 
> Apparently the limits are lower than what you think.  Provided that we 
> accept some compromises, such as mis-fontification, which is also what 
> syntax-wholeline-max does, and against which you didn't protest.

syntax-wholelines-max indeed can potentially cause problems too, but in 
a much narrow range of situations (and only with major modes which have 
non-trivial syntax-propertize-function).

In any case, I would be happy to investigate further improvements in 
Lisp which would be implemented in the same area of code that 
syntax-wholelines-max lives in.

>> I'd really like it if we could scope this discussion to solving that 
>> particular problem. Not the speed of operations in large files in 
>> general.
>>
> 
> I don't understand what you mean.  Which "particular problem"?  The 
> point of this discussion is of course the speed of operations in large 
> files in general.

The particular problem is long lines. It not the same as "large files in 
general".

> If you take that out of the picture, everything is of 
> course possible. I'm not even sure what remains in fact, Emacs is an 
> editor, not a displayer.

The well-known problem we have had for a while is that Emacs screeches 
to a halt even on medium-sized buffers as soon as it encounters a long line.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-05 12:21                                                                           ` Dmitry Gutov
@ 2022-08-05 12:42                                                                             ` Gregory Heytings
  0 siblings, 0 replies; 685+ messages in thread
From: Gregory Heytings @ 2022-08-05 12:42 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: 56682, Eli Zaretskii, Stefan Monnier

[-- Attachment #1: Type: text/plain, Size: 552 bytes --]


>>> The locked narrowing currently in effect makes it impossible to 
>>> investigate this problem or improve the behavior :-(
>> 
>> How so?  It is fully backward compatible, just (setq 
>> long-line-threshold nil).  If what you want is only to remove the 
>> locked narrowing, comment out the relevant line in xdisp.c.
>
> That brings back the performance problems in redisplay, which have a 
> more pronounced effect, overshadowing both issues and potential 
> improvements in font-lock.
>

The first option does, the second does not.

^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-05 12:20                                                       ` Gregory Heytings
@ 2022-08-05 12:50                                                         ` Dmitry Gutov
  2022-08-05 13:00                                                           ` Gregory Heytings
  2022-08-05 13:17                                                           ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  0 siblings, 2 replies; 685+ messages in thread
From: Dmitry Gutov @ 2022-08-05 12:50 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, Eli Zaretskii, monnier

On 05.08.2022 15:20, Gregory Heytings wrote:
> 
>>
>> Like, we're going from a 255 (?) second delay to 2 second delay 
>> already without breaking fontification. And yet you're eager to go 
>> from 2 seconds down to ~0 and sacrifice highlighting correctness?
>>
> 
> Yes.  Because as I told you your 2 seconds are 4 for me and 8 for Eli 
> and 20 for someone else.  And that's in a relatively small file.

Is it a "relatively small file" if we've effectively been unable to edit 
such files for all of 40 years of Emacs's existence?

> Note that if it were 2/4/8/20 seconds once, and then no further 
> slowdowns while editing the file, that would perhaps be okay.  But 
> that's not the case, you will regularly see a similar 2/4/8/20 seconds 
> delay.

Do our users regularly edit 30MB files? And do a lot of changes in them? 
In different areas?

Note that, again, to see the same delay you would have to edit that file 
near the beginning, and then visit its end again.

If I did that, though, I'm not sure whether I would be more 
inconvenienced by performance, or by broken syntax highlighting and sexp 
navigation. font-lock is not just eye candy: it also assists you when 
editing code.

For instance, if I were to edit dictionary.json, I might have needed to 
look for a certain key and change it somewhere. But if the said key is 
highlighted as a part of a string value in some places, and only as a 
key in some others, that can look and feel very puzzling, and slow down 
my work just the same.

Similarly, if I'm editing a large JSON file, I might want to write a 
small Lisp program which searches for a word, checks that it's inside a 
string (or, conversely, outside and thus looks like a key), makes all 
the necessary changes in an automated fashion, and saves the buffer. A 
broken syntax-ppss wouldn't let me do that.

Finally, yes, for some buffer size the initial wait is going to be too 
much. But that can have a separate solution with a separate threshold.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-01 11:58                               ` Eli Zaretskii
  2022-08-02  8:10                                 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2022-08-05 12:59                                 ` Dmitry Gutov
  2022-08-05 14:20                                   ` Eli Zaretskii
  1 sibling, 1 reply; 685+ messages in thread
From: Dmitry Gutov @ 2022-08-05 12:59 UTC (permalink / raw)
  To: Eli Zaretskii, Stefan Monnier; +Cc: 56682, gregory

On 01.08.2022 14:58, Eli Zaretskii wrote:

> As I wrote elsewhere, I'm okay with extending 'widen' so that it could
> "unlock" the locked narrowing, which could then be used in major modes
> that convince us their performance is adequate (or clearly announce in
> their docs that they don't care about files with long lines ;-).

And to address the idea of "unlocking" the narrowing: I think I have 
demonstrated that the remaining slowdown can be caused purely by the 
length of the buffer and how long 'parse-partial-sexp' takes to parse 
it. That part doesn't have much to do with individual modes.

And of course the more, let's say, *complex* modes like CC Mode will opt 
for unlocking narrowing right away because its font-lock logic has to 
jump around to previously-saved positions in its syntax cache, which 
will inevitably spam errors here and there when those positions are not 
accessible.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-05 12:50                                                         ` Dmitry Gutov
@ 2022-08-05 13:00                                                           ` Gregory Heytings
  2022-08-05 13:11                                                             ` Dmitry Gutov
  2022-08-05 13:17                                                           ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  1 sibling, 1 reply; 685+ messages in thread
From: Gregory Heytings @ 2022-08-05 13:00 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: 56682, Eli Zaretskii, monnier

[-- Attachment #1: Type: text/plain, Size: 770 bytes --]


>> Yes.  Because as I told you your 2 seconds are 4 for me and 8 for Eli 
>> and 20 for someone else.  And that's in a relatively small file.
>
> Is it a "relatively small file" if we've effectively been unable to edit 
> such files for all of 40 years of Emacs's existence?
>

There are many other editors out there, isn't it?

>> Note that if it were 2/4/8/20 seconds once, and then no further 
>> slowdowns while editing the file, that would perhaps be okay.  But 
>> that's not the case, you will regularly see a similar 2/4/8/20 seconds 
>> delay.
>
> Do our users regularly edit 30MB files? And do a lot of changes in them? 
> In different areas?
>

You seem to think they do not.  Then why is it a problem if such files are 
mis-fontified?

^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-05 12:06                                                                       ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-08-05 12:16                                                                         ` Gregory Heytings
@ 2022-08-05 13:05                                                                         ` Eli Zaretskii
  1 sibling, 0 replies; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-05 13:05 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: 56682, gregory, dgutov

> From: Stefan Monnier <monnier@iro.umontreal.ca>
> Cc: gregory@heytings.org,  dgutov@yandex.ru,  56682@debbugs.gnu.org
> Date: Fri, 05 Aug 2022 08:06:32 -0400
> 
> > If and when it is solved, we could revisit this issue.
> 
> The locked narrowing currently in effect makes it impossible to
> investigate this problem or improve the behavior :-(

??? Just set long-line-threshold to nil, and you can investigate all
you want.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-05 13:00                                                           ` Gregory Heytings
@ 2022-08-05 13:11                                                             ` Dmitry Gutov
  0 siblings, 0 replies; 685+ messages in thread
From: Dmitry Gutov @ 2022-08-05 13:11 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, Eli Zaretskii, monnier

On 05.08.2022 16:00, Gregory Heytings wrote:
>>> Note that if it were 2/4/8/20 seconds once, and then no further 
>>> slowdowns while editing the file, that would perhaps be okay.  But 
>>> that's not the case, you will regularly see a similar 2/4/8/20 
>>> seconds delay.
>>
>> Do our users regularly edit 30MB files? And do a lot of changes in 
>> them? In different areas?
>>
> 
> You seem to think they do not.  Then why is it a problem if such files 
> are mis-fontified?

 From experience, I might visit a medium-to-large sized file, and I 
might search for a particular identifier inside it. Much more rarely, I 
would apply some edit inside it, in one place, and then save the buffer.

On balance, there is more likely more reading than editing involved. 
That's why I think font-lock should be assigned more importance.

In all likelihood, the file I would visit would be even smaller than 
30MB, but big enough that the majority of your improvements will be 
noticeable and welcome there. Just not the part that breaks font-lock.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-05 12:50                                                         ` Dmitry Gutov
  2022-08-05 13:00                                                           ` Gregory Heytings
@ 2022-08-05 13:17                                                           ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-08-05 13:30                                                             ` Dmitry Gutov
  1 sibling, 1 reply; 685+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2022-08-05 13:17 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: 56682, Gregory Heytings, Eli Zaretskii

> Do our users regularly edit 30MB files?

Thanks to Gregory's changes, it may start becoming more common.

> And do a lot of changes in them?

In my experience, not very much, no.  Usually large files are
machine-generated and rarely edited by hand.  But there are still
relevant use-cases like opening a large JSON/XML/younameit file and
applying a search&replace or a keyboard macro to it.

I think my machines are slow enough (and my Emacs has enough extra
sluggishness thanks to the many assertion checking compiled into it)
that I'd be better served with an approach like that of so-long where
large files use a dumbed down major mode to avoid most source of extra
slow down like font-lock.

What I'm not sure of is how useful is a "font-lock with arbitrary
narrowing", where portions will be highlighted as strings rather than
code (and vice-versa).  I don't have enough experience with it yet to
be sure.  Taking a step back, I suspect that the only "real" solution is
something like `jit-lock-defer` coupled with a way to perform the
font-lock (and syntax-ppss/propertize) in the background.


        Stefan






^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-05 13:17                                                           ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2022-08-05 13:30                                                             ` Dmitry Gutov
  2022-08-05 13:41                                                               ` Gregory Heytings
  0 siblings, 1 reply; 685+ messages in thread
From: Dmitry Gutov @ 2022-08-05 13:30 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: 56682, Gregory Heytings, Eli Zaretskii

On 05.08.2022 16:17, Stefan Monnier wrote:
> What I'm not sure of is how useful is a "font-lock with arbitrary
> narrowing", where portions will be highlighted as strings rather than
> code (and vice-versa).  I don't have enough experience with it yet to
> be sure.  Taking a step back, I suspect that the only "real" solution is
> something like `jit-lock-defer` coupled with a way to perform the
> font-lock (and syntax-ppss/propertize) in the background.

IIRC I heard that "some other editors" take the approach of restricting 
syntax-highlighting to just the beginning of a large file.

10000 seems too low, but if the 2 seconds in the dictionary.json example 
feels too much to people (and the file is 18 MB), maybe restrict syntax 
highlighting to the first 1 MB of each file? At least until someone 
optimizes parse-partial-sexp to work much faster.

Or 10MB. Not too important as long as the value is separately customizable.

Anyway, I think I'd prefer no highlighting at the end of those large 
files, rather than arbitrarily incorrect one.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-05 13:30                                                             ` Dmitry Gutov
@ 2022-08-05 13:41                                                               ` Gregory Heytings
  2022-08-05 14:00                                                                 ` Dmitry Gutov
  0 siblings, 1 reply; 685+ messages in thread
From: Gregory Heytings @ 2022-08-05 13:41 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: 56682, Eli Zaretskii, Stefan Monnier


>> What I'm not sure of is how useful is a "font-lock with arbitrary 
>> narrowing", where portions will be highlighted as strings rather than 
>> code (and vice-versa).  I don't have enough experience with it yet to 
>> be sure.  Taking a step back, I suspect that the only "real" solution 
>> is something like `jit-lock-defer` coupled with a way to perform the 
>> font-lock (and syntax-ppss/propertize) in the background.
>
> IIRC I heard that "some other editors" take the approach of restricting 
> syntax-highlighting to just the beginning of a large file.
>

Other editors just give up syntax highlighting altogether even with the 18 
MB file (and you cannot edit really large files with them).

But if you're so annoyed by mis-fontification, why don't you just turn 
font-lock mode off?

Also, why did you not protest vehemently when Stefan added 
syntax-wholeline-max, which also causes occasional mis-fontification?





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-05 11:50                                                                         ` Gregory Heytings
@ 2022-08-05 13:43                                                                           ` Eli Zaretskii
  2022-08-06 13:28                                                                           ` Eli Zaretskii
  2022-08-06 14:05                                                                           ` Eli Zaretskii
  2 siblings, 0 replies; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-05 13:43 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: gerd.moellmann, 56682, monnier, dgutov

> Date: Fri, 05 Aug 2022 11:50:56 +0000
> From: Gregory Heytings <gregory@heytings.org>
> cc: gerd.moellmann@gmail.com, 56682@debbugs.gnu.org, monnier@iro.umontreal.ca, 
>     dgutov@yandex.ru
> 
> > There's (at least) one more aspect of this, as long as Text mode is 
> > being used: Text mode doesn't force bidi-paragraph-direction to be 
> > left-to-right, whereas all descendants of prog-mode, including js-mode, 
> > do.  Leaving bidi-paragraph-direction at nil means Emacs needs to 
> > determine the base paragraph direction each time it's about to redisplay 
> > a window, and that might be expensive, especially in a large buffer 
> > without any paragraph breaks (by default, an empty line), because that 
> > is determined by the first strong directional character of the 
> > paragraph.  So for a more fair comparison with Text mode, you should set 
> > bidi-paragraph-direction to the value left-to-right in text-mode 
> > buffers.
> 
> Indeed, that seems to be the culprit here, I didn't know that text-mode 
> was an exception here.

Actually, it's the other way around: prog-mode and its descendants are
the exception.  The default value of bidi-paragraph-direction is nil,
but in prog-mode's we _know_ that program source code is written
left-to-right, even if some of strings and comments could include R2L
text, so we force bidi-paragraph-direction in these modes.

> If I set bidi-paragraph-direction to 'left-to-right after visiting
> the arabic-small.txt file, Emacs (mis) behaves like it does for the
> other Arabic files: it becomes slow, and C-n C-p do not work
> correctly anymore.

OK, so there's one more subtle issue about bidi, and it definitely
affects some of these files: whether the file actually includes both
L2R and R2L characters.  If all of the characters are L2R or all of
them are R2L (the latter is the case with arabic-small.txt), and
bidi-paragraph-direction is either nil or left-to-right for L2R text
and right-to-left for R2L text, then from the display engine's POV the
text is not truly bidirectional, it actually has a single direction.
Text that has a single direction doesn't require (expensive)
reordering for display, and we have optimizations in place for such
situations, to make redisplay faster in those cases, because that is
the natural situation with human-readable text: text that is
predominantly R2L is relatively rarely mixed with L2R text and is
normally displayed in right-to-left paragraphs.

By adding the "ar" prefix to the files, you made what was a
unidirectional text be bidirectional.  The effect on display is
dramatic: the first Arabic letter will now be displayed _last_,
because the paragraph now has left-to-right direction (the first
strong character in it is 'a', a L2R character), and the entire Arabic
string that follows needs to be reversed on display.

Compare arabic-small.txt with arabic-small.json after setting
bidi-paragraph-direction to be right-to-left in the latter, and you
should see a similar performance in both.  (And watch what happens on
display when you change the value of bidi-paragraph-direction in
arabic-small.json.)





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-05 13:41                                                               ` Gregory Heytings
@ 2022-08-05 14:00                                                                 ` Dmitry Gutov
  2022-08-05 14:09                                                                   ` Gregory Heytings
  0 siblings, 1 reply; 685+ messages in thread
From: Dmitry Gutov @ 2022-08-05 14:00 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, Eli Zaretskii, Stefan Monnier

On 05.08.2022 16:41, Gregory Heytings wrote:
> 
>>> What I'm not sure of is how useful is a "font-lock with arbitrary 
>>> narrowing", where portions will be highlighted as strings rather than 
>>> code (and vice-versa).  I don't have enough experience with it yet to 
>>> be sure.  Taking a step back, I suspect that the only "real" solution 
>>> is something like `jit-lock-defer` coupled with a way to perform the 
>>> font-lock (and syntax-ppss/propertize) in the background.
>>
>> IIRC I heard that "some other editors" take the approach of 
>> restricting syntax-highlighting to just the beginning of a large file.
>>
> 
> Other editors just give up syntax highlighting altogether even with the 
> 18 MB file (and you cannot edit really large files with them).

In my testing, with my patch, the 18 MB file works reasonably well and 
has good syntax highlighting.

> But if you're so annoyed by mis-fontification, why don't you just turn 
> font-lock mode off?

"If you're annoyed by Emacs's performance with large files, why don't 
you just never open them?"

I like font-lock and the visual cues that come with it. Only 
font-locking the first 1 MB of a large file seems like a good 
compromise: show correct highlighting where we can with reasonable 
performance, and omit it in the rest of the file.

> Also, why did you not protest vehemently when Stefan added 
> syntax-wholeline-max, which also causes occasional mis-fontification?

I have replied to this exact question in an earlier email. We can 
continue this line of inquiry in that subthread.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-05 14:00                                                                 ` Dmitry Gutov
@ 2022-08-05 14:09                                                                   ` Gregory Heytings
  2022-08-05 22:38                                                                     ` Dmitry Gutov
  0 siblings, 1 reply; 685+ messages in thread
From: Gregory Heytings @ 2022-08-05 14:09 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: 56682, Eli Zaretskii, Stefan Monnier


>> But if you're so annoyed by mis-fontification, why don't you just turn 
>> font-lock mode off?
>
> "If you're annoyed by Emacs's performance with large files, why don't 
> you just never open them?"
>

That's just wrong: in one case we're talking about your personal 
feelings/preferences, in the other one about Emacs' capabilities for all 
its users.

>
> I like font-lock and the visual cues that come with it. Only 
> font-locking the first 1 MB of a large file seems like a good 
> compromise: show correct highlighting where we can with reasonable 
> performance, and omit it in the rest of the file.
>

So what you prefer IIUC would be to call fontification-functions with a 
locked narrowing to 1 MB if point is before that threshold, and to not 
call fontification-functions at all after that threshold?  That might be 
another doable approach.

>> Also, why did you not protest vehemently when Stefan added 
>> syntax-wholeline-max, which also causes occasional mis-fontification?
>
> I have replied to this exact question in an earlier email. We can 
> continue this line of inquiry in that subthread.
>

Sorry, I missed that part of your earlier post:

>
> syntax-wholelines-max indeed can potentially cause problems too, but in 
> a much narrow range of situations (and only with major modes which have 
> non-trivial syntax-propertize-function).
>

You forget to metion that syntax-wholelines-max can in fact make things 
much worse, see the recipes I sent you a few days ago.  So it doesn't seem 
like it's the right approach.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-05 12:08                                                     ` Dmitry Gutov
  2022-08-05 12:20                                                       ` Gregory Heytings
@ 2022-08-05 14:16                                                       ` Eli Zaretskii
  1 sibling, 0 replies; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-05 14:16 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: 56682, gregory, monnier

> Date: Fri, 5 Aug 2022 15:08:22 +0300
> Cc: gregory@heytings.org, 56682@debbugs.gnu.org, monnier@iro.umontreal.ca
> From: Dmitry Gutov <dgutov@yandex.ru>
> 
> > The current opinion of both the head maintainers and of Gregory is
> > that these are all parts of the same problem, and a single class of
> > solutions can solve most of them.
> 
> This kind of approach fails to optimize for the behavior in medium-sized 
> files, like the downloadify.js I showed previously.
> 
> Simply customizing long-line-threshold to a much higher value will bring 
> back redisplay stutters on C-n/C-p/etc, which *were* a real problem that 
> some of Gregory's changes solved.

You want a separate threshold for calling font-lock from redisplay?
We could discuss that.

> > The problem being that many
> > portions of Emacs code involved in navigation and redisplay don't
> > expect lines to be too long, and therefore employ algorithms that
> > don't scale well with line length.
> 
> As I demonstrated, font-lock itself doesn't have that issue.

What do you mean by "font-lock itself"?

> Furthermore, the performance problem with syntax-ppss which we are 
> talking about now doesn't have anything to do long lines.

The facts are that it has problems in large files, but it also has
problems in not-so-large files with long lines, due to whole-line
approach.

> Go ahead and pretty-print dictionary.json (you can use 'M-x 
> json-pretty-print', write the buffer to a new file, then re-visit it). 
> There won't be any long lines in the resulting file, but 'M->' will 
> still make you wait a few seconds the first time.

No one said that the changes being discussed solve all the problems in
Emacs.

> > I get it that you disagree, but I haven't seen any real data behind
> > your dissenting opinions, and thus I don't yet see any reason to
> > reconsider changing the direction of development in this regard.
> 
> I don't understand why you dismiss the more subtle approach which still 
> seems to reach the stated goals.
> 
> Gregory's changes, along with my suggested tweak, indeed bring work 
> "surprisingly well" already. All without breaking font-lock in the 
> common case.

I don't think I understand what "tweak" you are suggesting.  can you
show a patch relative to the current master?

> Like, we're going from a 255 (?) second delay to 2 second delay already 
> without breaking fontification. And yet you're eager to go from 2 
> seconds down to ~0 and sacrifice highlighting correctness?

Yes, because 2 sec (in an optimized build) is a very long time.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-05 12:19                                                 ` Dmitry Gutov
@ 2022-08-05 14:18                                                   ` Eli Zaretskii
  0 siblings, 0 replies; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-05 14:18 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: 56682, gregory, monnier

> Date: Fri, 5 Aug 2022 15:19:45 +0300
> Cc: 56682@debbugs.gnu.org, Eli Zaretskii <eliz@gnu.org>,
>  monnier@iro.umontreal.ca
> From: Dmitry Gutov <dgutov@yandex.ru>
> 
> On 05.08.2022 11:23, Gregory Heytings wrote:
> > No, because the point of considering extreme cases is that they reveal 
> > on your computer what happens on other people's less powerful computers 
> > with much smaller files.
> 
> The problem with considering extreme cases, however, is that one can 
> also provide an even more extreme case no matter how we optimize our 
> implementations, which, with the chosen approach, will force us to 
> cripple or drop most features outright.

The chosen approach does the same in a 10KB file and in 100GB file, so
I don't understand what you have in mind here.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-05 12:59                                 ` Dmitry Gutov
@ 2022-08-05 14:20                                   ` Eli Zaretskii
  2022-08-05 14:41                                     ` Dmitry Gutov
  0 siblings, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-05 14:20 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: 56682, gregory, monnier

> Date: Fri, 5 Aug 2022 15:59:57 +0300
> Cc: 56682@debbugs.gnu.org, gregory@heytings.org
> From: Dmitry Gutov <dgutov@yandex.ru>
> 
> On 01.08.2022 14:58, Eli Zaretskii wrote:
> 
> > As I wrote elsewhere, I'm okay with extending 'widen' so that it could
> > "unlock" the locked narrowing, which could then be used in major modes
> > that convince us their performance is adequate (or clearly announce in
> > their docs that they don't care about files with long lines ;-).
> 
> And to address the idea of "unlocking" the narrowing: I think I have 
> demonstrated that the remaining slowdown can be caused purely by the 
> length of the buffer and how long 'parse-partial-sexp' takes to parse 
> it.

No, you haven't demonstrated that.

> And of course the more, let's say, *complex* modes like CC Mode will opt 
> for unlocking narrowing right away because its font-lock logic has to 
> jump around to previously-saved positions in its syntax cache, which 
> will inevitably spam errors here and there when those positions are not 
> accessible.

CC Mode is extremely unlikely to happen in files with such long lines,
so what it does is largely irrelevant to this discussion.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-05 14:20                                   ` Eli Zaretskii
@ 2022-08-05 14:41                                     ` Dmitry Gutov
  2022-08-05 15:33                                       ` Eli Zaretskii
  0 siblings, 1 reply; 685+ messages in thread
From: Dmitry Gutov @ 2022-08-05 14:41 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, gregory, monnier

On 05.08.2022 17:20, Eli Zaretskii wrote:
>> Date: Fri, 5 Aug 2022 15:59:57 +0300
>> Cc: 56682@debbugs.gnu.org, gregory@heytings.org
>> From: Dmitry Gutov <dgutov@yandex.ru>
>>
>> On 01.08.2022 14:58, Eli Zaretskii wrote:
>>
>>> As I wrote elsewhere, I'm okay with extending 'widen' so that it could
>>> "unlock" the locked narrowing, which could then be used in major modes
>>> that convince us their performance is adequate (or clearly announce in
>>> their docs that they don't care about files with long lines ;-).
>>
>> And to address the idea of "unlocking" the narrowing: I think I have
>> demonstrated that the remaining slowdown can be caused purely by the
>> length of the buffer and how long 'parse-partial-sexp' takes to parse
>> it.
> 
> No, you haven't demonstrated that.

Apply the patch for xdisp.c that I have sent previously (it will be at 
the end of this email too) and recompile Emacs.

Now try two different scenarios. 1,2a and 1,2b.

1. Visit dictionary.json. It will ask you whether to open such big file 
literally, but after you answer 'y', it will display the beginning of 
the file quickly.
2a) Evaluate (benchmark 1 '(save-excursion (parse-partial-sexp 1 
(point-max)))), note the reported delay.

Kill and re-visit the file.

1. (same as before)
2b) Press M->, note the delay you see.

The delays in scenarios 1,2a and 1,2b should be ~the same. They are so 
in my testing.

Or try this scenario: 1,2a,2b. Step 2b should work instantly here.

The patch:

diff --git a/src/xdisp.c b/src/xdisp.c
index 099efed2db..02d7f6c562 100644
--- a/src/xdisp.c
+++ b/src/xdisp.c
@@ -4391,19 +4391,19 @@ handle_fontified_prop (struct it *it)

        eassert (it->end_charpos == ZV);

-      if (current_buffer->long_line_optimizations_p)
-	{
-	  ptrdiff_t begv = it->narrowed_begv;
-	  ptrdiff_t zv = it->narrowed_zv;
-	  ptrdiff_t charpos = IT_CHARPOS (*it);
-	  if (charpos < begv || charpos > zv)
-	    {
-	      begv = get_narrowed_begv (it->w, charpos);
-	      zv = get_narrowed_zv (it->w, charpos);
-	    }
-	  narrow_to_region_internal (make_fixnum (begv), make_fixnum (zv), true);
-	  specbind (Qrestrictions_locked, Qt);
-	}
+      /* if (current_buffer->long_line_optimizations_p) */
+      /* 	{ */
+      /* 	  ptrdiff_t begv = it->narrowed_begv; */
+      /* 	  ptrdiff_t zv = it->narrowed_zv; */
+      /* 	  ptrdiff_t charpos = IT_CHARPOS (*it); */
+      /* 	  if (charpos < begv || charpos > zv) */
+      /* 	    { */
+      /* 	      begv = get_narrowed_begv (it->w, charpos); */
+      /* 	      zv = get_narrowed_zv (it->w, charpos); */
+      /* 	    } */
+      /* 	  narrow_to_region_internal (make_fixnum (begv), make_fixnum 
(zv), true); */
+      /* 	  specbind (Qrestrictions_locked, Qt); */
+      /* 	} */

        /* Don't allow Lisp that runs from 'fontification-functions'
  	 clear our face and image caches behind our back.  */





^ permalink raw reply related	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-05 14:41                                     ` Dmitry Gutov
@ 2022-08-05 15:33                                       ` Eli Zaretskii
  2022-08-05 17:32                                         ` Dmitry Gutov
  2022-08-05 18:02                                         ` Dmitry Gutov
  0 siblings, 2 replies; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-05 15:33 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: 56682, gregory, monnier

> Date: Fri, 5 Aug 2022 17:41:51 +0300
> Cc: monnier@iro.umontreal.ca, 56682@debbugs.gnu.org, gregory@heytings.org
> From: Dmitry Gutov <dgutov@yandex.ru>
> 
> >> And to address the idea of "unlocking" the narrowing: I think I have
> >> demonstrated that the remaining slowdown can be caused purely by the
> >> length of the buffer and how long 'parse-partial-sexp' takes to parse
> >> it.
> > 
> > No, you haven't demonstrated that.
> 
> Apply the patch for xdisp.c that I have sent previously (it will be at 
> the end of this email too) and recompile Emacs.
> 
> Now try two different scenarios. 1,2a and 1,2b.
> 
> 1. Visit dictionary.json. It will ask you whether to open such big file 
> literally, but after you answer 'y', it will display the beginning of 
> the file quickly.
> 2a) Evaluate (benchmark 1 '(save-excursion (parse-partial-sexp 1 
> (point-max)))), note the reported delay.
> 
> Kill and re-visit the file.
> 
> 1. (same as before)
> 2b) Press M->, note the delay you see.
> 
> The delays in scenarios 1,2a and 1,2b should be ~the same. They are so 
> in my testing.
> 
> Or try this scenario: 1,2a,2b. Step 2b should work instantly here.

How is (parse-partial-sexp 1 (point-max)) related to the issue at
hand?





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-05 15:33                                       ` Eli Zaretskii
@ 2022-08-05 17:32                                         ` Dmitry Gutov
  2022-08-05 18:09                                           ` Eli Zaretskii
  2022-08-05 18:02                                         ` Dmitry Gutov
  1 sibling, 1 reply; 685+ messages in thread
From: Dmitry Gutov @ 2022-08-05 17:32 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, gregory, monnier

On 05.08.2022 18:33, Eli Zaretskii wrote:
>> Date: Fri, 5 Aug 2022 17:41:51 +0300
>> Cc: monnier@iro.umontreal.ca, 56682@debbugs.gnu.org, gregory@heytings.org
>> From: Dmitry Gutov <dgutov@yandex.ru>
>>
I think I have
>>>> demonstrated that the remaining slowdown can be caused purely by the
>>>> length of the buffer and how long 'parse-partial-sexp' takes to parse
>>>> it.
>>>
>>> No, you haven't demonstrated that.
>>
>> Apply the patch for xdisp.c that I have sent previously (it will be at
>> the end of this email too) and recompile Emacs.
>>
>> Now try two different scenarios. 1,2a and 1,2b.
>>
>> 1. Visit dictionary.json. It will ask you whether to open such big file
>> literally, but after you answer 'y', it will display the beginning of
>> the file quickly.
>> 2a) Evaluate (benchmark 1 '(save-excursion (parse-partial-sexp 1
>> (point-max)))), note the reported delay.
>>
>> Kill and re-visit the file.
>>
>> 1. (same as before)
>> 2b) Press M->, note the delay you see.
>>
>> The delays in scenarios 1,2a and 1,2b should be ~the same. They are so
>> in my testing.
>>
>> Or try this scenario: 1,2a,2b. Step 2b should work instantly here.
> 
> How is (parse-partial-sexp 1 (point-max)) related to the issue at
> hand?

I said:

 >>>> I think I have
 >>>> demonstrated that the remaining slowdown can be caused purely by the
 >>>> length of the buffer and how long 'parse-partial-sexp' takes to parse
 >>>> it.

You said:

 >>> No, you haven't demonstrated that.

...and now you are asking why we are talking about parse-partial-sexp?





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-05 15:33                                       ` Eli Zaretskii
  2022-08-05 17:32                                         ` Dmitry Gutov
@ 2022-08-05 18:02                                         ` Dmitry Gutov
  2022-08-05 18:14                                           ` Eli Zaretskii
  1 sibling, 1 reply; 685+ messages in thread
From: Dmitry Gutov @ 2022-08-05 18:02 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, gregory, monnier

On 05.08.2022 18:33, Eli Zaretskii wrote:
>> Date: Fri, 5 Aug 2022 17:41:51 +0300
>> Cc:monnier@iro.umontreal.ca,56682@debbugs.gnu.org,gregory@heytings.org
>> From: Dmitry Gutov<dgutov@yandex.ru>
>>
>>>> And to address the idea of "unlocking" the narrowing: I think I have
>>>> demonstrated that the remaining slowdown can be caused purely by the
>>>> length of the buffer and how long 'parse-partial-sexp' takes to parse
>>>> it.
>>> No, you haven't demonstrated that.
>> Apply the patch for xdisp.c that I have sent previously (it will be at
>> the end of this email too) and recompile Emacs.
>>
>> Now try two different scenarios. 1,2a and 1,2b.
>>
>> 1. Visit dictionary.json. It will ask you whether to open such big file
>> literally, but after you answer 'y', it will display the beginning of
>> the file quickly.
>> 2a) Evaluate (benchmark 1 '(save-excursion (parse-partial-sexp 1
>> (point-max)))), note the reported delay.
>>
>> Kill and re-visit the file.
>>
>> 1. (same as before)
>> 2b) Press M->, note the delay you see.
>>
>> The delays in scenarios 1,2a and 1,2b should be ~the same. They are so
>> in my testing.
>>
>> Or try this scenario: 1,2a,2b. Step 2b should work instantly here.
> How is (parse-partial-sexp 1 (point-max)) related to the issue at
> hand?

Or perhaps I should answer this way:

We move to near EOB.
fontification-functions are called.

jit-lock
calls
(font-lock-fontify-region point-near-buffer-end (point-max))
which calls
font-lock-fontify-syntactically-region
which calls both
   (syntax-propertize (point-max))
   and
   (syntax-ppss point-near-buffer-end) -> and it calls parse-partial-sexp

syntax-propertize will also likely call syntax-ppss itself, probably 
through the major mode's syntax-propertize-function. But if 
syntax-propertize-function is nil, parse-partial-sexp gets called 
anyway, over the whole buffer, which makes it the main workload in 
fontifying near EOB.

Now, if syntax-propertize-function is non-nil, parse-partial-sexp will 
also call it, and it adds its overhead (sometimes a multiple of p-p-s), 
which also scales linearly with the length of the buffer.

So if one can demonstrate that (parse-partial-sexp (point-min) 
(point-max)) takes about the same time as it takes to fontify the last 
screen-ful of a buffer, then that says that everything else that 
jit-lock does to fontify, is negligible, time-wise.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-05 17:32                                         ` Dmitry Gutov
@ 2022-08-05 18:09                                           ` Eli Zaretskii
  0 siblings, 0 replies; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-05 18:09 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: 56682, gregory, monnier

> Date: Fri, 5 Aug 2022 20:32:32 +0300
> Cc: 56682@debbugs.gnu.org, gregory@heytings.org, monnier@iro.umontreal.ca
> From: Dmitry Gutov <dgutov@yandex.ru>
> 
> On 05.08.2022 18:33, Eli Zaretskii wrote:
> >> Date: Fri, 5 Aug 2022 17:41:51 +0300
> >> Cc: monnier@iro.umontreal.ca, 56682@debbugs.gnu.org, gregory@heytings.org
> >> From: Dmitry Gutov <dgutov@yandex.ru>
> >>
> I think I have
> >>>> demonstrated that the remaining slowdown can be caused purely by the
> >>>> length of the buffer and how long 'parse-partial-sexp' takes to parse
> >>>> it.
> >>>
> >>> No, you haven't demonstrated that.
> >>
> >> Apply the patch for xdisp.c that I have sent previously (it will be at
> >> the end of this email too) and recompile Emacs.
> >>
> >> Now try two different scenarios. 1,2a and 1,2b.
> >>
> >> 1. Visit dictionary.json. It will ask you whether to open such big file
> >> literally, but after you answer 'y', it will display the beginning of
> >> the file quickly.
> >> 2a) Evaluate (benchmark 1 '(save-excursion (parse-partial-sexp 1
> >> (point-max)))), note the reported delay.
> >>
> >> Kill and re-visit the file.
> >>
> >> 1. (same as before)
> >> 2b) Press M->, note the delay you see.
> >>
> >> The delays in scenarios 1,2a and 1,2b should be ~the same. They are so
> >> in my testing.
> >>
> >> Or try this scenario: 1,2a,2b. Step 2b should work instantly here.
> > 
> > How is (parse-partial-sexp 1 (point-max)) related to the issue at
> > hand?
> 
> I said:
> 
>  >>>> I think I have
>  >>>> demonstrated that the remaining slowdown can be caused purely by the
>  >>>> length of the buffer and how long 'parse-partial-sexp' takes to parse
>  >>>> it.
> 
> You said:
> 
>  >>> No, you haven't demonstrated that.
> 
> ...and now you are asking why we are talking about parse-partial-sexp?

Yes, because a user who visits a file doesn't invoke
parse-partial-sexp.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-05 18:02                                         ` Dmitry Gutov
@ 2022-08-05 18:14                                           ` Eli Zaretskii
  2022-08-05 19:01                                             ` Dmitry Gutov
  0 siblings, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-05 18:14 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: 56682, gregory, monnier

> Date: Fri, 5 Aug 2022 21:02:35 +0300
> Cc: 56682@debbugs.gnu.org, gregory@heytings.org, monnier@iro.umontreal.ca
> From: Dmitry Gutov <dgutov@yandex.ru>
> 
> > How is (parse-partial-sexp 1 (point-max)) related to the issue at
> > hand?
> 
> Or perhaps I should answer this way:
> 
> We move to near EOB.
> fontification-functions are called.
> 
> jit-lock
> calls
> (font-lock-fontify-region point-near-buffer-end (point-max))
> which calls
> font-lock-fontify-syntactically-region
> which calls both
>    (syntax-propertize (point-max))
>    and
>    (syntax-ppss point-near-buffer-end) -> and it calls parse-partial-sexp
> 
> syntax-propertize will also likely call syntax-ppss itself, probably 
> through the major mode's syntax-propertize-function. But if 
> syntax-propertize-function is nil, parse-partial-sexp gets called 
> anyway, over the whole buffer, which makes it the main workload in 
> fontifying near EOB.
> 
> Now, if syntax-propertize-function is non-nil, parse-partial-sexp will 
> also call it, and it adds its overhead (sometimes a multiple of p-p-s), 
> which also scales linearly with the length of the buffer.
> 
> So if one can demonstrate that (parse-partial-sexp (point-min) 
> (point-max)) takes about the same time as it takes to fontify the last 
> screen-ful of a buffer, then that says that everything else that 
> jit-lock does to fontify, is negligible, time-wise.

So you have demonstrated that, if visiting a file and moving inside it
calls parse-partial-sexp to scan the entire buffer, then this could be
some, perhaps a large, part of the slowdown.

First, we need to establish that indeed parse-partial-sexp is called
in that manner in the relevant major modes (not just one of them), or
by font-lock itself regardless of the mode.

Second, we need to establish that indeed this takes a large portion of
the time in the slow operations.  Not just one particular operation,
but most or all of them.

And after that, we may have some food for thought.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-05 18:14                                           ` Eli Zaretskii
@ 2022-08-05 19:01                                             ` Dmitry Gutov
  2022-08-05 19:14                                               ` Eli Zaretskii
  0 siblings, 1 reply; 685+ messages in thread
From: Dmitry Gutov @ 2022-08-05 19:01 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, gregory, monnier

On 05.08.2022 21:14, Eli Zaretskii wrote:
>> Date: Fri, 5 Aug 2022 21:02:35 +0300
>> Cc: 56682@debbugs.gnu.org, gregory@heytings.org, monnier@iro.umontreal.ca
>> From: Dmitry Gutov <dgutov@yandex.ru>
>>
>>> How is (parse-partial-sexp 1 (point-max)) related to the issue at
>>> hand?
>>
>> Or perhaps I should answer this way:
>>
>> We move to near EOB.
>> fontification-functions are called.
>>
>> jit-lock
>> calls
>> (font-lock-fontify-region point-near-buffer-end (point-max))
>> which calls
>> font-lock-fontify-syntactically-region
>> which calls both
>>     (syntax-propertize (point-max))
>>     and
>>     (syntax-ppss point-near-buffer-end) -> and it calls parse-partial-sexp
>>
>> syntax-propertize will also likely call syntax-ppss itself, probably
>> through the major mode's syntax-propertize-function. But if
>> syntax-propertize-function is nil, parse-partial-sexp gets called
>> anyway, over the whole buffer, which makes it the main workload in
>> fontifying near EOB.
>>
>> Now, if syntax-propertize-function is non-nil, parse-partial-sexp will
>> also call it, and it adds its overhead (sometimes a multiple of p-p-s),
>> which also scales linearly with the length of the buffer.
>>
>> So if one can demonstrate that (parse-partial-sexp (point-min)
>> (point-max)) takes about the same time as it takes to fontify the last
>> screen-ful of a buffer, then that says that everything else that
>> jit-lock does to fontify, is negligible, time-wise.
> 
> So you have demonstrated that, if visiting a file and moving inside it
> calls parse-partial-sexp to scan the entire buffer, then this could be
> some, perhaps a large, part of the slowdown.

Yes.

> First, we need to establish that indeed parse-partial-sexp is called
> in that manner in the relevant major modes (not just one of them), or
> by font-lock itself regardless of the mode.

It is called by font-lock itself, which ends up calling syntax-ppss, 
which does its job with parse-partial-sexp. I have outlined the chain of 
calls in the previous message, you can verify it by looking at the sources.

> Second, we need to establish that indeed this takes a large portion of
> the time in the slow operations.  Not just one particular operation,
> but most or all of them.

To establish that, I have described the experiment in the grandparent 
email (with scenarios 1,2a;1,2b;1,2a,2b), and performed it myself as well.

But I'm talking about the slowdown observed when doing 'M->'. Not about 
any operations one might try to perform. Having said that, after the 
initial 'M->' most of navigation operations look snappy to me. So that's 
the slowdown I decided to investigate.

> And after that, we may have some food for thought.

Here's some more:

All major modes we can currently use for JSON (the built-in js-mode and 
the two json-mode's in ELPA) inherit the value of 
syntax-propertize-function from js-mode. But there's no need for it: 
JSON doesn't have division, or regexps, or preprocessor directives, or 
embedded JSX structures.

Setting syntax-propertize-function to nil speeds up parse-partial-sexp 
significantly. Here's a patch you can try to evaluate the effect on 
dictionary.json of that change combined with the previous tweak I 
suggested. Now it takes about 5x faster to fontify the last screenful, 
on my machine. Meaning, 'M->' feels almost (but not quite) instant. And 
the fontification is still correct.

A "proper" change would involve creating a new major mode, probably, 
rather than regexp-matching against buffer-file-name. But I'm not sure 
what name to pick: 'json-mode' would step on the toes of two existing 
packages now. 'js-json-mode', maybe? Or we bring in json-mode from GNU 
ELPA (with a similar change).

Anyway, try this please:

diff --git a/lisp/progmodes/js.el b/lisp/progmodes/js.el
index eb2a1e4fcc..ae8e980125 100644
--- a/lisp/progmodes/js.el
+++ b/lisp/progmodes/js.el
@@ -3418,7 +3418,8 @@ js-mode
                (list js--font-lock-keywords nil nil nil nil
                      '(font-lock-syntactic-face-function
                        . js-font-lock-syntactic-face-function)))
-  (setq-local syntax-propertize-function #'js-syntax-propertize)
+  (unless (and buffer-file-name (string-match-p "\\.json\\'" 
buffer-file-name))
+    (setq-local syntax-propertize-function #'js-syntax-propertize))
    (add-hook 'syntax-propertize-extend-region-functions
              #'syntax-propertize-multiline 'append 'local)
    (add-hook 'syntax-propertize-extend-region-functions
diff --git a/src/xdisp.c b/src/xdisp.c
index 099efed2db..fcb2be8768 100644
--- a/src/xdisp.c
+++ b/src/xdisp.c
@@ -4391,20 +4391,6 @@ handle_fontified_prop (struct it *it)

        eassert (it->end_charpos == ZV);

-      if (current_buffer->long_line_optimizations_p)
-	{
-	  ptrdiff_t begv = it->narrowed_begv;
-	  ptrdiff_t zv = it->narrowed_zv;
-	  ptrdiff_t charpos = IT_CHARPOS (*it);
-	  if (charpos < begv || charpos > zv)
-	    {
-	      begv = get_narrowed_begv (it->w, charpos);
-	      zv = get_narrowed_zv (it->w, charpos);
-	    }
-	  narrow_to_region_internal (make_fixnum (begv), make_fixnum (zv), true);
-	  specbind (Qrestrictions_locked, Qt);
-	}
-
        /* Don't allow Lisp that runs from 'fontification-functions'
  	 clear our face and image caches behind our back.  */
        it->f->inhibit_clear_image_cache = true;





^ permalink raw reply related	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-05 19:01                                             ` Dmitry Gutov
@ 2022-08-05 19:14                                               ` Eli Zaretskii
  2022-08-05 20:23                                                 ` Dmitry Gutov
  0 siblings, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-05 19:14 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: 56682, gregory, monnier

> Date: Fri, 5 Aug 2022 22:01:24 +0300
> Cc: 56682@debbugs.gnu.org, gregory@heytings.org, monnier@iro.umontreal.ca
> From: Dmitry Gutov <dgutov@yandex.ru>
> 
> > First, we need to establish that indeed parse-partial-sexp is called
> > in that manner in the relevant major modes (not just one of them), or
> > by font-lock itself regardless of the mode.
> 
> It is called by font-lock itself, which ends up calling syntax-ppss, 
> which does its job with parse-partial-sexp.

In all modes, regardless of what the mode wants to highlight?

> > Second, we need to establish that indeed this takes a large portion of
> > the time in the slow operations.  Not just one particular operation,
> > but most or all of them.
> 
> To establish that, I have described the experiment in the grandparent 
> email (with scenarios 1,2a;1,2b;1,2a,2b), and performed it myself as well.
> 
> But I'm talking about the slowdown observed when doing 'M->'. Not about 
> any operations one might try to perform. Having said that, after the 
> initial 'M->' most of navigation operations look snappy to me. So that's 
> the slowdown I decided to investigate.

We need to look at more than just M->.  C-n/C-p, C-v/M-v, C-l are also
important, as are the time it takes from typing M-x or M-: until you
see the prompt in the minibuffer, and the time to update the display
after inserting or deleting a single character.

> All major modes we can currently use for JSON (the built-in js-mode and 
> the two json-mode's in ELPA) inherit the value of 
> syntax-propertize-function from js-mode. But there's no need for it: 
> JSON doesn't have division, or regexps, or preprocessor directives, or 
> embedded JSX structures.
> 
> Setting syntax-propertize-function to nil speeds up parse-partial-sexp 
> significantly.

Thanks, so I guess we may have a solution for JSON files, if disabling
syntax-propertize-function doesn't have any downsides.  What about
other modes that we see in files with long lines, like XML?

And how scalable is the solution you propose, i.e. how it behaves in
JSON files with a much longer lines?





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-05 19:14                                               ` Eli Zaretskii
@ 2022-08-05 20:23                                                 ` Dmitry Gutov
  2022-08-06  6:07                                                   ` Eli Zaretskii
  0 siblings, 1 reply; 685+ messages in thread
From: Dmitry Gutov @ 2022-08-05 20:23 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, gregory, monnier

On 05.08.2022 22:14, Eli Zaretskii wrote:
>> Date: Fri, 5 Aug 2022 22:01:24 +0300
>> Cc: 56682@debbugs.gnu.org, gregory@heytings.org, monnier@iro.umontreal.ca
>> From: Dmitry Gutov <dgutov@yandex.ru>
>>
>>> First, we need to establish that indeed parse-partial-sexp is called
>>> in that manner in the relevant major modes (not just one of them), or
>>> by font-lock itself regardless of the mode.
>>
>> It is called by font-lock itself, which ends up calling syntax-ppss,
>> which does its job with parse-partial-sexp.
> 
> In all modes, regardless of what the mode wants to highlight?

Yes. As part of highlighting strings, for instance. It needs to know 
which intervals of characters are strings. And you can't really know 
that without scanning the buffer from the beginning.

>>> Second, we need to establish that indeed this takes a large portion of
>>> the time in the slow operations.  Not just one particular operation,
>>> but most or all of them.
>>
>> To establish that, I have described the experiment in the grandparent
>> email (with scenarios 1,2a;1,2b;1,2a,2b), and performed it myself as well.
>>
>> But I'm talking about the slowdown observed when doing 'M->'. Not about
>> any operations one might try to perform. Having said that, after the
>> initial 'M->' most of navigation operations look snappy to me. So that's
>> the slowdown I decided to investigate.
> 
> We need to look at more than just M->.  C-n/C-p, C-v/M-v, C-l are also
> important, as are the time it takes from typing M-x or M-: until you
> see the prompt in the minibuffer, and the time to update the display
> after inserting or deleting a single character.

I'm not seeing any particular sluggishness in these operations when 
visiting dictionary.json.

>> All major modes we can currently use for JSON (the built-in js-mode and
>> the two json-mode's in ELPA) inherit the value of
>> syntax-propertize-function from js-mode. But there's no need for it:
>> JSON doesn't have division, or regexps, or preprocessor directives, or
>> embedded JSX structures.
>>
>> Setting syntax-propertize-function to nil speeds up parse-partial-sexp
>> significantly.
> 
> Thanks, so I guess we may have a solution for JSON files, if disabling
> syntax-propertize-function doesn't have any downsides.  What about
> other modes that we see in files with long lines, like XML?

Someone will need to test it with some typical large file. xml-mode 
(alias to nxml-mode) does have a syntax-propertize-function, but it's 
probably faster than js-syntax-propertize.

> And how scalable is the solution you propose, i.e. how it behaves in
> JSON files with a much longer lines?

parse-partial-sexp is O(length of text span)

Meaning, it scales linearly. You'll see a 10x delay in a JSON file that 
is 10x as large.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-05 14:09                                                                   ` Gregory Heytings
@ 2022-08-05 22:38                                                                     ` Dmitry Gutov
  2022-08-06  7:28                                                                       ` Eli Zaretskii
  0 siblings, 1 reply; 685+ messages in thread
From: Dmitry Gutov @ 2022-08-05 22:38 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, Eli Zaretskii, Stefan Monnier

On 05.08.2022 17:09, Gregory Heytings wrote:
> 
>>> But if you're so annoyed by mis-fontification, why don't you just 
>>> turn font-lock mode off?
>>
>> "If you're annoyed by Emacs's performance with large files, why don't 
>> you just never open them?"
>>
> 
> That's just wrong: in one case we're talking about your personal 
> feelings/preferences, in the other one about Emacs' capabilities for all 
> its users.

Being able to edit a medium-size file with correct syntax highlighting 
without redisplay-related stuttering is also a capability.

>> I like font-lock and the visual cues that come with it. Only 
>> font-locking the first 1 MB of a large file seems like a good 
>> compromise: show correct highlighting where we can with reasonable 
>> performance, and omit it in the rest of the file.
>>
> 
> So what you prefer IIUC would be to call fontification-functions with a 
> locked narrowing to 1 MB if point is before that threshold, and to not 
> call fontification-functions at all after that threshold?  That might be 
> another doable approach.

If we have to support huge files with max responsiveness, then that 
would be my preference, yes.

I don't see the point of using a "locked" narrowing for this, though. 
Maybe not even a narrowing at all: just avoid calling 
fontification-functions with START > value_of(large_file_fontification_max).

Or even implement that limitation in font-lock itself (in Lisp). Not 
sure which place is better. Depends on how we want 
'font-lock-fontify-region' to behave: would it still fontify a region 
when asked, or would it abort when BEG is too high. I'd prefer the 
former approach since it gives more power to programmers, if we don't 
find any significant pitfalls with it.

>>> Also, why did you not protest vehemently when Stefan added 
>>> syntax-wholeline-max, which also causes occasional mis-fontification?
>>
>> I have replied to this exact question in an earlier email. We can 
>> continue this line of inquiry in that subthread.
>>
> 
> Sorry, I missed that part of your earlier post:
> 
>>
>> syntax-wholelines-max indeed can potentially cause problems too, but 
>> in a much narrow range of situations (and only with major modes which 
>> have non-trivial syntax-propertize-function).
>>
> 
> You forget to metion that syntax-wholelines-max can in fact make things 
> much worse, see the recipes I sent you a few days ago.  So it doesn't 
> seem like it's the right approach.

These recipes, I guess:

 > emacs -Q
 > M-: (setq long-line-threshold nil syntax-wholeline-max most-positive-
 > fixnum) RET
 > C-x C-f dictionary.json RET y ;; takes 160 seconds
 > C-e ;; takes 200 seconds
 >
 > emacs -Q
 > M-: (setq long-line-threshold nil) RET
 > C-x C-f dictionary.json RET y ;; immediate
 > C-e ;; not finished after 1200 seconds (20 minutes), I killed Emacs

I get what you're saying, but the approach does seem "right" to me 
because it works, letting me view and edit dictionary.json with good 
performance and behavior. And because it fits the overall 
font-lock/syntax-propertize/syntax-ppss scheme.

I'm not considering it without the improvements that are enabled with 
non-nil long-line-threshold, though. As you show it above, Emacs is 
simply not usable with those numbers. 200 seconds might as well be 
"never finished". It took like 10-20 seconds on my machine (and with the 
latest patch I sent to this thread), but that's still a lot. Hadn't 
managed to see the second scenario finish either.

Why the default value of syntax-wholeline-max makes things worse in this 
scenario, is a good question, but is it a useful one? Perhaps if you 
could show a similar comparison with a non-nil value of 
long-line-threshold (so that Emacs actually works rather than grind to a 
halt), we could debug it and produce the answer.

Or, if the scenario requires long-line-threshold to be nil, I guess the 
example file needs to be smaller so that the second scenario can finish 
in a bearable amount of time, and Emacs is still usable.

Either way, I believe the change is at the right level of abstraction, 
and if it has bugs, they should be solvable without major redesign.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-05 20:23                                                 ` Dmitry Gutov
@ 2022-08-06  6:07                                                   ` Eli Zaretskii
  2022-08-06 10:50                                                     ` Dmitry Gutov
  0 siblings, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-06  6:07 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: 56682, gregory, monnier

> Date: Fri, 5 Aug 2022 23:23:25 +0300
> Cc: 56682@debbugs.gnu.org, gregory@heytings.org, monnier@iro.umontreal.ca
> From: Dmitry Gutov <dgutov@yandex.ru>
> 
> > We need to look at more than just M->.  C-n/C-p, C-v/M-v, C-l are also
> > important, as are the time it takes from typing M-x or M-: until you
> > see the prompt in the minibuffer, and the time to update the display
> > after inserting or deleting a single character.
> 
> I'm not seeing any particular sluggishness in these operations when 
> visiting dictionary.json.

Numbers, please.  You have a very fast machine, so what doesn't look
sluggish on your system could very well be so on others.

> > Thanks, so I guess we may have a solution for JSON files, if disabling
> > syntax-propertize-function doesn't have any downsides.  What about
> > other modes that we see in files with long lines, like XML?
> 
> Someone will need to test it with some typical large file. xml-mode 
> (alias to nxml-mode) does have a syntax-propertize-function, but it's 
> probably faster than js-syntax-propertize.
> 
> > And how scalable is the solution you propose, i.e. how it behaves in
> > JSON files with a much longer lines?
> 
> parse-partial-sexp is O(length of text span)

Isn't that the part you proposed to remove?  I was asking about the
remaining parts.

> Meaning, it scales linearly. You'll see a 10x delay in a JSON file that 
> is 10x as large.

Linear scaling is less optimal than O(0), which is what the current
solution produces.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-05 22:38                                                                     ` Dmitry Gutov
@ 2022-08-06  7:28                                                                       ` Eli Zaretskii
  2022-08-06 22:58                                                                         ` Dmitry Gutov
  0 siblings, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-06  7:28 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: 56682, gregory, monnier

> Date: Sat, 6 Aug 2022 01:38:05 +0300
> Cc: 56682@debbugs.gnu.org, Eli Zaretskii <eliz@gnu.org>,
>  Stefan Monnier <monnier@iro.umontreal.ca>
> From: Dmitry Gutov <dgutov@yandex.ru>
> 
> > So what you prefer IIUC would be to call fontification-functions with a 
> > locked narrowing to 1 MB if point is before that threshold, and to not 
> > call fontification-functions at all after that threshold?  That might be 
> > another doable approach.
> 
> If we have to support huge files with max responsiveness, then that 
> would be my preference, yes.
> 
> I don't see the point of using a "locked" narrowing for this, though. 
> Maybe not even a narrowing at all: just avoid calling 
> fontification-functions with START > value_of(large_file_fontification_max).

I don't understand why this would be a good idea.  First, if we are
able to fontify the first 1MB of a file, why won't we be able to
fontify the 2nd, 3rd, ... Nth 1MB in a similarly fast fashion?  Do you
assume that fontification must go to BOB, but will never go forward
towards EOB?  Why would we make such an assumption, especially with
long lines, where EOB could also be EOL?

Next, why assume that your personal preferences in this case will be
shared by everyone else?  I, for one, will find it very strange to
have font-lock suddenly disappear at an arbitrary point.  If we don't
want to make the assumption it will be good for everyone, your
proposal should be one optional behavior, but not the only one.

And finally, there's no way to restrict fontification-functions from
accessing the buffer beyond the first 1MB, even if we want to, without
something like the locked narrowing.

>  > emacs -Q
>  > M-: (setq long-line-threshold nil syntax-wholeline-max most-positive-
>  > fixnum) RET
>  > C-x C-f dictionary.json RET y ;; takes 160 seconds
>  > C-e ;; takes 200 seconds
>  >
>  > emacs -Q
>  > M-: (setq long-line-threshold nil) RET
>  > C-x C-f dictionary.json RET y ;; immediate
>  > C-e ;; not finished after 1200 seconds (20 minutes), I killed Emacs
> 
> I get what you're saying, but the approach does seem "right" to me 
> because it works, letting me view and edit dictionary.json with good 
> performance and behavior.

On a Core i9 machine and with an optimized build, I presume?  And with
"good" being your subjective judgment that places more importance on
fontification than on responsiveness?  That's not necessarily a good
data point on which to base our decisions regarding the default
behavior.

> Either way, I believe the change is at the right level of abstraction, 
> and if it has bugs, they should be solvable without major redesign.

Alas, Mr. ShouldBe is not available for this project, and probably
won't be any time soon.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-06  6:07                                                   ` Eli Zaretskii
@ 2022-08-06 10:50                                                     ` Dmitry Gutov
  2022-08-06 11:17                                                       ` Eli Zaretskii
  2022-08-07  0:11                                                       ` Gregory Heytings
  0 siblings, 2 replies; 685+ messages in thread
From: Dmitry Gutov @ 2022-08-06 10:50 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, gregory, monnier

On 06.08.2022 09:07, Eli Zaretskii wrote:
>> Date: Fri, 5 Aug 2022 23:23:25 +0300
>> Cc: 56682@debbugs.gnu.org, gregory@heytings.org, monnier@iro.umontreal.ca
>> From: Dmitry Gutov <dgutov@yandex.ru>
>>
>>> We need to look at more than just M->.  C-n/C-p, C-v/M-v, C-l are also
>>> important, as are the time it takes from typing M-x or M-: until you
>>> see the prompt in the minibuffer, and the time to update the display
>>> after inserting or deleting a single character.
>>
>> I'm not seeing any particular sluggishness in these operations when
>> visiting dictionary.json.
> 
> Numbers, please.  You have a very fast machine, so what doesn't look
> sluggish on your system could very well be so on others.

How do you measure these operations including the redisplay lag?

Anyway, all of these look instant.

>>> Thanks, so I guess we may have a solution for JSON files, if disabling
>>> syntax-propertize-function doesn't have any downsides.  What about
>>> other modes that we see in files with long lines, like XML?
>>
>> Someone will need to test it with some typical large file. xml-mode
>> (alias to nxml-mode) does have a syntax-propertize-function, but it's
>> probably faster than js-syntax-propertize.
>>
>>> And how scalable is the solution you propose, i.e. how it behaves in
>>> JSON files with a much longer lines?
>>
>> parse-partial-sexp is O(length of text span)
> 
> Isn't that the part you proposed to remove?  I was asking about the
> remaining parts.

No, removing syntax-propertize-function just made parse-partial-sexp 5x 
faster here, resulting in much faster fontification near EOB.

But in a large enough buffer, it's still going to be the slowest part.

>> Meaning, it scales linearly. You'll see a 10x delay in a JSON file that
>> is 10x as large.
> 
> Linear scaling is less optimal than O(0), which is what the current
> solution produces.

Correct syntax highlighting requires parsing the buffer from the 
beginning. Otherwise we get random results, essentially.

Just like depicted on my latest screenshot for downloadify.js: the 
beginning of the narrowed region ended up inside a string, and as a 
result several screenfuls were entirely mis-fontified, with strings and 
non-strings inverted.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-06 10:50                                                     ` Dmitry Gutov
@ 2022-08-06 11:17                                                       ` Eli Zaretskii
  2022-08-06 11:49                                                         ` Gregory Heytings
  2022-08-06 20:59                                                         ` Dmitry Gutov
  2022-08-07  0:11                                                       ` Gregory Heytings
  1 sibling, 2 replies; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-06 11:17 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: 56682, gregory, monnier

> Date: Sat, 6 Aug 2022 13:50:41 +0300
> Cc: 56682@debbugs.gnu.org, gregory@heytings.org, monnier@iro.umontreal.ca
> From: Dmitry Gutov <dgutov@yandex.ru>
> 
> >> I'm not seeing any particular sluggishness in these operations when
> >> visiting dictionary.json.
> > 
> > Numbers, please.  You have a very fast machine, so what doesn't look
> > sluggish on your system could very well be so on others.
> 
> How do you measure these operations including the redisplay lag?

By timing them.  With benchmark-run or similar, if it isn't slow
enough to be measured "by hand".

> > Linear scaling is less optimal than O(0), which is what the current
> > solution produces.
> 
> Correct syntax highlighting requires parsing the buffer from the 
> beginning. Otherwise we get random results, essentially.
> 
> Just like depicted on my latest screenshot for downloadify.js: the 
> beginning of the narrowed region ended up inside a string, and as a 
> result several screenfuls were entirely mis-fontified, with strings and 
> non-strings inverted.

Yes, and IMNSHO responsiveness is more important than correctness in
these cases.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-06 11:17                                                       ` Eli Zaretskii
@ 2022-08-06 11:49                                                         ` Gregory Heytings
  2022-08-06 11:50                                                           ` Gregory Heytings
  2022-08-06 20:04                                                           ` Dmitry Gutov
  2022-08-06 20:59                                                         ` Dmitry Gutov
  1 sibling, 2 replies; 685+ messages in thread
From: Gregory Heytings @ 2022-08-06 11:49 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, monnier, Dmitry Gutov


>> Just like depicted on my latest screenshot for downloadify.js: the 
>> beginning of the narrowed region ended up inside a string, and as a 
>> result several screenfuls were entirely mis-fontified, with strings and 
>> non-strings inverted.
>
> Yes, and IMNSHO responsiveness is more important than correctness in 
> these cases.
>

Especially given that the said correctness has always been relative.  So 
it's not like we're leaving the aven of 100% correctness and falling into 
the hell of 10% correctness.  A more reasonable view of the situation is 
that we had 90% correctness and now have, in files with "loo long lines" 
and only in those files, 60% correctness.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-06 11:49                                                         ` Gregory Heytings
@ 2022-08-06 11:50                                                           ` Gregory Heytings
  2022-08-06 20:04                                                           ` Dmitry Gutov
  1 sibling, 0 replies; 685+ messages in thread
From: Gregory Heytings @ 2022-08-06 11:50 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, monnier, Dmitry Gutov


>
> not like we're leaving the aven
>

the heaven





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-05 11:50                                                                         ` Gregory Heytings
  2022-08-05 13:43                                                                           ` Eli Zaretskii
@ 2022-08-06 13:28                                                                           ` Eli Zaretskii
  2022-08-07  0:29                                                                             ` Gregory Heytings
  2022-08-06 14:05                                                                           ` Eli Zaretskii
  2 siblings, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-06 13:28 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: gerd.moellmann, 56682, monnier, dgutov

> Date: Fri, 05 Aug 2022 11:50:56 +0000
> From: Gregory Heytings <gregory@heytings.org>
> cc: gerd.moellmann@gmail.com, 56682@debbugs.gnu.org, monnier@iro.umontreal.ca, 
>     dgutov@yandex.ru
> 
> > There's (at least) one more aspect of this, as long as Text mode is 
> > being used: Text mode doesn't force bidi-paragraph-direction to be 
> > left-to-right, whereas all descendants of prog-mode, including js-mode, 
> > do.  Leaving bidi-paragraph-direction at nil means Emacs needs to 
> > determine the base paragraph direction each time it's about to redisplay 
> > a window, and that might be expensive, especially in a large buffer 
> > without any paragraph breaks (by default, an empty line), because that 
> > is determined by the first strong directional character of the 
> > paragraph.  So for a more fair comparison with Text mode, you should set 
> > bidi-paragraph-direction to the value left-to-right in text-mode 
> > buffers.
> 
> Indeed, that seems to be the culprit here, I didn't know that text-mode 
> was an exception here.  If I set bidi-paragraph-direction to 
> 'left-to-right after visiting the arabic-small.txt file, Emacs (mis) 
> behaves like it does for the other Arabic files: it becomes slow, and C-n 
> C-p do not work correctly anymore.

The problems with C-n/C-p were unrelated, and seem to be a very old
bug.  I've now mostly fixed that on master (and hopefully didn't
introduce any regressions while at that).

In general, layout calculations when we have very long stretches of
R2L text in a left-to-right paragraph are very tricky, because many
assumptions become false.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-05 11:50                                                                         ` Gregory Heytings
  2022-08-05 13:43                                                                           ` Eli Zaretskii
  2022-08-06 13:28                                                                           ` Eli Zaretskii
@ 2022-08-06 14:05                                                                           ` Eli Zaretskii
  2022-08-07  0:30                                                                             ` Gregory Heytings
  2 siblings, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-06 14:05 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: gerd.moellmann, 56682, monnier, dgutov

> Date: Fri, 05 Aug 2022 11:50:56 +0000
> From: Gregory Heytings <gregory@heytings.org>
> cc: gerd.moellmann@gmail.com, 56682@debbugs.gnu.org, monnier@iro.umontreal.ca, 
>     dgutov@yandex.ru
> 
> Indeed, that seems to be the culprit here, I didn't know that text-mode 
> was an exception here.  If I set bidi-paragraph-direction to 
> 'left-to-right after visiting the arabic-small.txt file, Emacs (mis) 
> behaves like it does for the other Arabic files: it becomes slow, and C-n 
> C-p do not work correctly anymore.

I've installed a change that makes Arabic rendering roughly twice
faster.  It is still quite slow, but less so.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-06 11:49                                                         ` Gregory Heytings
  2022-08-06 11:50                                                           ` Gregory Heytings
@ 2022-08-06 20:04                                                           ` Dmitry Gutov
  2022-08-06 23:29                                                             ` Gregory Heytings
  1 sibling, 1 reply; 685+ messages in thread
From: Dmitry Gutov @ 2022-08-06 20:04 UTC (permalink / raw)
  To: Gregory Heytings, Eli Zaretskii; +Cc: 56682, monnier

[-- Attachment #1: Type: text/plain, Size: 1377 bytes --]

On 06.08.2022 14:49, Gregory Heytings wrote:
> 
>>> Just like depicted on my latest screenshot for downloadify.js: the 
>>> beginning of the narrowed region ended up inside a string, and as a 
>>> result several screenfuls were entirely mis-fontified, with strings 
>>> and non-strings inverted.
>>
>> Yes, and IMNSHO responsiveness is more important than correctness in 
>> these cases.
>>
> 
> Especially given that the said correctness has always been relative.  So 
> it's not like we're leaving the aven of 100% correctness and falling 
> into the hell of 10% correctness.  A more reasonable view of the 
> situation is that we had 90% correctness and now have,

As someone who worked on different major mode and syntax-ppss itself a 
little, that feels moderately insulting.

No: we strive to close to 100% correctness in supporting language syntax 
and can often reach it with moderate effort (programming-wise).

> in files with 
> "loo long lines" and only in those files, 60% correctness.

Does the attached screenshot look like 60% correctness to you?

To me, it's more like -60%. Or at least, that's what the utility of such 
highlighting will be (negative).

And I didn't have to hunt for this screenshot, tweaking parameters, or 
files, or window sizes here and there.

This is just how half of dictionary.json looks with Emacs from master on 
default settings.

[-- Attachment #2: Screenshot from 2022-08-06 22-55-58.png --]
[-- Type: image/png, Size: 823680 bytes --]

^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-06 11:17                                                       ` Eli Zaretskii
  2022-08-06 11:49                                                         ` Gregory Heytings
@ 2022-08-06 20:59                                                         ` Dmitry Gutov
  1 sibling, 0 replies; 685+ messages in thread
From: Dmitry Gutov @ 2022-08-06 20:59 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, gregory, monnier

On 06.08.2022 14:17, Eli Zaretskii wrote:
>> Date: Sat, 6 Aug 2022 13:50:41 +0300
>> Cc: 56682@debbugs.gnu.org, gregory@heytings.org, monnier@iro.umontreal.ca
>> From: Dmitry Gutov <dgutov@yandex.ru>
>>
>>>> I'm not seeing any particular sluggishness in these operations when
>>>> visiting dictionary.json.
>>>
>>> Numbers, please.  You have a very fast machine, so what doesn't look
>>> sluggish on your system could very well be so on others.
>>
>> How do you measure these operations including the redisplay lag?
> 
> By timing them.  With benchmark-run or similar, if it isn't slow
> enough to be measured "by hand".

How do I time 'M-x'?

Anyway, here are some numbers:

(benchmark 1 '(next-line 1)) =>
Elapsed time: 0.035137s
Elapsed time: 0.061863s
Elapsed time: 0.027261s
(benchmark 1 '(cua-scroll-down 1)) =>
Elapsed time: 0.049362s
Elapsed time: 0.050060s
(benchmark 1 '(cua-scroll-up 1)) =>
Elapsed time: 0.012383s
Elapsed time: 0.039984s
(benchmark 1 '(recenter-top-bottom 1)) =>
Elapsed time: 0.042014s
Elapsed time: 0.013934s

I get very similar numbers on these operations with unmodified master in 
this file.

>>> Linear scaling is less optimal than O(0), which is what the current
>>> solution produces.
>>
>> Correct syntax highlighting requires parsing the buffer from the
>> beginning. Otherwise we get random results, essentially.
>>
>> Just like depicted on my latest screenshot for downloadify.js: the
>> beginning of the narrowed region ended up inside a string, and as a
>> result several screenfuls were entirely mis-fontified, with strings and
>> non-strings inverted.
> 
> Yes, and IMNSHO responsiveness is more important than correctness in
> these cases.

That's why I suggested that, possibly after some further optimization 
work on parse-partial-sexp and syntax-propertize, we decide which 
initial length of the file we can fontify correctly with decent speed. 1 
MB, or 10 MB, something like that.

And of course make that customizable.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-06  7:28                                                                       ` Eli Zaretskii
@ 2022-08-06 22:58                                                                         ` Dmitry Gutov
  2022-08-07  0:44                                                                           ` Gregory Heytings
  2022-08-07  6:11                                                                           ` Eli Zaretskii
  0 siblings, 2 replies; 685+ messages in thread
From: Dmitry Gutov @ 2022-08-06 22:58 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, gregory, monnier

On 06.08.2022 10:28, Eli Zaretskii wrote:
>> Date: Sat, 6 Aug 2022 01:38:05 +0300
>> Cc: 56682@debbugs.gnu.org, Eli Zaretskii <eliz@gnu.org>,
>>   Stefan Monnier <monnier@iro.umontreal.ca>
>> From: Dmitry Gutov <dgutov@yandex.ru>
>>
>>> So what you prefer IIUC would be to call fontification-functions with a
>>> locked narrowing to 1 MB if point is before that threshold, and to not
>>> call fontification-functions at all after that threshold?  That might be
>>> another doable approach.
>>
>> If we have to support huge files with max responsiveness, then that
>> would be my preference, yes.
>>
>> I don't see the point of using a "locked" narrowing for this, though.
>> Maybe not even a narrowing at all: just avoid calling
>> fontification-functions with START > value_of(large_file_fontification_max).
> 
> I don't understand why this would be a good idea.  First, if we are
> able to fontify the first 1MB of a file, why won't we be able to
> fontify the 2nd, 3rd, ... Nth 1MB in a similarly fast fashion?

Fontifying a window-ful of buffer near the end of 2N will take ~2x as 
long as doing that near the end of 1N, 3N - ~3x as long, etc.

> Do you
> assume that fontification must go to BOB, but will never go forward
> towards EOB?

That's my experience, yes. Language parsers either don't need to look 
forward at all, or only need to look forward a little. And especially 
since we regularly have to deal with unfinished code (and code is most 
often unfinished from the tail end, not from the front), our 
syntax-propertize and font-lock matchers have to account for that.

> Why would we make such an assumption, especially with
> long lines, where EOB could also be EOL?

That's where syntax-wholeline-max comes into play: it won't extend the 
current region past additional 10000 chars.

Even if that fails to work somehow, we could code up font-lock to apply 
narrowing past a certain point, to definitely limit the possible 
overhead. But I'd rather we not do that without a concrete problem case.

> Next, why assume that your personal preferences in this case will be
> shared by everyone else?  I, for one, will find it very strange to
> have font-lock suddenly disappear at an arbitrary point.

Is it more strange than syntax highlighting starting to go crazy around 
the same arbitrary point?

I'm assuming that people will quickly understand that very big files are 
treated in a special way, and I seem to recall that certain other 
editors use a similar approach (switch off some features past a certain 
file length).

> If we don't
> want to make the assumption it will be good for everyone, your
> proposal should be one optional behavior, but not the only one.

I'm happy for this to be customizable, and for everyone to be able to 
choose the tradeoffs they want. For that to be possible, this choice 
need to happen in Lisp. But I made my arguments for what seems like a 
good default behavior, both reasonable-looking and fast in (hopefully) 
all significant cases.

The important part is for this to be customizable separately from 
long-line-threshold because these are different issues, and the 
slowdowns happen around different amounts of text.

> And finally, there's no way to restrict fontification-functions from
> accessing the buffer beyond the first 1MB, even if we want to, without
> something like the locked narrowing.

font-lock rules really shouldn't call 'widen', we've talked about this 
before (in mmm-mode threads), then went through the built-in major modes 
which did so, and fixed that.

The sole (big) exception is CC Mode, but its internals aren't compatible 
with the current forced narrowing either, and Gregory said it's not 
important in the context of long lines or large files anyway.

So as long as major modes behave, we won't need the locked narrowing in 
this area. And hopefully won't need narrowing at all.

>>   > emacs -Q
>>   > M-: (setq long-line-threshold nil syntax-wholeline-max most-positive-
>>   > fixnum) RET
>>   > C-x C-f dictionary.json RET y ;; takes 160 seconds
>>   > C-e ;; takes 200 seconds
>>   >
>>   > emacs -Q
>>   > M-: (setq long-line-threshold nil) RET
>>   > C-x C-f dictionary.json RET y ;; immediate
>>   > C-e ;; not finished after 1200 seconds (20 minutes), I killed Emacs
>>
>> I get what you're saying, but the approach does seem "right" to me
>> because it works, letting me view and edit dictionary.json with good
>> performance and behavior.
> 
> On a Core i9 machine and with an optimized build, I presume?  And with
> "good" being your subjective judgment that places more importance on
> fontification than on responsiveness?  That's not necessarily a good
> data point on which to base our decisions regarding the default
> behavior.

On a slower machine, you'll just need to find a correspondingly smaller 
file to see the same combination: the line is long enough for redisplay 
to stutter with (setq long-line-threshold nil), but the file is not big 
enough for font-lock to really become the bottleneck.

Even with my "big and beefy" i9, I've been seeing redisplay slowdowns 
with lines containing 1000s of chars. Very noticeable around 40K.

Whereas font-lock can remain fast with files up to 100x that size. And 
even then remain bearable so long as the user doesn't jump around too 
much, editing the file at BOB then going to EOB, time and time again.

>> Either way, I believe the change is at the right level of abstraction,
>> and if it has bugs, they should be solvable without major redesign.
> 
> Alas, Mr. ShouldBe is not available for this project, and probably
> won't be any time soon.

No need to mock my request for a proper reproduction scenario.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-06 20:04                                                           ` Dmitry Gutov
@ 2022-08-06 23:29                                                             ` Gregory Heytings
  2022-08-07 11:14                                                               ` Dmitry Gutov
  0 siblings, 1 reply; 685+ messages in thread
From: Gregory Heytings @ 2022-08-06 23:29 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: 56682, Eli Zaretskii, monnier

[-- Attachment #1: Type: text/plain, Size: 1301 bytes --]


>> Especially given that the said correctness has always been relative.  
>> So it's not like we're leaving the heaven of 100% correctness and 
>> falling into the hell of 10% correctness.  A more reasonable view of 
>> the situation is that we had 90% correctness and now have,
>
> As someone who worked on different major mode and syntax-ppss itself a 
> little, that feels moderately insulting.
>
> No: we strive to close to 100% correctness in supporting language syntax 
> and can often reach it with moderate effort (programming-wise).
>

It isn't meant to be insulting, and I think you understood that.  My 
experience is simply that highlighting in Emacs is definitely not "close 
to 100% correct", whatever be the mode.  The most correct one is perhaps 
emacs-lisp-mode (unsurprisingy).

>> in files with "loo long lines" and only in those files, 60% 
>> correctness.
>
> Does the attached screenshot look like 60% correctness to you?
>

A small sample of a big file is definitely not representative, and I think 
you understood that.

>
> To me, it's more like -60%. Or at least, that's what the utility of such 
> highlighting will be (negative).
>

In which case you should turn highlighting off in such files.  That's what 
all other editors do anyway.

^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-06 10:50                                                     ` Dmitry Gutov
  2022-08-06 11:17                                                       ` Eli Zaretskii
@ 2022-08-07  0:11                                                       ` Gregory Heytings
  2022-08-07 11:28                                                         ` Dmitry Gutov
  1 sibling, 1 reply; 685+ messages in thread
From: Gregory Heytings @ 2022-08-07  0:11 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: 56682, Eli Zaretskii, monnier


>>> I'm not seeing any particular sluggishness in these operations when 
>>> visiting dictionary.json.
>> 
>> Numbers, please.  You have a very fast machine, so what doesn't look 
>> sluggish on your system could very well be so on others.
>
> How do you measure these operations including the redisplay lag?
>
> Anyway, all of these look instant.
>

They aren't, no.  Of course it all depends on where you are in the file, 
on your CPU, and so forth.  For me (with locked narrowing disabled, in 
dictionary.json, with emacs -Q) M-> takes about 3 seconds.  Likewise, if I 
do for example C-s aan, and then repeat C-s, whenever the next match is 
far enough in the buffer I see a delay of about 2 seconds.  Another test 
you can do is to lean on C-v after opening the buffer, you'll see that 
Emacs becomes very sluggish, sometimes I have to wait more than 5 seconds 
to avance from one screenfull.

>
> Correct syntax highlighting requires parsing the buffer from the 
> beginning. Otherwise we get random results, essentially.
>

It all depends how you define "correct".  You may remind that I suggested 
to introduce some heuristics in the algorithm.  With appropriate 
heuristics, you could probably get reasonably good results even if you 
only have access to a small portion of the buffer.  For example, instead 
of counting the number of '"' characters from BOB to know for sure if you 
are in a string, you mark those that are likely at the beginning of a 
string and those that are likely at the end of a string, and you select 
the most likely possibility among all combinations to highlight the buffer 
portion as well as possible.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-06 13:28                                                                           ` Eli Zaretskii
@ 2022-08-07  0:29                                                                             ` Gregory Heytings
  2022-08-07 14:07                                                                               ` Eli Zaretskii
  0 siblings, 1 reply; 685+ messages in thread
From: Gregory Heytings @ 2022-08-07  0:29 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: gerd.moellmann, 56682, monnier, dgutov

[-- Attachment #1: Type: text/plain, Size: 865 bytes --]


>
> The problems with C-n/C-p were unrelated, and seem to be a very old bug. 
> I've now mostly fixed that on master (and hopefully didn't introduce any 
> regressions while at that).
>

Thanks!  Indeed these problem seem fixed now, it's much better.  I did not 
see any regressions, if I see anything I'll tell you.  One case that still 
isn't quite right apparently is the arabic-small.txt.json file.  If I open 
that file with emacs -Q and type C-f, or C-n, or C-p, point moves to EOB 
(but strangly, not in 100% cases), and there C-a, or M-<, or C-p, or C-n 
do not seem to work anymore.

>
> In general, layout calculations when we have very long stretches of R2L 
> text in a left-to-right paragraph are very tricky, because many 
> assumptions become false.
>

Frankly, would programming be as fun as it is if assumptions were true? 😉

^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-06 14:05                                                                           ` Eli Zaretskii
@ 2022-08-07  0:30                                                                             ` Gregory Heytings
  0 siblings, 0 replies; 685+ messages in thread
From: Gregory Heytings @ 2022-08-07  0:30 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: gerd.moellmann, 56682, monnier, dgutov


>> Indeed, that seems to be the culprit here, I didn't know that text-mode 
>> was an exception here.  If I set bidi-paragraph-direction to 
>> 'left-to-right after visiting the arabic-small.txt file, Emacs (mis) 
>> behaves like it does for the other Arabic files: it becomes slow, and 
>> C-n C-p do not work correctly anymore.
>
> I've installed a change that makes Arabic rendering roughly twice 
> faster.  It is still quite slow, but less so.
>

Yes, I've seen that change, too.  It's better now, I wonder if I'll manage 
to make it even better.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-06 22:58                                                                         ` Dmitry Gutov
@ 2022-08-07  0:44                                                                           ` Gregory Heytings
  2022-08-07  6:11                                                                           ` Eli Zaretskii
  1 sibling, 0 replies; 685+ messages in thread
From: Gregory Heytings @ 2022-08-07  0:44 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: 56682, Eli Zaretskii, monnier


>
> The sole (big) exception is CC Mode, but its internals aren't compatible 
> with the current forced narrowing either, and Gregory said it's not 
> important in the context of long lines or large files anyway.
>

I did not say that, no.  What I can say is that the way CC Mode (ab)uses 
font locking is very unfortunate, and that it is indeed, as far as I can 
tell, incompatible with locked narrowing.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-06 22:58                                                                         ` Dmitry Gutov
  2022-08-07  0:44                                                                           ` Gregory Heytings
@ 2022-08-07  6:11                                                                           ` Eli Zaretskii
  2022-08-07 18:27                                                                             ` Dmitry Gutov
  1 sibling, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-07  6:11 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: 56682, gregory, monnier

> Date: Sun, 7 Aug 2022 01:58:06 +0300
> Cc: gregory@heytings.org, 56682@debbugs.gnu.org, monnier@iro.umontreal.ca
> From: Dmitry Gutov <dgutov@yandex.ru>
> 
> >> Either way, I believe the change is at the right level of abstraction,
> >> and if it has bugs, they should be solvable without major redesign.
> > 
> > Alas, Mr. ShouldBe is not available for this project, and probably
> > won't be any time soon.
> 
> No need to mock my request for a proper reproduction scenario.

It isn't mockery.  My point is simple: we would like to solve this
issue in the best possible manner in Emacs 29.  Keeping talking about
what should and shouldn't be done doesn't advance us on that path.  If
you have practical ideas to solve this in a way different from what is
now on master, feel free to push a feature branch with your proposed
changes, or even install them as optional features on master, and
let's compare the merits and demerits of each idea in practical use
cases and on a variety of systems.  Then we can eventually make an
intelligent decision about the optimal mix of features we want to
have.  But as long as there's only one practical idea that works
reasonably well, it is going to win if only for lack of "competition",
because leaving the situation as it is in Emacs 28 is not an option
anymore.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-06 23:29                                                             ` Gregory Heytings
@ 2022-08-07 11:14                                                               ` Dmitry Gutov
  0 siblings, 0 replies; 685+ messages in thread
From: Dmitry Gutov @ 2022-08-07 11:14 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, Eli Zaretskii, monnier

On 07.08.2022 02:29, Gregory Heytings wrote:
> 
>>> Especially given that the said correctness has always been relative. 
>>> So it's not like we're leaving the heaven of 100% correctness and 
>>> falling into the hell of 10% correctness.  A more reasonable view of 
>>> the situation is that we had 90% correctness and now have,
>>
>> As someone who worked on different major mode and syntax-ppss itself a 
>> little, that feels moderately insulting.
>>
>> No: we strive to close to 100% correctness in supporting language 
>> syntax and can often reach it with moderate effort (programming-wise).
>>
> 
> It isn't meant to be insulting, and I think you understood that.  My 
> experience is simply that highlighting in Emacs is definitely not "close 
> to 100% correct", whatever be the mode.  The most correct one is perhaps 
> emacs-lisp-mode (unsurprisingy).

Have you ever managed to trigger incorrect highlighting in a JSON file?

Without the recent changes, that is.

>>> in files with "loo long lines" and only in those files, 60% correctness.
>>
>> Does the attached screenshot look like 60% correctness to you?
>>
> 
> A small sample of a big file is definitely not representative, and I 
> think you understood that.

Did I need to send the screenshots of every screen? Like I said, more 
than half of the file was like that.

And then I restarted with 'emacs -Q', and the result looked even worse.

>> To me, it's more like -60%. Or at least, that's what the utility of 
>> such highlighting will be (negative).
>>
> 
> In which case you should turn highlighting off in such files.  That's 
> what all other editors do anyway.

That's the same as saying the user should turn off font-lock if they 
experience performance problems.

Except in this case they would still have choice to suffer a little in 
the performance department (and the amount of said suffering will highly 
depend on their use case) but keep good syntax highlighting.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-07  0:11                                                       ` Gregory Heytings
@ 2022-08-07 11:28                                                         ` Dmitry Gutov
  2022-08-07 12:46                                                           ` Gregory Heytings
  2022-08-07 17:41                                                           ` Dmitry Gutov
  0 siblings, 2 replies; 685+ messages in thread
From: Dmitry Gutov @ 2022-08-07 11:28 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, Eli Zaretskii, monnier

On 07.08.2022 03:11, Gregory Heytings wrote:
> 
>>>> I'm not seeing any particular sluggishness in these operations when 
>>>> visiting dictionary.json.
>>>
>>> Numbers, please.  You have a very fast machine, so what doesn't look 
>>> sluggish on your system could very well be so on others.
>>
>> How do you measure these operations including the redisplay lag?
>>
>> Anyway, all of these look instant.
>>
> 
> They aren't, no.  Of course it all depends on where you are in the file, 
> on your CPU, and so forth.  For me (with locked narrowing disabled, in 
> dictionary.json, with emacs -Q) M-> takes about 3 seconds.

And it's about 1.5s here. Once.

> Likewise, if 
> I do for example C-s aan, and then repeat C-s, whenever the next match 
> is far enough in the buffer I see a delay of about 2 seconds.

Sounds like a performance problem inside isearch. I might take a look.

It shouldn't force font-lock over a big region, and if syntax-ppss cache 
is already filled, there is no other obvious place for that delay to 
come from.

> Another 
> test you can do is to lean on C-v after opening the buffer, you'll see 
> that Emacs becomes very sluggish, sometimes I have to wait more than 5 
> seconds to avance from one screenfull.

First of all, these aren't the tests Eli asked for or I performed. Why 
don't you compare apples to oranges?

Leaning on C-v isn't a scientific test anyway: it compares the speed of 
two processes internal to Emacs (event handling and rendering), rather 
than something objective. And waiting for X seconds means you wait for 
however many screens you managed to page through, for all of them to get 
syntax-highlighted. That is indeed a way to break the "jit" in 
"jit-lock", but how is that a useful test?

Anyway, could you please try the combined patch I posted recently 
together with dictionary.json?

https://debbugs.gnu.org/cgi/bugreport.cgi?bug=56682#1084

>> Correct syntax highlighting requires parsing the buffer from the 
>> beginning. Otherwise we get random results, essentially.
>>
> 
> It all depends how you define "correct".  You may remind that I 
> suggested to introduce some heuristics in the algorithm.

Stefan mentioned such possibility as well.

> With 
> appropriate heuristics, you could probably get reasonably good results 
> even if you only have access to a small portion of the buffer.  For 
> example, instead of counting the number of '"' characters from BOB to 
> know for sure if you are in a string, you mark those that are likely at 
> the beginning of a string and those that are likely at the end of a 
> string, and you select the most likely possibility among all 
> combinations to highlight the buffer portion as well as possible.

Any such heuristics are possible, but major modes are the best place to 
make that decision. And until the major mode has installed something 
like this, syntax-ppss should default to the "correct" behavior. Which 
means operating outside of narrowing.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-07 11:28                                                         ` Dmitry Gutov
@ 2022-08-07 12:46                                                           ` Gregory Heytings
  2022-08-07 17:40                                                             ` Dmitry Gutov
  2022-08-07 17:41                                                           ` Dmitry Gutov
  1 sibling, 1 reply; 685+ messages in thread
From: Gregory Heytings @ 2022-08-07 12:46 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: 56682, Eli Zaretskii, monnier

[-- Attachment #1: Type: text/plain, Size: 1441 bytes --]


>> They aren't, no.  Of course it all depends on where you are in the 
>> file, on your CPU, and so forth.  For me (with locked narrowing 
>> disabled, in dictionary.json, with emacs -Q) M-> takes about 3 seconds.
>
> And it's about 1.5s here.
>

So you're the lucky owner of a fast computer.  And using an optimized 
build.  Not everyone is in that fortunate situation.

>
> Once.
>

No, not once.  It happens every time you modify the buffer and move far 
enough in that buffer.

>> Likewise, if I do for example C-s aan, and then repeat C-s, whenever 
>> the next match is far enough in the buffer I see a delay of about 2 
>> seconds.
>
> Sounds like a performance problem inside isearch. I might take a look.
>

No, isearch is entirely agnostic about font locking.

>> Another test you can do is to lean on C-v after opening the buffer, 
>> you'll see that Emacs becomes very sluggish, sometimes I have to wait 
>> more than 5 seconds to avance from one screenfull.
>
> First of all, these aren't the tests Eli asked for or I performed. Why 
> don't you compare apples to oranges?
>
> Leaning on C-v isn't a scientific test anyway: it compares the speed of 
> two processes internal to Emacs (event handling and rendering), rather 
> than something objective.
>

It's yet another test meant to test Emacs' responsiveness, and it is as 
"objective" as possible: does Emacs choke or does it not?

^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-07  0:29                                                                             ` Gregory Heytings
@ 2022-08-07 14:07                                                                               ` Eli Zaretskii
  0 siblings, 0 replies; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-07 14:07 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: gerd.moellmann, 56682, monnier, dgutov

> Date: Sun, 07 Aug 2022 00:29:05 +0000
> From: Gregory Heytings <gregory@heytings.org>
> cc: gerd.moellmann@gmail.com, 56682@debbugs.gnu.org, monnier@iro.umontreal.ca, 
>     dgutov@yandex.ru
> 
> Thanks!  Indeed these problem seem fixed now, it's much better.  I did not 
> see any regressions, if I see anything I'll tell you.  One case that still 
> isn't quite right apparently is the arabic-small.txt.json file.  If I open 
> that file with emacs -Q and type C-f, or C-n, or C-p, point moves to EOB 
> (but strangly, not in 100% cases), and there C-a, or M-<, or C-p, or C-n 
> do not seem to work anymore.

Indeed.  But what you perhaps don't realize is that in this case what
is shown on the last screen-full is not EOB, but BOB!  That's because
everything is reordered for display, so the first character appears
last.

I've fixed some more issues with such (relatively rare) situations, so
now these commands should work more reasonably (but very slowly) after
C-f in that file.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-07 12:46                                                           ` Gregory Heytings
@ 2022-08-07 17:40                                                             ` Dmitry Gutov
  2022-08-07 20:21                                                               ` Gregory Heytings
  0 siblings, 1 reply; 685+ messages in thread
From: Dmitry Gutov @ 2022-08-07 17:40 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, Eli Zaretskii, monnier

On 07.08.2022 15:46, Gregory Heytings wrote:
> 
>>> They aren't, no.  Of course it all depends on where you are in the 
>>> file, on your CPU, and so forth.  For me (with locked narrowing 
>>> disabled, in dictionary.json, with emacs -Q) M-> takes about 3 seconds.
>>
>> And it's about 1.5s here.
>>
> 
> So you're the lucky owner of a fast computer.  And using an optimized 
> build.  Not everyone is in that fortunate situation.

If your computer is 2x slower, that should mean it can handle twice 
smaller files with approximately the same speed.

So, qualitatively, you should be in the same boat.

>>
>> Once.
>>
> 
> No, not once.  It happens every time you modify the buffer and move far 
> enough in that buffer.

Yes. That's the price of re-parsing the buffer the way that we know how 
(with parse-partial-sexp). The only feasible comparable alternative I 
know of is tree-sitter which has a more advanced parser that knows how 
to amortize certain operations modifications faster than O(N).

So, with the tree-sitter integration that's hopefully coming, we should 
be able to get a speed improvement in handling of huge files, too. If it 
doesn't blow up the memory requirements, that is.

>>> Likewise, if I do for example C-s aan, and then repeat C-s, whenever 
>>> the next match is far enough in the buffer I see a delay of about 2 
>>> seconds.
>>
>> Sounds like a performance problem inside isearch. I might take a look.
>>
> 
> No, isearch is entirely agnostic about font locking.

I wonder where it spends those 2 seconds, then.

>>> Another test you can do is to lean on C-v after opening the buffer, 
>>> you'll see that Emacs becomes very sluggish, sometimes I have to wait 
>>> more than 5 seconds to avance from one screenfull.
>>
>> First of all, these aren't the tests Eli asked for or I performed. Why 
>> don't you compare apples to oranges?
>>
>> Leaning on C-v isn't a scientific test anyway: it compares the speed 
>> of two processes internal to Emacs (event handling and rendering), 
>> rather than something objective.
>>
> 
> It's yet another test meant to test Emacs' responsiveness, and it is as 
> "objective" as possible: does Emacs choke or does it not?

It's not a test of font-lock's performance, however. Because it compares 
that to a process that's internal to Emacs as well (moving across the 
buffer with C-v). Like, the faster we're able to make the latter 
command, the faster font-lock has to be to keep up. As an objective 
test, it's not meaningful.

Now, if we measured how many screens one could page through with 
fontification in 10 seconds, that's something more objective (putting 
aside one's screen dimensions, of course). But anyway, it's a nice race, 
but not as essential as quickly fontifying any particular screen. That's 
what we're measured responsiveness with in this discussion so far.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-07 11:28                                                         ` Dmitry Gutov
  2022-08-07 12:46                                                           ` Gregory Heytings
@ 2022-08-07 17:41                                                           ` Dmitry Gutov
  2022-08-09 21:03                                                             ` Gregory Heytings
  1 sibling, 1 reply; 685+ messages in thread
From: Dmitry Gutov @ 2022-08-07 17:41 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, Eli Zaretskii, monnier

On 07.08.2022 14:28, Dmitry Gutov wrote:
> Anyway, could you please try the combined patch I posted recently 
> together with dictionary.json?
> 
> https://debbugs.gnu.org/cgi/bugreport.cgi?bug=56682#1084

Gregory, could you do this?

And report on how your own responsiveness metrics hold up after that.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-07  6:11                                                                           ` Eli Zaretskii
@ 2022-08-07 18:27                                                                             ` Dmitry Gutov
  2022-08-07 18:38                                                                               ` Eli Zaretskii
  0 siblings, 1 reply; 685+ messages in thread
From: Dmitry Gutov @ 2022-08-07 18:27 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, gregory, monnier

On 07.08.2022 09:11, Eli Zaretskii wrote:
>> Date: Sun, 7 Aug 2022 01:58:06 +0300
>> Cc: gregory@heytings.org, 56682@debbugs.gnu.org, monnier@iro.umontreal.ca
>> From: Dmitry Gutov <dgutov@yandex.ru>
>>
>>>> Either way, I believe the change is at the right level of abstraction,
>>>> and if it has bugs, they should be solvable without major redesign.
>>>
>>> Alas, Mr. ShouldBe is not available for this project, and probably
>>> won't be any time soon.
>>
>> No need to mock my request for a proper reproduction scenario.
> 
> It isn't mockery.

How else would I call that response to me saying that I need an 
actionable complaint. I.e. a scenario that reflects an realistic usage 
scenario and is possible to debug.

> My point is simple: we would like to solve this
> issue in the best possible manner in Emacs 29.  Keeping talking about
> what should and shouldn't be done doesn't advance us on that path.  If
> you have practical ideas to solve this in a way different from what is
> now on master,

That "if" doesn't sound very friendly either. I've been explaining 
"practical ideas" for the last couple of days.

And I've sent one patch to try already. One I'm assuming nobody aside 
from me even applied, as of now.

> feel free to push a feature branch with your proposed
> changes, or even install them as optional features on master, and
> let's compare the merits and demerits of each idea in practical use
> cases and on a variety of systems.
I will.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-07 18:27                                                                             ` Dmitry Gutov
@ 2022-08-07 18:38                                                                               ` Eli Zaretskii
  2022-08-12 10:47                                                                                 ` Dmitry Gutov
  0 siblings, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-07 18:38 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: 56682, gregory, monnier

> Date: Sun, 7 Aug 2022 21:27:21 +0300
> Cc: 56682@debbugs.gnu.org, gregory@heytings.org, monnier@iro.umontreal.ca
> From: Dmitry Gutov <dgutov@yandex.ru>
> 
> > feel free to push a feature branch with your proposed
> > changes, or even install them as optional features on master, and
> > let's compare the merits and demerits of each idea in practical use
> > cases and on a variety of systems.
> I will.

Thanks.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-07 17:40                                                             ` Dmitry Gutov
@ 2022-08-07 20:21                                                               ` Gregory Heytings
  2022-08-10  1:04                                                                 ` Dmitry Gutov
  0 siblings, 1 reply; 685+ messages in thread
From: Gregory Heytings @ 2022-08-07 20:21 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: 56682, Eli Zaretskii, monnier


>> No, isearch is entirely agnostic about font locking.
>
> I wonder where it spends those 2 seconds, then.
>

The answer is simple: it is not isearch that is slow, it's redisplay that 
is slowed down by font locking.

>> It's yet another test meant to test Emacs' responsiveness, and it is as 
>> "objective" as possible: does Emacs choke or does it not?
>
> It's not a test of font-lock's performance, however. Because it compares 
> that to a process that's internal to Emacs as well (moving across the 
> buffer with C-v). Like, the faster we're able to make the latter 
> command, the faster font-lock has to be to keep up. As an objective 
> test, it's not meaningful.
>

It is not by itself a test of font locking performance.  It becomes one 
when you compare it with what you see (a) when font locking is completely 
disabled, and (b) when font locking is enabled by constrained by a locked 
narrowing.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-07 17:41                                                           ` Dmitry Gutov
@ 2022-08-09 21:03                                                             ` Gregory Heytings
  0 siblings, 0 replies; 685+ messages in thread
From: Gregory Heytings @ 2022-08-09 21:03 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: 56682, Eli Zaretskii, monnier


>> Anyway, could you please try the combined patch I posted recently 
>> together with dictionary.json?
>> 
>> https://debbugs.gnu.org/cgi/bugreport.cgi?bug=56682#1084
>
> Gregory, could you do this?
>
> And report on how your own responsiveness metrics hold up after that.
>

Now done, see my reply on emacs-devel.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-07 20:21                                                               ` Gregory Heytings
@ 2022-08-10  1:04                                                                 ` Dmitry Gutov
  2022-08-10  7:47                                                                   ` Gregory Heytings
  0 siblings, 1 reply; 685+ messages in thread
From: Dmitry Gutov @ 2022-08-10  1:04 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, Eli Zaretskii, monnier

On 07.08.2022 23:21, Gregory Heytings wrote:
> 
>>> No, isearch is entirely agnostic about font locking.
>>
>> I wonder where it spends those 2 seconds, then.
>>
> 
> The answer is simple: it is not isearch that is slow, it's redisplay 
> that is slowed down by font locking.

Turns out, that was true. Unexpectedly, there was an area near the 
beginning of that file where a particular matcher (that I have now 
removed in fcd2d14db1) slowed things down considerably. The effect was 
such that fontifying a particular screen was about as slow as fontifying 
the end of the buffer.

That might or might not be a general design bug in font-lock with its 
MATCH-ANCHORED syntax (when a line is long, the "anchored" thing might 
lose its meaning).

isearch looks fast again, you're welcome to try.

>>> It's yet another test meant to test Emacs' responsiveness, and it is 
>>> as "objective" as possible: does Emacs choke or does it not?
>>
>> It's not a test of font-lock's performance, however. Because it 
>> compares that to a process that's internal to Emacs as well (moving 
>> across the buffer with C-v). Like, the faster we're able to make the 
>> latter command, the faster font-lock has to be to keep up. As an 
>> objective test, it's not meaningful.
>>
> 
> It is not by itself a test of font locking performance.  It becomes one 
> when you compare it with what you see (a) when font locking is 
> completely disabled, and (b) when font locking is enabled by constrained 
> by a locked narrowing.

What do you get from that comparison? That one thing is faster than the 
other? That accurate font-lock might take a little more time?

In any case, when I floor 'C-v' in dictionary.json now, whether 
narrowing is applied in 'handle_fontified_prop' or not, I see the buffer 
stutter around 2%, then go on and freeze around the 9% mark. When I 
release 'C-v' after waiting a while, it ends up at 12% or 14%.

Or if I go to EOB and floor 'M-v', both versions freeze almost right 
away. So it doesn't look like one is an order of a magnitude faster than 
the other, or at least not anymore.

C-n and C-p are also pretty sluggish with both versions.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-10  1:04                                                                 ` Dmitry Gutov
@ 2022-08-10  7:47                                                                   ` Gregory Heytings
  2022-08-10  8:48                                                                     ` Stephen Berman
  0 siblings, 1 reply; 685+ messages in thread
From: Gregory Heytings @ 2022-08-10  7:47 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: 56682, Eli Zaretskii, monnier


>
> In any case, when I floor 'C-v' in dictionary.json now, whether 
> narrowing is applied in 'handle_fontified_prop' or not, I see the buffer 
> stutter around 2%, then go on and freeze around the 9% mark. When I 
> release 'C-v' after waiting a while, it ends up at 12% or 14%.
>
> Or if I go to EOB and floor 'M-v', both versions freeze almost right 
> away. So it doesn't look like one is an order of a magnitude faster than 
> the other, or at least not anymore.
>
> C-n and C-p are also pretty sluggish with both versions.
>

You must be doing something wrong in your tests.  You have a faster 
computer than mine, and on my computer, with emacs -Q, neither C-v nor M-v 
nor C-n nor C-p are sluggish.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-10  7:47                                                                   ` Gregory Heytings
@ 2022-08-10  8:48                                                                     ` Stephen Berman
  2022-08-10  8:59                                                                       ` Gregory Heytings
  0 siblings, 1 reply; 685+ messages in thread
From: Stephen Berman @ 2022-08-10  8:48 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, Eli Zaretskii, monnier, Dmitry Gutov

On Wed, 10 Aug 2022 07:47:44 +0000 Gregory Heytings <gregory@heytings.org> wrote:

>>
>> In any case, when I floor 'C-v' in dictionary.json now, whether narrowing is
>> applied in 'handle_fontified_prop' or not, I see the buffer stutter around
>> 2%, then go on and freeze around the 9% mark. When I release 'C-v' after
>> waiting a while, it ends up at 12% or 14%.
>>
>> Or if I go to EOB and floor 'M-v', both versions freeze almost right
>> away. So it doesn't look like one is an order of a magnitude faster than the
>> other, or at least not anymore.
>>
>> C-n and C-p are also pretty sluggish with both versions.
>>
>
> You must be doing something wrong in your tests.  You have a faster computer
> than mine, and on my computer, with emacs -Q, neither C-v nor M-v nor C-n nor
> C-p are sluggish.

When I visit addons.json (from my Firefox directory), which is a single
line of (only) 19540 characters, and type `C-n' and hold down both keys,
the cursor stops moving almost immediately (on the third visual line)
and after letting go of the keys and waiting several seconds, point
jumps down the buffer to its actual position; likewise with `C-p'.  This
is on master with -Q, and is no different from Emacs 28 (the only
difference I notice is that in master the buffer is wrongly fontified
from position 8235 to the end, while in 28 the entire buffer is
correctly fontified).  Is this expected?  (When I enable so-long-mode in
the buffer, holding down `C-n' or `C-p' produces no delay, both in
master and 28.)

Steve Berman





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-10  8:48                                                                     ` Stephen Berman
@ 2022-08-10  8:59                                                                       ` Gregory Heytings
  2022-08-10  9:04                                                                         ` Gregory Heytings
  0 siblings, 1 reply; 685+ messages in thread
From: Gregory Heytings @ 2022-08-10  8:59 UTC (permalink / raw)
  To: Stephen Berman; +Cc: 56682, Eli Zaretskii, monnier, Dmitry Gutov


>
> When I visit addons.json (from my Firefox directory), which is a single 
> line of (only) 19540 characters, and type `C-n' and hold down both keys, 
> the cursor stops moving almost immediately (on the third visual line) 
> and after letting go of the keys and waiting several seconds, point 
> jumps down the buffer to its actual position; likewise with `C-p'. 
> This is on master with -Q, and is no different from Emacs 28 (the only 
> difference I notice is that in master the buffer is wrongly fontified 
> from position 8235 to the end, while in 28 the entire buffer is 
> correctly fontified).  Is this expected?  (When I enable so-long-mode in 
> the buffer, holding down `C-n' or `C-p' produces no delay, both in 
> master and 28.)
>

That's not expected, no, and rather surprising because it would contradict 
what we've seen so far.  Can you post that file somewhere?  The only 
possible reason I can see ATM is that the file contains Arabic characters, 
which are (and will remain) slow.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-10  8:59                                                                       ` Gregory Heytings
@ 2022-08-10  9:04                                                                         ` Gregory Heytings
  2022-08-10  9:35                                                                           ` Stephen Berman
  0 siblings, 1 reply; 685+ messages in thread
From: Gregory Heytings @ 2022-08-10  9:04 UTC (permalink / raw)
  To: Stephen Berman; +Cc: 56682, Eli Zaretskii, monnier, Dmitry Gutov


>> When I visit addons.json (from my Firefox directory), which is a single 
>> line of (only) 19540 characters, and type `C-n' and hold down both 
>> keys, the cursor stops moving almost immediately (on the third visual 
>> line) and after letting go of the keys and waiting several seconds, 
>> point jumps down the buffer to its actual position; likewise with 
>> `C-p'. This is on master with -Q, and is no different from Emacs 28 
>> (the only difference I notice is that in master the buffer is wrongly 
>> fontified from position 8235 to the end, while in 28 the entire buffer 
>> is correctly fontified).  Is this expected?  (When I enable 
>> so-long-mode in the buffer, holding down `C-n' or `C-p' produces no 
>> delay, both in master and 28.)
>
> That's not expected, no, and rather surprising because it would 
> contradict what we've seen so far.  Can you post that file somewhere? 
> The only possible reason I can see ATM is that the file contains Arabic 
> characters, which are (and will remain) slow.
>

I forgot to mention: did you try after disabling show-paren-mode?  It is 
known to slow down redisplay at the beginning and end of the buffer, and 
will eventually be automatically turned off in these buffers.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-10  9:04                                                                         ` Gregory Heytings
@ 2022-08-10  9:35                                                                           ` Stephen Berman
  2022-08-10 10:34                                                                             ` Gregory Heytings
  0 siblings, 1 reply; 685+ messages in thread
From: Stephen Berman @ 2022-08-10  9:35 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, Eli Zaretskii, monnier, Dmitry Gutov

[-- Attachment #1: Type: text/plain, Size: 1644 bytes --]

On Wed, 10 Aug 2022 09:04:06 +0000 Gregory Heytings <gregory@heytings.org> wrote:

>>> When I visit addons.json (from my Firefox directory), which is a single
>>> line of (only) 19540 characters, and type `C-n' and hold down both keys,
>>> the cursor stops moving almost immediately (on the third visual line) and
>>> after letting go of the keys and waiting several seconds, point jumps down
>>> the buffer to its actual position; likewise with `C-p'. This is on master
>>> with -Q, and is no different from Emacs 28 (the only difference I notice is
>>> that in master the buffer is wrongly fontified from position 8235 to the
>>> end, while in 28 the entire buffer is correctly fontified).  Is this
>>> expected?  (When I enable so-long-mode in the buffer, holding down `C-n' or
>>> `C-p' produces no delay, both in master and 28.)
>>
>> That's not expected, no, and rather surprising because it would contradict
>> what we've seen so far.  Can you post that file somewhere? 

It contains nothing particularly personal, so I've attached it.

>>                                                            The only possible
>> reason I can see ATM is that the file contains Arabic characters, which are
>> (and will remain) slow.

No Arabic and only four non-ASCII characters (three occurrences of `’'
and one of `É').

> I forgot to mention: did you try after disabling show-paren-mode?  It is known
> to slow down redisplay at the beginning and end of the buffer, and will
> eventually be automatically turned off in these buffers.

Disabling show-paren-mode makes no noticeable difference.

Steve Berman


[-- Attachment #2: addons.json --]
[-- Type: application/octet-stream, Size: 19547 bytes --]

{"schema":6,"addons":[{"id":"uBlock0@raymondhill.net","icons":{"32":"https://addons.mozilla.org/user-media/addon_icons/607/607454-32.png?modified=mcrushed","64":"https://addons.mozilla.org/user-media/addon_icons/607/607454-64.png?modified=mcrushed","128":"https://addons.mozilla.org/user-media/addon_icons/607/607454-128.png?modified=mcrushed"},"name":"uBlock Origin","version":"1.43.0","sourceURI":"https://addons.mozilla.org/firefox/downloads/file/3961087/ublock_origin-1.43.0.xpi","homepageURL":"https://github.com/gorhill/uBlock#ublock-origin","supportURL":"https://old.reddit.com/r/uBlockOrigin/","description":"Finally, an efficient wide-spectrum content blocker. Easy on CPU and memory.","fullDescription":"uBlock Origin is not an \"ad blocker\", it's a wide-spectrum content blocker with CPU and memory efficiency as a primary feature.\n\n***\n\nOut of the box, uBO blocks ads, trackers, coin miners, popups, etc. through the following lists of filters, enabled by default:\n\n- EasyList (ads)\n- EasyPrivacy (tracking)\n- Peter Lowe’s Ad server list (ads and tracking)\n- Online Malicious URL Blocklist\n- uBO's own lists\n\nMore lists are available for you to select if you wish:\n\n- EasyList Cookie\n- Fanboy Annoyances\n- AdGuard Annoyances\n- Dan Pollock’s hosts file\n- And many others\n\nAdditionally, you can point-and-click to block JavaScript locally or globally, create your own global or local rules to override entries from filter lists, and many more advanced features.\n\n***\n\nFree.\nOpen source with public license (GPLv3)\nFor users by users.\n\nIf ever you really do want to contribute something, think about the people working hard to maintain the filter lists you are using, which were made available to use by all for free.\n\n***\n\n    Documentation\n    Release notes\n    Community support @ Reddit\n    Contributors @ GitHub\n    Contributors @ Crowdin","weeklyDownloads":122583,"type":"extension","creator":{"name":"Raymond Hill","url":"https://addons.mozilla.org/en-US/firefox/user/11423598/"},"developers":[],"screenshots":[{"url":"https://addons.mozilla.org/user-media/previews/full/238/238546.png?modified=1622132421","width":1011,"height":758,"thumbnailURL":"https://addons.mozilla.org/user-media/previews/thumbs/238/238546.jpg?modified=1622132421","thumbnailWidth":533,"thumbnailHeight":400,"caption":"The popup panel: default mode"},{"url":"https://addons.mozilla.org/user-media/previews/full/238/238548.png?modified=1622132423","width":1011,"height":758,"thumbnailURL":"https://addons.mozilla.org/user-media/previews/thumbs/238/238548.jpg?modified=1622132423","thumbnailWidth":533,"thumbnailHeight":400,"caption":"The dashboard: stock filter lists"},{"url":"https://addons.mozilla.org/user-media/previews/full/238/238547.png?modified=1622132425","width":1011,"height":758,"thumbnailURL":"https://addons.mozilla.org/user-media/previews/thumbs/238/238547.jpg?modified=1622132425","thumbnailWidth":533,"thumbnailHeight":400,"caption":"The popup panel: default-deny mode"},{"url":"https://addons.mozilla.org/user-media/previews/full/238/238549.png?modified=1622132426","width":1011,"height":758,"thumbnailURL":"https://addons.mozilla.org/user-media/previews/thumbs/238/238549.jpg?modified=1622132426","thumbnailWidth":533,"thumbnailHeight":400,"caption":"The dashboard: settings"},{"url":"https://addons.mozilla.org/user-media/previews/full/238/238552.png?modified=1622132430","width":970,"height":1800,"thumbnailURL":"https://addons.mozilla.org/user-media/previews/thumbs/238/238552.jpg?modified=1622132430","thumbnailWidth":216,"thumbnailHeight":400,"caption":"The popup panel in Firefox Preview: default mode with more blocking options revealed"},{"url":"https://addons.mozilla.org/user-media/previews/full/230/230370.png?modified=1622132432","width":800,"height":600,"thumbnailURL":"https://addons.mozilla.org/user-media/previews/thumbs/230/230370.jpg?modified=1622132432","thumbnailWidth":533,"thumbnailHeight":400,"caption":"The unified logger tells you all that uBO is seeing and doing"}],"contributionURL":"","averageRating":4.7731,"reviewCount":3675,"reviewURL":"https://addons.mozilla.org/en-US/firefox/addon/ublock-origin/reviews/","updateDate":1659988217000},{"id":"addon@darkreader.org","icons":{"32":"https://addons.mozilla.org/user-media/addon_icons/855/855413-32.png?modified=3f34e276","64":"https://addons.mozilla.org/user-media/addon_icons/855/855413-64.png?modified=3f34e276","128":"https://addons.mozilla.org/user-media/addon_icons/855/855413-128.png?modified=3f34e276"},"name":"Dark Reader","version":"4.9.52","sourceURI":"https://addons.mozilla.org/firefox/downloads/file/3968561/darkreader-4.9.52.xpi","homepageURL":"https://darkreader.org/","supportURL":"https://github.com/darkreader/darkreader","description":"Dark mode for every website. Take care of your eyes, use dark theme for night and daily browsing.","fullDescription":"This eye-care extension enables night mode creating dark themes for websites on the fly. Dark Reader inverts bright colors making them high contrast and easy to read at night.\n\nYou can adjust brightness, contrast, sepia filter, dark mode, font settings and ignore-list.\n\nDark Reader doesn't show ads and doesn't send user's data anywhere. It is fully open-source https://github.com/darkreader/darkreader\n\nBefore you install disable similar extensions. Enjoy watching!","weeklyDownloads":20979,"type":"extension","creator":{"name":"Alexander Shutau","url":"https://addons.mozilla.org/en-US/firefox/user/13299734/"},"developers":[],"screenshots":[{"url":"https://addons.mozilla.org/user-media/previews/full/201/201069.png?modified=1638883247","width":2400,"height":1500,"thumbnailURL":"https://addons.mozilla.org/user-media/previews/thumbs/201/201069.jpg?modified=1638883247","thumbnailWidth":533,"thumbnailHeight":333,"caption":"Dark Reader night theme mode"},{"url":"https://addons.mozilla.org/user-media/previews/full/201/201070.png?modified=1638883247","width":2400,"height":1500,"thumbnailURL":"https://addons.mozilla.org/user-media/previews/thumbs/201/201070.jpg?modified=1638883247","thumbnailWidth":533,"thumbnailHeight":333,"caption":"Dark Reader filter settings"}],"contributionURL":"https://opencollective.com/darkreader?utm_content=product-page-contribute&utm_medium=referral&utm_source=addons.mozilla.org","averageRating":4.5528,"reviewCount":1454,"reviewURL":"https://addons.mozilla.org/en-US/firefox/addon/darkreader/reviews/","updateDate":1656418435000},{"id":"{5384767E-00D9-40E9-B72F-9CC39D655D6F}","icons":{"32":"https://addons.mozilla.org/user-media/addon_icons/45/45281-32.png?modified=mcrushed","64":"https://addons.mozilla.org/user-media/addon_icons/45/45281-64.png?modified=mcrushed","128":"https://addons.mozilla.org/user-media/addon_icons/45/45281-128.png?modified=mcrushed"},"name":"EPUBReader","version":"2.0.13","sourceURI":"https://addons.mozilla.org/firefox/downloads/file/3594370/epubreader-2.0.13.xpi","homepageURL":"https://www.epubread.com/","supportURL":"https://www.epubread.com/","description":"Read ePub files right in Firefox. No additional software needed!","fullDescription":"Avoid annoying download prompts and easily read ePub files directly in Firefox. Conveniently access previously saved ePub files right from the toolbar button.\n\nListen to your eBooks by installing the Read Aloud extension!\n\nThe requested permissions are needed so EPUBReader can download and open epub files directly from websites and save them.\n\nIf you experience any problems or issues, please let me know through my support site. I'll be very happy to help you!","weeklyDownloads":1543,"type":"extension","creator":{"name":"epubreader","url":"https://addons.mozilla.org/en-US/firefox/user/4960765/"},"developers":[],"screenshots":[{"url":"https://addons.mozilla.org/user-media/previews/full/184/184970.png?modified=1622132570","width":700,"height":525,"thumbnailURL":"https://addons.mozilla.org/user-media/previews/thumbs/184/184970.jpg?modified=1622132570","thumbnailWidth":533,"thumbnailHeight":400,"caption":"Adventures of Captain Hatteras opened in EPUBReader"},{"url":"https://addons.mozilla.org/user-media/previews/full/184/184972.png?modified=1622132570","width":700,"height":525,"thumbnailURL":"https://addons.mozilla.org/user-media/previews/thumbs/184/184972.jpg?modified=1622132570","thumbnailWidth":533,"thumbnailHeight":400,"caption":"Table of contents"},{"url":"https://addons.mozilla.org/user-media/previews/full/184/184973.png?modified=1622132570","width":700,"height":525,"thumbnailURL":"https://addons.mozilla.org/user-media/previews/thumbs/184/184973.jpg?modified=1622132570","thumbnailWidth":533,"thumbnailHeight":400,"caption":"Preferences"},{"url":"https://addons.mozilla.org/user-media/previews/full/184/184971.png?modified=1622132570","width":700,"height":525,"thumbnailURL":"https://addons.mozilla.org/user-media/previews/thumbs/184/184971.jpg?modified=1622132570","thumbnailWidth":533,"thumbnailHeight":400,"caption":"Toolbar"}],"contributionURL":"","averageRating":3.7266,"reviewCount":110,"reviewURL":"https://addons.mozilla.org/en-US/firefox/addon/epubreader/reviews/","updateDate":1592832627000},{"id":"jid1-KtlZuoiikVfFew@jetpack","icons":{"32":"https://addons.mozilla.org/user-media/addon_icons/350/350590-32.png?modified=1637253033","64":"https://addons.mozilla.org/user-media/addon_icons/350/350590-64.png?modified=1637253033","128":"https://addons.mozilla.org/user-media/addon_icons/350/350590-128.png?modified=1637253033"},"name":"GNU LibreJS","version":"7.21.0","sourceURI":"https://addons.mozilla.org/firefox/downloads/file/3978554/librejs-7.21.0.xpi","homepageURL":"https://www.gnu.org/software/librejs/","supportURL":"https://gnu.org/software/librejs","description":"GNU LibreJS aims to address the JavaScript problem described in Richard Stallman's article The JavaScript Trap. It is a free add-on for Mozilla browsers. It blocks nonfree nontrivial JavaScript while allowing JavaScript that is free and/or trivial.","fullDescription":"GNU LibreJS --an add-on for GNU IceCat and Mozilla Firefox-- detects and blocks nonfree nontrivial JavaScript while allowing its execution on pages containing code that is either trivial and/or free.\n\nMany websites run nontrivial JavaScript on your computer. Some use it for complex tasks; many use it gratuitously for minor jobs that could be done easily with plain HTML. Sometimes this JavaScript code is malicious. Either way, the JavaScript code is often nonfree. For explanation of the issue, see The JavaScript Trap.\n\nIf you care about freedom in your computing, and don't wish to let all and sundry make you run nonfree programs, now you can prevent it by using LibreJS.","weeklyDownloads":25,"type":"extension","creator":{"name":"Loic J. Duros","url":"https://addons.mozilla.org/en-US/firefox/user/5942745/"},"developers":[{"name":"nnyby","url":"https://addons.mozilla.org/en-US/firefox/user/11079870/"},{"name":"Ruben Rodriguez","url":"https://addons.mozilla.org/en-US/firefox/user/11729378/"},{"name":"NateN1222","url":"https://addons.mozilla.org/en-US/firefox/user/12985142/"},{"name":"Firefox user 13499009","url":"https://addons.mozilla.org/en-US/firefox/user/13499009/"},{"name":"Yuchen Pei","url":"https://addons.mozilla.org/en-US/firefox/user/17132119/"}],"screenshots":[{"url":"https://addons.mozilla.org/user-media/previews/full/202/202329.png?modified=1622132158","width":1152,"height":557,"thumbnailURL":"https://addons.mozilla.org/user-media/previews/thumbs/202/202329.jpg?modified=1622132158","thumbnailWidth":533,"thumbnailHeight":258,"caption":"LibreJS showing the panel on a page with free JavaScript."}],"contributionURL":"","averageRating":4.25,"reviewCount":15,"reviewURL":"https://addons.mozilla.org/en-US/firefox/addon/librejs/reviews/","updateDate":1658394623000},{"id":"kkb-ext@fairlyterrible.name","icons":{"32":"https://addons.mozilla.org/user-media/addon_icons/980/980765-32.png?modified=2a69a5c9","64":"https://addons.mozilla.org/user-media/addon_icons/980/980765-64.png?modified=2a69a5c9","128":"https://addons.mozilla.org/user-media/addon_icons/980/980765-128.png?modified=2a69a5c9"},"name":"Keyboard Browsing","version":"1.2.0","sourceURI":"https://addons.mozilla.org/firefox/downloads/file/982967/keyboard_browsing-1.2.0.xpi","homepageURL":"https://github.com/potockyt/kbb-ext","supportURL":"https://github.com/potockyt/kbb-ext/issues","description":"Adds numbered navigation markers to a page.","fullDescription":null,"weeklyDownloads":1,"type":"extension","creator":{"name":"Tomas Potocky","url":"https://addons.mozilla.org/en-US/firefox/user/13580917/"},"developers":[],"screenshots":[{"url":"https://addons.mozilla.org/user-media/previews/full/203/203729.png?modified=1622133059","width":1270,"height":1035,"thumbnailURL":"https://addons.mozilla.org/user-media/previews/thumbs/203/203729.jpg?modified=1622133059","thumbnailWidth":491,"thumbnailHeight":400,"caption":"Numbered navigation markers in action"}],"contributionURL":"","averageRating":5,"reviewCount":1,"reviewURL":"https://addons.mozilla.org/en-US/firefox/addon/keyboard-browsing/reviews/","updateDate":1528547706000},{"id":"@keyboardsurfing","icons":{"32":"https://addons.mozilla.org/user-media/addon_icons/701/701020-32.png?modified=1511914780","64":"https://addons.mozilla.org/user-media/addon_icons/701/701020-64.png?modified=1511914780","128":"https://addons.mozilla.org/user-media/addon_icons/701/701020-128.png?modified=1511914780"},"name":"Keyboard Surfing","version":"1.3.20","sourceURI":"https://addons.mozilla.org/firefox/downloads/file/555072/keyboard_surfing-1.3.20.xpi","homepageURL":null,"supportURL":null,"description":"Easy keyboard web browsing with computer assisted cursor home-in. Mouseless browsing. Smart cursor-based link selection, simple keyboard navigation, single-hand control, laptop friendly.","fullDescription":"Provides a keyboard-controlled cursor for navigating and browsing web pages. See the demonstration video.\n\nThe cursor can be moved to nearby links by pressing the up, down, left and right keys. The addon will select nearby links on the page intelligently.\n\nThree sets of keys are provided for controlling the cursor and the addon: the numpad set, the left-hand set and the right-hand set.\n\nAdditional functions include: smooth scrolling, open links in new tab and in new window, close windows and tabs, go to homepage.","weeklyDownloads":0,"type":"extension","creator":{"name":"Somnia","url":"https://addons.mozilla.org/en-US/firefox/user/12273604/"},"developers":[],"screenshots":[{"url":"https://addons.mozilla.org/user-media/previews/full/173/173840.png?modified=1622132423","width":700,"height":457,"thumbnailURL":"https://addons.mozilla.org/user-media/previews/thumbs/173/173840.jpg?modified=1622132423","thumbnailWidth":533,"thumbnailHeight":348,"caption":"Help Page"},{"url":"https://addons.mozilla.org/user-media/previews/full/173/173841.png?modified=1622132423","width":660,"height":525,"thumbnailURL":"https://addons.mozilla.org/user-media/previews/thumbs/173/173841.jpg?modified=1622132423","thumbnailWidth":503,"thumbnailHeight":400,"caption":"Preferences Page"}],"contributionURL":"","averageRating":4.6364,"reviewCount":8,"reviewURL":"https://addons.mozilla.org/en-US/firefox/addon/keyboard-surfing/reviews/","updateDate":1481927177000},{"id":"simple_hinting@umaneti.net","icons":{"32":"https://addons.mozilla.org/user-media/addon_icons/695/695684-32.png?modified=1630517684","64":"https://addons.mozilla.org/user-media/addon_icons/695/695684-64.png?modified=1630517684","128":"https://addons.mozilla.org/user-media/addon_icons/695/695684-128.png?modified=1630517684"},"name":"Simple Hinting","version":"0.5.4","sourceURI":"https://addons.mozilla.org/firefox/downloads/file/3812461/simple_hinting-0.5.4.xpi","homepageURL":"https://git.umaneti.net/simple_hinting/about/","supportURL":"https://git.umaneti.net/simple_hinting/about/","description":"Allow keyboard browsing through links hinting.","fullDescription":"This addon displays small green numbered labels next to the links of the current page when you press Alt + Shift + L.\n\nIf you enter one of the displayed numbers, followed by a special keycode, you'll be redirected to the link target, either directly or by opening a new window or tab.\n\nThe keycodes are the following:\n\n    f (follow), browse in current tab;\n    t (tab), open in a new tab;\n    w (window), open in a new window;\n    i (incognito) or p (private), open in a new private window (only if you’ve authorized this addons to run on private windows);\n    v (view), don't do anything, just display the target URL.\n\n\nAt any time, pressing c or Esc will cancel the link selection and remove all green labels.\n\nPrivacy\n\nThis addon try to protect your privacy by removing unwanted tracking parameters from the URL you are trying to go to. Another widespread privacy invading behavior consists by hiding real links behind a short link, which is responsible to track who click on which link, and when. In this later case, this addon call an external web service, which will expand a tiny URL, before removing its tracking parameters, if any. That is why this addon ask for the permission to contact unshorten.umaneti.net host.\n\nTo avoid asking too frequently to this same remote web service what to do about a link, this addon will download from it two lists:\n\n    a list of known tracking parameters, which will help it to remove them from already expanded URLs without having to contact the remote service;\n    a list of known shorten URL services, for which this addons must contact the remote web service to resolve and clean them.\n\n\nThis two lists are then stored in your web browser addons storage area (hence the permission to use it).\n\nThe source code of the previously mentioned external web service is available too.","weeklyDownloads":0,"type":"extension","creator":{"name":"Étienne Deparis","url":"https://addons.mozilla.org/en-US/firefox/user/162211/"},"developers":[],"screenshots":[{"url":"https://addons.mozilla.org/user-media/previews/full/172/172680.png?modified=1622132531","width":700,"height":351,"thumbnailURL":"https://addons.mozilla.org/user-media/previews/thumbs/172/172680.jpg?modified=1622132531","thumbnailWidth":533,"thumbnailHeight":267,"caption":"Hinting is activated and the user just press \"5\" to select \"firefox\" link"},{"url":"https://addons.mozilla.org/user-media/previews/full/196/196467.png?modified=1622132532","width":502,"height":525,"thumbnailURL":"https://addons.mozilla.org/user-media/previews/thumbs/196/196467.jpg?modified=1622132532","thumbnailWidth":382,"thumbnailHeight":400,"caption":"Context menu item"},{"url":"https://addons.mozilla.org/user-media/previews/full/196/196468.png?modified=1622132532","width":389,"height":392,"thumbnailURL":"https://addons.mozilla.org/user-media/previews/thumbs/196/196468.jpg?modified=1622132532","thumbnailWidth":389,"thumbnailHeight":392},{"url":"https://addons.mozilla.org/user-media/previews/full/196/196469.png?modified=1622132532","width":380,"height":358,"thumbnailURL":"https://addons.mozilla.org/user-media/previews/thumbs/196/196469.jpg?modified=1622132532","thumbnailWidth":380,"thumbnailHeight":358,"caption":"The link is expanded and clean"}],"contributionURL":"https://paypal.me/milouse?utm_content=product-page-contribute&utm_medium=referral&utm_source=addons.mozilla.org","averageRating":2.5,"reviewCount":1,"reviewURL":"https://addons.mozilla.org/en-US/firefox/addon/simple-hinting/reviews/","updateDate":1626715250000}]}

^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-10  9:35                                                                           ` Stephen Berman
@ 2022-08-10 10:34                                                                             ` Gregory Heytings
  2022-08-10 10:55                                                                               ` Stephen Berman
  2022-08-10 11:44                                                                               ` Eli Zaretskii
  0 siblings, 2 replies; 685+ messages in thread
From: Gregory Heytings @ 2022-08-10 10:34 UTC (permalink / raw)
  To: Stephen Berman; +Cc: 56682, Eli Zaretskii, monnier, Dmitry Gutov


>> That's not expected, no, and rather surprising because it would 
>> contradict what we've seen so far.  Can you post that file somewhere?
>
> It contains nothing particularly personal, so I've attached it.
>

Thanks.  A last question: what CPU does your computer use?  I do see a 
(very slight) stuttering here, certainly not "several seconds".

Anyway, this file is too small for you to see the effect/benefits of long 
line optimizations.  The cause of the delays you see is the "Bidirectional 
Parentheses Algorithm" which is used by Emacs, and which you can disable 
by setting bidi-inhibit-bpa to t.  It makes C-n and C-p an order of 
magnitude slower in that file.  On my computer and in that file, they take 
50 ms with bidi-inhibit-bpa nil and 5 ms with bidi-inhibit-bpa t.  So far 
I don't think these delays are annoying enough to disable that algorithm 
by default in files with long lines.  Another option might be to add some 
limits to the algorithm in buffers with long lines, without disabling it 
completely.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-10 10:34                                                                             ` Gregory Heytings
@ 2022-08-10 10:55                                                                               ` Stephen Berman
  2022-08-10 11:54                                                                                 ` Dmitry Gutov
  2022-08-10 11:44                                                                               ` Eli Zaretskii
  1 sibling, 1 reply; 685+ messages in thread
From: Stephen Berman @ 2022-08-10 10:55 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, Eli Zaretskii, monnier, Dmitry Gutov

On Wed, 10 Aug 2022 10:34:32 +0000 Gregory Heytings <gregory@heytings.org> wrote:

>>> That's not expected, no, and rather surprising because it would contradict
>>> what we've seen so far.  Can you post that file somewhere?
>>
>> It contains nothing particularly personal, so I've attached it.
>>
>
> Thanks.  A last question: what CPU does your computer use?  I do see a (very
> slight) stuttering here, certainly not "several seconds".

i7-8700 CPU @ 3.20GHz with 6 cores (12 processors).  (It's somewhat
throttled due to Meltdown and Spectre mitigations.)

> Anyway, this file is too small for you to see the effect/benefits of long line
> optimizations.  The cause of the delays you see is the "Bidirectional
> Parentheses Algorithm" which is used by Emacs, and which you can disable by
> setting bidi-inhibit-bpa to t.  It makes C-n and C-p an order of magnitude
> slower in that file.  On my computer and in that file, they take 50 ms with
> bidi-inhibit-bpa nil and 5 ms with bidi-inhibit-bpa t.  So far I don't think
> these delays are annoying enough to disable that algorithm by default in files
> with long lines.  Another option might be to add some limits to the algorithm
> in buffers with long lines, without disabling it completely.

Indeed, setting bidi-inhibit-bpa to t eliminates the delay.  Thanks.

Steve Berman





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-10 10:34                                                                             ` Gregory Heytings
  2022-08-10 10:55                                                                               ` Stephen Berman
@ 2022-08-10 11:44                                                                               ` Eli Zaretskii
  2022-08-10 11:59                                                                                 ` Stephen Berman
  2022-08-10 12:31                                                                                 ` Gregory Heytings
  1 sibling, 2 replies; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-10 11:44 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, stephen.berman, monnier, dgutov

> Date: Wed, 10 Aug 2022 10:34:32 +0000
> From: Gregory Heytings <gregory@heytings.org>
> cc: 56682@debbugs.gnu.org, Eli Zaretskii <eliz@gnu.org>, 
>     monnier@iro.umontreal.ca, Dmitry Gutov <dgutov@yandex.ru>
> 
> Another option might be to add some limits to the algorithm in
> buffers with long lines, without disabling it completely.

It already has such limits and other optimizations.  Inhibiting the
BPA is an option if it is known that the buffer doesn't include ant
R2L characters anywhere; otherwise some braces/parens could be
displayed incorrectly mirrored.

If you remove the 3 closing braces/brackets at EOB and the
corresponding opening braces/brackets, does navigation become
significantly faster?  These are the only brackets I could spot in the
file that enclose very large portions of text.  If removing them
doesn't help much, the only possible reason is that there are a lot of
bracketed stuff in this file.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-10 10:55                                                                               ` Stephen Berman
@ 2022-08-10 11:54                                                                                 ` Dmitry Gutov
  2022-08-10 12:04                                                                                   ` Eli Zaretskii
  0 siblings, 1 reply; 685+ messages in thread
From: Dmitry Gutov @ 2022-08-10 11:54 UTC (permalink / raw)
  To: Stephen Berman, Gregory Heytings; +Cc: 56682, Eli Zaretskii, monnier

On 10.08.2022 13:55, Stephen Berman wrote:
> Indeed, setting bidi-inhibit-bpa to t eliminates the delay.  Thanks.

Same here.

And the "faster computer" didn't help, apparently.

After flooring 'C-n', I even had to 'C-g' out of it for Emacs to regain 
responsiveness, because waiting for a while didn't help.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-10 11:44                                                                               ` Eli Zaretskii
@ 2022-08-10 11:59                                                                                 ` Stephen Berman
  2022-08-10 12:16                                                                                   ` Eli Zaretskii
  2022-08-10 12:31                                                                                 ` Gregory Heytings
  1 sibling, 1 reply; 685+ messages in thread
From: Stephen Berman @ 2022-08-10 11:59 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, Gregory Heytings, monnier, dgutov

On Wed, 10 Aug 2022 14:44:59 +0300 Eli Zaretskii <eliz@gnu.org> wrote:

>> Date: Wed, 10 Aug 2022 10:34:32 +0000
>> From: Gregory Heytings <gregory@heytings.org>
>> cc: 56682@debbugs.gnu.org, Eli Zaretskii <eliz@gnu.org>,
>>     monnier@iro.umontreal.ca, Dmitry Gutov <dgutov@yandex.ru>
>>
>> Another option might be to add some limits to the algorithm in
>> buffers with long lines, without disabling it completely.
>
> It already has such limits and other optimizations.  Inhibiting the
> BPA is an option if it is known that the buffer doesn't include ant
> R2L characters anywhere; otherwise some braces/parens could be
> displayed incorrectly mirrored.
>
> If you remove the 3 closing braces/brackets at EOB and the
> corresponding opening braces/brackets, does navigation become
> significantly faster?

After removing those brackets, holding down `C-n' or `C-p' does seem a
bit faster with bidi-inhibit-bpa nil, but not anywhere near as fast as
with bidi-inhibit-bpa non-nil.

>                        These are the only brackets I could spot in the
> file that enclose very large portions of text.  If removing them
> doesn't help much, the only possible reason is that there are a lot of
> bracketed stuff in this file.

I suppose so, though I guess this is a pretty typical one-line JSON
file.

Steve Berman





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-10 11:54                                                                                 ` Dmitry Gutov
@ 2022-08-10 12:04                                                                                   ` Eli Zaretskii
  2022-08-10 12:28                                                                                     ` Dmitry Gutov
  0 siblings, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-10 12:04 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: 56682, gregory, stephen.berman, monnier

> Date: Wed, 10 Aug 2022 14:54:51 +0300
> Cc: 56682@debbugs.gnu.org, Eli Zaretskii <eliz@gnu.org>,
>  monnier@iro.umontreal.ca
> From: Dmitry Gutov <dgutov@yandex.ru>
> 
> On 10.08.2022 13:55, Stephen Berman wrote:
> > Indeed, setting bidi-inhibit-bpa to t eliminates the delay.  Thanks.
> 
> Same here.
> 
> And the "faster computer" didn't help, apparently.
> 
> After flooring 'C-n', I even had to 'C-g' out of it for Emacs to regain 
> responsiveness, because waiting for a while didn't help.

That's strange, because on my "slower" computer I didn't see anything
like that.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-10 11:59                                                                                 ` Stephen Berman
@ 2022-08-10 12:16                                                                                   ` Eli Zaretskii
  0 siblings, 0 replies; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-10 12:16 UTC (permalink / raw)
  To: Stephen Berman; +Cc: 56682, gregory, monnier, dgutov

> From: Stephen Berman <stephen.berman@gmx.net>
> Cc: Gregory Heytings <gregory@heytings.org>,  56682@debbugs.gnu.org,
>   monnier@iro.umontreal.ca,  dgutov@yandex.ru
> Date: Wed, 10 Aug 2022 13:59:45 +0200
> 
> >                        These are the only brackets I could spot in the
> > file that enclose very large portions of text.  If removing them
> > doesn't help much, the only possible reason is that there are a lot of
> > bracketed stuff in this file.
> 
> I suppose so, though I guess this is a pretty typical one-line JSON
> file.

I think it's quite unique in that its bracketed segments are very
long.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-10 12:04                                                                                   ` Eli Zaretskii
@ 2022-08-10 12:28                                                                                     ` Dmitry Gutov
  0 siblings, 0 replies; 685+ messages in thread
From: Dmitry Gutov @ 2022-08-10 12:28 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, gregory, stephen.berman, monnier

On 10.08.2022 15:04, Eli Zaretskii wrote:
>> Date: Wed, 10 Aug 2022 14:54:51 +0300
>> Cc:56682@debbugs.gnu.org, Eli Zaretskii<eliz@gnu.org>,
>>   monnier@iro.umontreal.ca
>> From: Dmitry Gutov<dgutov@yandex.ru>
>>
>> On 10.08.2022 13:55, Stephen Berman wrote:
>>> Indeed, setting bidi-inhibit-bpa to t eliminates the delay.  Thanks.
>> Same here.
>>
>> And the "faster computer" didn't help, apparently.
>>
>> After flooring 'C-n', I even had to 'C-g' out of it for Emacs to regain
>> responsiveness, because waiting for a while didn't help.
> That's strange, because on my "slower" computer I didn't see anything
> like that.

I think that just confirms what I said: the test "floor the button and 
see of UI freezes" is not a good one because it doesn't work against any 
objective numbers. It compares the speed of command execution with the 
speed of redisplay, and there is no backpressure mechanism.

If the "faster computer" executes the commands faster as well, it can 
likewise enter the unresponsive state.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-10 11:44                                                                               ` Eli Zaretskii
  2022-08-10 11:59                                                                                 ` Stephen Berman
@ 2022-08-10 12:31                                                                                 ` Gregory Heytings
  2022-08-10 12:43                                                                                   ` Eli Zaretskii
  1 sibling, 1 reply; 685+ messages in thread
From: Gregory Heytings @ 2022-08-10 12:31 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, stephen.berman, monnier, dgutov


>> Another option might be to add some limits to the algorithm in buffers 
>> with long lines, without disabling it completely.
>
> It already has such limits and other optimizations.
>

Yes, I meant making them a bit lower in such cases.

>
> Inhibiting the BPA is an option if it is known that the buffer doesn't 
> include ant R2L characters anywhere; otherwise some braces/parens could 
> be displayed incorrectly mirrored.
>

But is there an efficient way to determine if that the buffer doesn't 
include any R2L characters?

>
> If you remove the 3 closing braces/brackets at EOB and the corresponding 
> opening braces/brackets, does navigation become significantly faster?
>

Yes, removing the 3 brackets at positions 1, 22, 23 and 19538, 19539 and 
19540 solves that problem.  In fact, just removing the brackets at 1, 22 
and 23 solves that problem.  You can see the same problem in 
dictionary.json, just removing the first character makes C-n and C-p 
faster at BOB.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-10 12:31                                                                                 ` Gregory Heytings
@ 2022-08-10 12:43                                                                                   ` Eli Zaretskii
  2022-08-10 12:48                                                                                     ` Gregory Heytings
  2022-08-10 15:44                                                                                     ` Dmitry Gutov
  0 siblings, 2 replies; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-10 12:43 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, stephen.berman, monnier, dgutov

> Date: Wed, 10 Aug 2022 12:31:24 +0000
> From: Gregory Heytings <gregory@heytings.org>
> cc: 56682@debbugs.gnu.org, stephen.berman@gmx.net, monnier@iro.umontreal.ca, 
>     dgutov@yandex.ru
> 
> > Inhibiting the BPA is an option if it is known that the buffer doesn't 
> > include ant R2L characters anywhere; otherwise some braces/parens could 
> > be displayed incorrectly mirrored.
> 
> But is there an efficient way to determine if that the buffer doesn't 
> include any R2L characters?

Not without searching the buffer, not that I know of.  If the buffer
includes only ASCII characters (which this one doesn't), i.e. its
sizes in characters and bytes are identical, we could deduce that
there are no R2L characters without any heavy lifting.

> > If you remove the 3 closing braces/brackets at EOB and the corresponding 
> > opening braces/brackets, does navigation become significantly faster?
> 
> Yes, removing the 3 brackets at positions 1, 22, 23 and 19538, 19539 and 
> 19540 solves that problem.  In fact, just removing the brackets at 1, 22 
> and 23 solves that problem.  You can see the same problem in 
> dictionary.json, just removing the first character makes C-n and C-p 
> faster at BOB.

Stephen said it had a much smaller effect than inhibiting the BPA.
But yes, very long bracketed text segments could be a problem.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-10 12:43                                                                                   ` Eli Zaretskii
@ 2022-08-10 12:48                                                                                     ` Gregory Heytings
  2022-08-10 13:04                                                                                       ` Stephen Berman
  2022-08-10 15:44                                                                                     ` Dmitry Gutov
  1 sibling, 1 reply; 685+ messages in thread
From: Gregory Heytings @ 2022-08-10 12:48 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, stephen.berman, monnier, dgutov


>> But is there an efficient way to determine if that the buffer doesn't 
>> include any R2L characters?
>
> Not without searching the buffer, not that I know of.
>

Thanks, that's what I thought.

>>> If you remove the 3 closing braces/brackets at EOB and the 
>>> corresponding opening braces/brackets, does navigation become 
>>> significantly faster?
>>
>> Yes, removing the 3 brackets at positions 1, 22, 23 and 19538, 19539 
>> and 19540 solves that problem.  In fact, just removing the brackets at 
>> 1, 22 and 23 solves that problem.  You can see the same problem in 
>> dictionary.json, just removing the first character makes C-n and C-p 
>> faster at BOB.
>
> Stephen said it had a much smaller effect than inhibiting the BPA. But 
> yes, very long bracketed text segments could be a problem.
>

I'm not completely sure he did indeed remove those three brackets. 
Stephen, can you remove the three characters at positions 1, 22 and 23, 
and try again?  These are the first two '{' and the first '[' characters 
in the buffer.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-10 12:48                                                                                     ` Gregory Heytings
@ 2022-08-10 13:04                                                                                       ` Stephen Berman
  2022-08-10 13:11                                                                                         ` Gregory Heytings
  0 siblings, 1 reply; 685+ messages in thread
From: Stephen Berman @ 2022-08-10 13:04 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, Eli Zaretskii, monnier, dgutov

On Wed, 10 Aug 2022 12:48:49 +0000 Gregory Heytings <gregory@heytings.org> wrote:

>>>> If you remove the 3 closing braces/brackets at EOB and the corresponding
>>>> opening braces/brackets, does navigation become significantly faster?
>>>
>>> Yes, removing the 3 brackets at positions 1, 22, 23 and 19538, 19539 and
>>> 19540 solves that problem.  In fact, just removing the brackets at 1, 22
>>> and 23 solves that problem.  You can see the same problem in
>>> dictionary.json, just removing the first character makes C-n and C-p faster
>>> at BOB.
>>
>> Stephen said it had a much smaller effect than inhibiting the BPA. But yes,
>> very long bracketed text segments could be a problem.
>>
>
> I'm not completely sure he did indeed remove those three brackets. Stephen,
> can you remove the three characters at positions 1, 22 and 23, and try again?
> These are the first two '{' and the first '[' characters in the buffer.

I did remove those brackets previously; the improvement I see is that,
without them (and even without removing the corresponding closing
brackets at the end of the file, and of course with bidi-inhibit-bpa
nil), holding down `C-n' moves the cursor almost a whole screenful (~60
visual lines) before coming to a halt, instead of just three visual
lines with the initial brackets, and after letting go of `C-n', the
cursor catches up to the actual position of point noticeably quicker
than with the unaltered file.  Still, the movement is not at all smooth,
unlike with bidi-inhibit-bpa non-nil (and that is not as smooth as
moving through the same file with so-long-mode enabled).

Steve Berman





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-10 13:04                                                                                       ` Stephen Berman
@ 2022-08-10 13:11                                                                                         ` Gregory Heytings
  2022-08-10 13:29                                                                                           ` Stephen Berman
  0 siblings, 1 reply; 685+ messages in thread
From: Gregory Heytings @ 2022-08-10 13:11 UTC (permalink / raw)
  To: Stephen Berman; +Cc: 56682, Eli Zaretskii, monnier, dgutov


>> I'm not completely sure he did indeed remove those three brackets. 
>> Stephen, can you remove the three characters at positions 1, 22 and 23, 
>> and try again? These are the first two '{' and the first '[' characters 
>> in the buffer.
>
> I did remove those brackets previously; the improvement I see is that, 
> without them (and even without removing the corresponding closing 
> brackets at the end of the file, and of course with bidi-inhibit-bpa 
> nil), holding down `C-n' moves the cursor almost a whole screenful (~60 
> visual lines) before coming to a halt, instead of just three visual 
> lines with the initial brackets, and after letting go of `C-n', the 
> cursor catches up to the actual position of point noticeably quicker 
> than with the unaltered file.  Still, the movement is not at all smooth, 
> unlike with bidi-inhibit-bpa non-nil (and that is not as smooth as 
> moving through the same file with so-long-mode enabled).
>

Is that with emacs -Q? And with show-paren-mode disabled?





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-10 13:11                                                                                         ` Gregory Heytings
@ 2022-08-10 13:29                                                                                           ` Stephen Berman
  2022-08-10 15:00                                                                                             ` Gregory Heytings
  0 siblings, 1 reply; 685+ messages in thread
From: Stephen Berman @ 2022-08-10 13:29 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, Eli Zaretskii, monnier, dgutov

On Wed, 10 Aug 2022 13:11:52 +0000 Gregory Heytings <gregory@heytings.org> wrote:

>>> I'm not completely sure he did indeed remove those three brackets. Stephen,
>>> can you remove the three characters at positions 1, 22 and 23, and try
>>> again? These are the first two '{' and the first '[' characters in the
>>> buffer.
>>
>> I did remove those brackets previously; the improvement I see is that,
>> without them (and even without removing the corresponding closing brackets
>> at the end of the file, and of course with bidi-inhibit-bpa nil), holding
>> down `C-n' moves the cursor almost a whole screenful (~60 visual lines)
>> before coming to a halt, instead of just three visual lines with the initial
>> brackets, and after letting go of `C-n', the cursor catches up to the actual
>> position of point noticeably quicker than with the unaltered file.  Still,
>> the movement is not at all smooth, unlike with bidi-inhibit-bpa non-nil (and
>> that is not as smooth as moving through the same file with so-long-mode
>> enabled).
>>
>
> Is that with emacs -Q? And with show-paren-mode disabled?

I had forgotten to disable show-paren-mode; doing that (with -Q) seems
to increase the length of the initial scrolling but it still comes to a
halt and there's a delay (though no longer several seconds) before the
cursor catches up.  Further scrolling in the file seems not to show the
same improvement (i.e., scrolling halts again after ~3 visual lines),
though the file is too short to do that more than once or twice.

Steve Berman





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-10 13:29                                                                                           ` Stephen Berman
@ 2022-08-10 15:00                                                                                             ` Gregory Heytings
  0 siblings, 0 replies; 685+ messages in thread
From: Gregory Heytings @ 2022-08-10 15:00 UTC (permalink / raw)
  To: Stephen Berman; +Cc: 56682, Eli Zaretskii, monnier, dgutov


>
> I had forgotten to disable show-paren-mode; doing that (with -Q) seems 
> to increase the length of the initial scrolling but it still comes to a 
> halt and there's a delay (though no longer several seconds) before the 
> cursor catches up.  Further scrolling in the file seems not to show the 
> same improvement (i.e., scrolling halts again after ~3 visual lines), 
> though the file is too short to do that more than once or twice.
>

I can now reproduce what you describe.  The short halt you see at some 
point is AFAIU due to fontification, which (for some reason) takes a bit 
longer at some point in the file.  Note that the goal of long line 
optimizations is to get the best possible performance while disabling as 
least functionalities as possible.  It is not to become as fast as what 
you would see with M-x find-find-literally in all circumstances, which 
wouldn't be possible.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-10 12:43                                                                                   ` Eli Zaretskii
  2022-08-10 12:48                                                                                     ` Gregory Heytings
@ 2022-08-10 15:44                                                                                     ` Dmitry Gutov
  2022-08-10 16:08                                                                                       ` Eli Zaretskii
  1 sibling, 1 reply; 685+ messages in thread
From: Dmitry Gutov @ 2022-08-10 15:44 UTC (permalink / raw)
  To: Eli Zaretskii, Gregory Heytings; +Cc: 56682, stephen.berman, monnier

On 10.08.2022 15:43, Eli Zaretskii wrote:
>> Date: Wed, 10 Aug 2022 12:31:24 +0000
>> From: Gregory Heytings<gregory@heytings.org>
>> cc:56682@debbugs.gnu.org,stephen.berman@gmx.net,monnier@iro.umontreal.ca,
>>      dgutov@yandex.ru
>>
>>> Inhibiting the BPA is an option if it is known that the buffer doesn't
>>> include ant R2L characters anywhere; otherwise some braces/parens could
>>> be displayed incorrectly mirrored.
>> But is there an efficient way to determine if that the buffer doesn't
>> include any R2L characters?
> Not without searching the buffer, not that I know of.  If the buffer
> includes only ASCII characters (which this one doesn't), i.e. its
> sizes in characters and bytes are identical, we could deduce that
> there are no R2L characters without any heavy lifting.

Shouldn't the scanner be limited by the same narrowing that the 
long-line optimizations create? Given its existing effect on font-lock, 
limiting bidi searches seems like a no-brainer.

Alternatively, I would perhaps propose to perform said searching at two 
junctions: when the buffer is visited (and the text is inserted and, 
thus, unavoidably read), and when the buffer is saved (perhaps at that 
point Emacs might have info about the added ranges, to avoid searching 
through the whole buffer). The downside would be that the first added 
R2L character might be displayed incorrectly until the buffer is saved.

But the upside would be pretty huge.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-10 15:44                                                                                     ` Dmitry Gutov
@ 2022-08-10 16:08                                                                                       ` Eli Zaretskii
  2022-08-10 17:02                                                                                         ` Dmitry Gutov
  0 siblings, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-10 16:08 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: 56682, gregory, stephen.berman, monnier

> Date: Wed, 10 Aug 2022 18:44:53 +0300
> Cc: 56682@debbugs.gnu.org, stephen.berman@gmx.net, monnier@iro.umontreal.ca
> From: Dmitry Gutov <dgutov@yandex.ru>
> 
> Shouldn't the scanner be limited by the same narrowing that the 
> long-line optimizations create? Given its existing effect on font-lock, 
> limiting bidi searches seems like a no-brainer.

Like I said: it _is_ limited.  But the limitation is smarter than just
some arbitrary number of character positions, because it is tuned to
this particular processing.

Note that the effect of it in this case is not as dramatic as
font-lock: it does slow down C-n/C-p, but not catastrophically so, not
like we've seen with the files we used for the long-lines speedups.
And if someone does think it's a catastrophe, they can always disable
the BPA, perhaps even globally, if they know they will never need to
look closely at bidirectional text: the effects are hardly visible
unless you actually read the text.

> Alternatively, I would perhaps propose to perform said searching at two 
> junctions: when the buffer is visited (and the text is inserted and, 
> thus, unavoidably read), and when the buffer is saved (perhaps at that 
> point Emacs might have info about the added ranges, to avoid searching 
> through the whole buffer). The downside would be that the first added 
> R2L character might be displayed incorrectly until the buffer is saved.

This is impossible without a complete redesign of how the bidi display
works: it saves no information in the buffer object, none whatsoever.
The information is recomputed every time the display code is called,
and only for the portion of the buffer that needs to be traversed or
displayed; then it is discarded.  There are no caches of any kind that
keep the information after redisplay has done its job.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-10 16:08                                                                                       ` Eli Zaretskii
@ 2022-08-10 17:02                                                                                         ` Dmitry Gutov
  2022-08-10 17:19                                                                                           ` Eli Zaretskii
  0 siblings, 1 reply; 685+ messages in thread
From: Dmitry Gutov @ 2022-08-10 17:02 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, gregory, stephen.berman, monnier

On 10.08.2022 19:08, Eli Zaretskii wrote:
>> Date: Wed, 10 Aug 2022 18:44:53 +0300
>> Cc: 56682@debbugs.gnu.org, stephen.berman@gmx.net, monnier@iro.umontreal.ca
>> From: Dmitry Gutov <dgutov@yandex.ru>
>>
>> Shouldn't the scanner be limited by the same narrowing that the
>> long-line optimizations create? Given its existing effect on font-lock,
>> limiting bidi searches seems like a no-brainer.
> 
> Like I said: it _is_ limited.  But the limitation is smarter than just
> some arbitrary number of character positions, because it is tuned to
> this particular processing.
> 
> Note that the effect of it in this case is not as dramatic as
> font-lock: it does slow down C-n/C-p, but not catastrophically so,

It's much worse. In the aforementioned dictionary.json, with 
fully-featured font-lock (narrowing disabled in handle_fontified_props) 
the buffer is perfectly responsive to edit as long as I (setq 
bidi-inhibit-bpa nil). Even with show-paren-mode enabled.

Without that, however, simple navigation commands take a significant 
amount of time. These measurements are with show-paren-mode off:

Near BOB:

(benchmark 1 '(next-line 1)) =>
Elapsed time: 0.246551s
Elapsed time: 0.247237s
Elapsed time: 0.247392s

Near EOB:

(benchmark 1 '(next-line 1)) =>
Elapsed time: 0.059583s
Elapsed time: 0.040372s
Elapsed time: 0.059508s

> not
> like we've seen with the files we used for the long-lines speedups.
> And if someone does think it's a catastrophe, they can always disable
> the BPA, perhaps even globally,

That reminds me of "the user can always disable font-lock" and your 
dismissal of Alan's advice to change font-lock-maximum-decoration to 2, 
saying that we should have good editing performance OOTB.

> if they know they will never need to
> look closely at bidirectional text: the effects are hardly visible
> unless you actually read the text.

We could add (setq bidi-inhibit-bpa nil) to prog-mode, I suppose.

It already has a bidi-paragraph-direction setting anyway.

>> Alternatively, I would perhaps propose to perform said searching at two
>> junctions: when the buffer is visited (and the text is inserted and,
>> thus, unavoidably read), and when the buffer is saved (perhaps at that
>> point Emacs might have info about the added ranges, to avoid searching
>> through the whole buffer). The downside would be that the first added
>> R2L character might be displayed incorrectly until the buffer is saved.
> 
> This is impossible without a complete redesign of how the bidi display
> works: it saves no information in the buffer object, none whatsoever.
> The information is recomputed every time the display code is called,
> and only for the portion of the buffer that needs to be traversed or
> displayed; then it is discarded.  There are no caches of any kind that
> keep the information after redisplay has done its job.

Perhaps a cache similar to syntax-ppss one could do the job? Not sure 
what would be the trafeoffs, though. Like, how that would change the 
performance in the simple case.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-10 17:02                                                                                         ` Dmitry Gutov
@ 2022-08-10 17:19                                                                                           ` Eli Zaretskii
  2022-08-10 18:54                                                                                             ` Dmitry Gutov
  0 siblings, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-10 17:19 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: 56682, gregory, stephen.berman, monnier

> Date: Wed, 10 Aug 2022 20:02:20 +0300
> Cc: 56682@debbugs.gnu.org, gregory@heytings.org, stephen.berman@gmx.net,
>  monnier@iro.umontreal.ca
> From: Dmitry Gutov <dgutov@yandex.ru>
> 
> It's much worse. In the aforementioned dictionary.json, with 
> fully-featured font-lock (narrowing disabled in handle_fontified_props) 
> the buffer is perfectly responsive to edit as long as I (setq 
> bidi-inhibit-bpa nil). Even with show-paren-mode enabled.
> 
> Without that, however, simple navigation commands take a significant 
> amount of time. These measurements are with show-paren-mode off:
> 
> Near BOB:
> 
> (benchmark 1 '(next-line 1)) =>
> Elapsed time: 0.246551s
> Elapsed time: 0.247237s
> Elapsed time: 0.247392s
> 
> Near EOB:
> 
> (benchmark 1 '(next-line 1)) =>
> Elapsed time: 0.059583s
> Elapsed time: 0.040372s
> Elapsed time: 0.059508s

That's what I meant: it isn't a catastrophe.  1/4th of a second for
C-n is barely perceptible.

"Catastrophe" in my book is when it takes more than a couple of
seconds, like 10 sec or more.

> > not
> > like we've seen with the files we used for the long-lines speedups.
> > And if someone does think it's a catastrophe, they can always disable
> > the BPA, perhaps even globally,
> 
> That reminds me of "the user can always disable font-lock" and your 
> dismissal of Alan's advice to change font-lock-maximum-decoration to 2, 
> saying that we should have good editing performance OOTB.

No, because font-lock is much more important than the effect of the
BPA.  (Do you even understand what the BPA does, and did you ever see
it in action?  Without that, this part of the discussion is just waste
of time.)

> > if they know they will never need to
> > look closely at bidirectional text: the effects are hardly visible
> > unless you actually read the text.
> 
> We could add (setq bidi-inhibit-bpa nil) to prog-mode, I suppose.

Not to prog-mode, that I won't agree.  But maybe for JSON files, if we
think they are unlikely to suffer.

> It already has a bidi-paragraph-direction setting anyway.

That's not even similar.  That's just saving Emacs to figure that out
itself, wasting CPU cycles on what is known in advance.  Because a PL
buffer _always_ has its paragraphs left-to-right.

> > This is impossible without a complete redesign of how the bidi display
> > works: it saves no information in the buffer object, none whatsoever.
> > The information is recomputed every time the display code is called,
> > and only for the portion of the buffer that needs to be traversed or
> > displayed; then it is discarded.  There are no caches of any kind that
> > keep the information after redisplay has done its job.
> 
> Perhaps a cache similar to syntax-ppss one could do the job? Not sure 
> what would be the trafeoffs, though. Like, how that would change the 
> performance in the simple case.

There are no caches for a good reason: the Unicode Bidirectional
Algorithm that we implement results in very far-reaching non-local
effects of small changes.  Even inserting or deleting a single
character can dramatically change how the buffer looks on display very
far from the locus of the change.  Figuring out which changes
invalidate which caches is extremely non-trivial, and in many cases
requires the same amount of work as would take to just recompute
everything from scratch.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-10 17:19                                                                                           ` Eli Zaretskii
@ 2022-08-10 18:54                                                                                             ` Dmitry Gutov
  2022-08-10 19:13                                                                                               ` Eli Zaretskii
  0 siblings, 1 reply; 685+ messages in thread
From: Dmitry Gutov @ 2022-08-10 18:54 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, gregory, stephen.berman, monnier

On 10.08.2022 20:19, Eli Zaretskii wrote:
>> Date: Wed, 10 Aug 2022 20:02:20 +0300
>> Cc: 56682@debbugs.gnu.org, gregory@heytings.org, stephen.berman@gmx.net,
>>   monnier@iro.umontreal.ca
>> From: Dmitry Gutov <dgutov@yandex.ru>
>>
>> It's much worse. In the aforementioned dictionary.json, with
>> fully-featured font-lock (narrowing disabled in handle_fontified_props)
>> the buffer is perfectly responsive to edit as long as I (setq
>> bidi-inhibit-bpa nil). Even with show-paren-mode enabled.
>>
>> Without that, however, simple navigation commands take a significant
>> amount of time. These measurements are with show-paren-mode off:
>>
>> Near BOB:
>>
>> (benchmark 1 '(next-line 1)) =>
>> Elapsed time: 0.246551s
>> Elapsed time: 0.247237s
>> Elapsed time: 0.247392s
>>
>> Near EOB:
>>
>> (benchmark 1 '(next-line 1)) =>
>> Elapsed time: 0.059583s
>> Elapsed time: 0.040372s
>> Elapsed time: 0.059508s
> 
> That's what I meant: it isn't a catastrophe.  1/4th of a second for
> C-n is barely perceptible.

It's 2.5 the upper limit on what's perceived as "instant". And it's 
higher than the "uncomfortable" font-lock delays I have seen.

> "Catastrophe" in my book is when it takes more than a couple of
> seconds, like 10 sec or more.

For such a basic operation as next-line, it seems excessive to me. But 
if you're sure about this, all right.

This delay doesn't seem to extend to other commands, such as C-f/C-b or 
self-insert-command. It does seem to affect isearch, though.

>>> not
>>> like we've seen with the files we used for the long-lines speedups.
>>> And if someone does think it's a catastrophe, they can always disable
>>> the BPA, perhaps even globally,
>>
>> That reminds me of "the user can always disable font-lock" and your
>> dismissal of Alan's advice to change font-lock-maximum-decoration to 2,
>> saying that we should have good editing performance OOTB.
> 
> No, because font-lock is much more important than the effect of the
> BPA.  (Do you even understand what the BPA does, and did you ever see
> it in action?  Without that, this part of the discussion is just waste
> of time.)

I have looked at examples now. Seems important for text in pertinent 
human languages.

>>> if they know they will never need to
>>> look closely at bidirectional text: the effects are hardly visible
>>> unless you actually read the text.
>>
>> We could add (setq bidi-inhibit-bpa nil) to prog-mode, I suppose.
> 
> Not to prog-mode, that I won't agree.  But maybe for JSON files, if we
> think they are unlikely to suffer.

Sure, maybe.

Where do we draw the line, though? Not in prog-mode because a .js file, 
say, can have comments in Persian or Hebrew?

By that measurement, JSON is fine (no comments supported). But JSON 
contains a bunch of strings, could store localizations, etc.
I suppose the contents of said strings can store i18n text, with the 
expectation of a user being able to edit it.

>> It already has a bidi-paragraph-direction setting anyway.
> 
> That's not even similar.  That's just saving Emacs to figure that out
> itself, wasting CPU cycles on what is known in advance.  Because a PL
> buffer _always_ has its paragraphs left-to-right.
> 
>>> This is impossible without a complete redesign of how the bidi display
>>> works: it saves no information in the buffer object, none whatsoever.
>>> The information is recomputed every time the display code is called,
>>> and only for the portion of the buffer that needs to be traversed or
>>> displayed; then it is discarded.  There are no caches of any kind that
>>> keep the information after redisplay has done its job.
>>
>> Perhaps a cache similar to syntax-ppss one could do the job? Not sure
>> what would be the trafeoffs, though. Like, how that would change the
>> performance in the simple case.
> 
> There are no caches for a good reason: the Unicode Bidirectional
> Algorithm that we implement results in very far-reaching non-local
> effects of small changes.  Even inserting or deleting a single
> character can dramatically change how the buffer looks on display very
> far from the locus of the change.

In both directions?

> Figuring out which changes
> invalidate which caches is extremely non-trivial, and in many cases
> requires the same amount of work as would take to just recompute
> everything from scratch.

Sounds a little similar to syntax-ppss cache: changing a character near 
BOB invalidates the whole cache for all positions > POS.

This one sounds more complex, though.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-10 18:54                                                                                             ` Dmitry Gutov
@ 2022-08-10 19:13                                                                                               ` Eli Zaretskii
  0 siblings, 0 replies; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-10 19:13 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: 56682, gregory, stephen.berman, monnier

> Date: Wed, 10 Aug 2022 21:54:04 +0300
> Cc: 56682@debbugs.gnu.org, gregory@heytings.org, stephen.berman@gmx.net,
>  monnier@iro.umontreal.ca
> From: Dmitry Gutov <dgutov@yandex.ru>
> 
> > No, because font-lock is much more important than the effect of the
> > BPA.  (Do you even understand what the BPA does, and did you ever see
> > it in action?  Without that, this part of the discussion is just waste
> > of time.)
> 
> I have looked at examples now. Seems important for text in pertinent 
> human languages.

Yes.  Which JSON isn't.  But most PL modes have comments and strings,
and that's where this is important.

> >> We could add (setq bidi-inhibit-bpa nil) to prog-mode, I suppose.
> > 
> > Not to prog-mode, that I won't agree.  But maybe for JSON files, if we
> > think they are unlikely to suffer.
> 
> Sure, maybe.
> 
> Where do we draw the line, though? Not in prog-mode because a .js file, 
> say, can have comments in Persian or Hebrew?
>
> By that measurement, JSON is fine (no comments supported). But JSON 
> contains a bunch of strings, could store localizations, etc.

I presume that JSON files are rarely for human consumption, so the
strings are not very important.  And they will rarely include R2L
characters to begin with.

> I suppose the contents of said strings can store i18n text, with the 
> expectation of a user being able to edit it.

If and when that happens, users can turn BPA back on.

> > There are no caches for a good reason: the Unicode Bidirectional
> > Algorithm that we implement results in very far-reaching non-local
> > effects of small changes.  Even inserting or deleting a single
> > character can dramatically change how the buffer looks on display very
> > far from the locus of the change.
> 
> In both directions?

Yes (IIUC what you mean by that).  The effect back happens rarer than
forward, but it does happen.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-07 18:38                                                                               ` Eli Zaretskii
@ 2022-08-12 10:47                                                                                 ` Dmitry Gutov
  2022-08-12 12:34                                                                                   ` Gregory Heytings
  0 siblings, 1 reply; 685+ messages in thread
From: Dmitry Gutov @ 2022-08-12 10:47 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, gregory, monnier

On 07.08.2022 21:38, Eli Zaretskii wrote:
>> Date: Sun, 7 Aug 2022 21:27:21 +0300
>> Cc:56682@debbugs.gnu.org,gregory@heytings.org,monnier@iro.umontreal.ca
>> From: Dmitry Gutov<dgutov@yandex.ru>
>>
>>> feel free to push a feature branch with your proposed
>>> changes, or even install them as optional features on master, and
>>> let's compare the merits and demerits of each idea in practical use
>>> cases and on a variety of systems.
>> I will.
> Thanks.

I've pushed a branch scratch/font_lock_large_files.

Please try out different values of the new variable.

Preferably test together with (setq bidi-inhibit-bpa t), to eliminate 
its contribution.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-12 10:47                                                                                 ` Dmitry Gutov
@ 2022-08-12 12:34                                                                                   ` Gregory Heytings
  2022-08-12 16:35                                                                                     ` Dmitry Gutov
  0 siblings, 1 reply; 685+ messages in thread
From: Gregory Heytings @ 2022-08-12 12:34 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: 56682, Eli Zaretskii, monnier


>
> I've pushed a branch scratch/font_lock_large_files.
>

Thank you.  But as I told you earlier, what that branch contains is a too 
local fix.  You created a new minimal major mode to edit JSON files, in 
which you removed everything that made font locking slow in js-mode.  As a 
consequence, now editing the dictionary.json file is indeed reasonably 
fast without disabling font locking or using locked narrowing (although it 
is still too slow to my taste for larger files, e.g. I have to wait five 
seconds after M-> in a ten times larger JSON file).  And the original 
problem is still present if you edit, for example, a 20 MB minified 
JavaScript file...





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-12 12:34                                                                                   ` Gregory Heytings
@ 2022-08-12 16:35                                                                                     ` Dmitry Gutov
  2022-08-12 17:56                                                                                       ` Eli Zaretskii
  2022-08-12 21:31                                                                                       ` Gregory Heytings
  0 siblings, 2 replies; 685+ messages in thread
From: Dmitry Gutov @ 2022-08-12 16:35 UTC (permalink / raw)
  To: Gregory Heytings
  Cc: 56682@debbugs.gnu.org, Eli Zaretskii, monnier@iro.umontreal.ca

[-- Attachment #1: Type: text/html, Size: 2180 bytes --]

^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-12 16:35                                                                                     ` Dmitry Gutov
@ 2022-08-12 17:56                                                                                       ` Eli Zaretskii
  2022-08-12 18:09                                                                                         ` Dmitry Gutov
  2022-08-12 21:31                                                                                       ` Gregory Heytings
  1 sibling, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-12 17:56 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: 56682, gregory, monnier

> From: Dmitry Gutov <dgutov@yandex.ru>
> Cc: Eli Zaretskii <eliz@gnu.org>,
> 	"56682@debbugs.gnu.org" <56682@debbugs.gnu.org>,
> 	"monnier@iro.umontreal.ca" <monnier@iro.umontreal.ca>
> Date: Fri, 12 Aug 2022 19:35:57 +0300
> 
> I have eliminated two performance problems frim js-json-mode that are uncharacteristic for font-lock in
> general. One used a pathological matcher (simply removed), and another uses the "frameworks" facility
> which simply always rescans the full buffer from the beginning. That one can/should be fixed later, but I have
> disabled it for JSON (where it doesn't make sense anyway).
> 
> You should know that the rest of js-mode's font-lock keywords are still there. I experimented with leaving just
> the bare minimum needed for JSON, but the effect was very minimal (like 20% improvement).

I didn't yet have time to try the branch, but what you say begs a
question: does the branch attempt to solve the problems of JSON files
only, or does it attempt to solve a more general problem?





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-12 17:56                                                                                       ` Eli Zaretskii
@ 2022-08-12 18:09                                                                                         ` Dmitry Gutov
  2022-08-12 21:41                                                                                           ` Gregory Heytings
  0 siblings, 1 reply; 685+ messages in thread
From: Dmitry Gutov @ 2022-08-12 18:09 UTC (permalink / raw)
  To: Eli Zaretskii
  Cc: 56682@debbugs.gnu.org, gregory@heytings.org,
	monnier@iro.umontreal.ca

[-- Attachment #1: Type: text/html, Size: 1717 bytes --]

^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-12 16:35                                                                                     ` Dmitry Gutov
  2022-08-12 17:56                                                                                       ` Eli Zaretskii
@ 2022-08-12 21:31                                                                                       ` Gregory Heytings
  2022-08-13  2:01                                                                                         ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-08-13  9:00                                                                                         ` Dmitry Gutov
  1 sibling, 2 replies; 685+ messages in thread
From: Gregory Heytings @ 2022-08-12 21:31 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: 56682, Eli Zaretskii, monnier


> 
> I have eliminated two performance problems frim js-json-mode that are 
> uncharacteristic for font-lock in general.
>

This is where we disagree: they _are_ characteristic of font locking in 
general, in all modes (in core and in the wild) that use widen in their 
font locking routines and/or do complex calculations far away from the 
region that must be fontified.

>> although it is still too slow to my taste for larger files, e.g. I have 
>> to wait five seconds after M-> in a ten times larger JSON file). And 
>> the original problem is still present if you edit, for example, a 20 MB 
>> minified JavaScript file...
>
> Hence the new user option.
>

The goal of this effort is not, and never was, to make editing the 
dictionary.json file reasonably fast with an optimized build on a Core i9 
computer.  That file is, again, just an example.  The goal of this effort 
is to make editing any large file as smooth as possible, out of the box, 
regardless of the major (and minor) modes that are are enabled, even with 
a less efficient CPU, e.g. a Raspberry Pi computer, or a lower end laptop 
with its CPU running at a lower frequency.

Which is why fixing js-mode, and adding a json-mode, as you did, is a "too 
local" fix.  Of course, that doesn't mean what you did is useless; it only 
means that it cannot be considered as a general solution to the problem at 
hand.

I can only repeat that the only ways to improve font locking in a 
non-local way (or at least, the only ways that were identified in the 
discussions so far) are either to improve the speed of syntax-ppss by an 
order of magnitude, in which case it would perhaps become feasible to 
allow syntax-ppss to have access to the whole buffer, or to equip 
syntax-ppss with heuristics to make it work "as well as possible" even 
when it only has access to a portion of the buffer.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-12 18:09                                                                                         ` Dmitry Gutov
@ 2022-08-12 21:41                                                                                           ` Gregory Heytings
  2022-08-13  5:56                                                                                             ` Eli Zaretskii
  2022-08-13  8:27                                                                                             ` Dmitry Gutov
  0 siblings, 2 replies; 685+ messages in thread
From: Gregory Heytings @ 2022-08-12 21:41 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: 56682, Eli Zaretskii, monnier


>> I didn't yet have time to try the branch, but what you say begs a 
>> question: does the branch attempt to solve the problems of JSON files 
>> only, or does it attempt to solve a more general problem?
> 
> There is nothing json-specific in the branch. All the js/json stuff is 
> on master already.
>

That doesn't answer Eli's question, AFAIU.  The branch demonstrates that, 
with the Javascript/JSON improvements you installed recently on master, 
editing the 20 MB dictionary.json file without using locked narrowing 
around fontification-functions is reasonably efficient.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-12 21:31                                                                                       ` Gregory Heytings
@ 2022-08-13  2:01                                                                                         ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-08-13  6:13                                                                                           ` Eli Zaretskii
                                                                                                             ` (2 more replies)
  2022-08-13  9:00                                                                                         ` Dmitry Gutov
  1 sibling, 3 replies; 685+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2022-08-13  2:01 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, Eli Zaretskii, Dmitry Gutov

> I can only repeat that the only ways to improve font locking in a non-local
> way (or at least, the only ways that were identified in the discussions so
> far) are either to improve the speed of syntax-ppss by an order of
> magnitude, in which case it would perhaps become feasible to allow
> syntax-ppss to have access to the whole buffer, or to equip syntax-ppss with
> heuristics to make it work "as well as possible" even when it only has
> access to a portion of the buffer.

But the locked narrowing is applied based on the presence of long-lines
rather than based on the total size of the buffer.

I think we'll want to decouple the two because they aren't quite the
same (e.g. in many cases the time taken by `syntax-ppss` doesn't depend
on the length of lines, whereas the time taken by `font-lock-keywords`
rues does not depend on the total buffer size).


        Stefan






^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-12 21:41                                                                                           ` Gregory Heytings
@ 2022-08-13  5:56                                                                                             ` Eli Zaretskii
  2022-08-13 13:37                                                                                               ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-08-13  8:27                                                                                             ` Dmitry Gutov
  1 sibling, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-13  5:56 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, monnier, dgutov

> Date: Fri, 12 Aug 2022 21:41:36 +0000
> From: Gregory Heytings <gregory@heytings.org>
> cc: Eli Zaretskii <eliz@gnu.org>, 56682@debbugs.gnu.org, 
>     monnier@iro.umontreal.ca
> 
> The branch demonstrates that, with the Javascript/JSON improvements
> you installed recently on master, editing the 20 MB dictionary.json
> file without using locked narrowing around fontification-functions
> is reasonably efficient.

Is 20MB single-line JSON file fairly representative of such files out
there?  Do we know of JSON file with much longer lines, for example
50MB or 100MB?

If 20MB is reasonably representative of the long-line JSON, then
perhaps at least json-mode could consider resetting
long-line-threshold to nil.  But if there are significantly larger
files out there, we should first assess the performance in those
cases.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-13  2:01                                                                                         ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2022-08-13  6:13                                                                                           ` Eli Zaretskii
  2022-08-13  8:00                                                                                             ` dgutov
                                                                                                               ` (2 more replies)
  2022-08-13  7:58                                                                                           ` Dmitry Gutov
  2022-08-13 13:42                                                                                           ` Gregory Heytings
  2 siblings, 3 replies; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-13  6:13 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: 56682, gregory, dgutov

> From: Stefan Monnier <monnier@iro.umontreal.ca>
> Cc: Dmitry Gutov <dgutov@yandex.ru>,  Eli Zaretskii <eliz@gnu.org>,
>   56682@debbugs.gnu.org
> Date: Fri, 12 Aug 2022 22:01:54 -0400
> 
> > I can only repeat that the only ways to improve font locking in a non-local
> > way (or at least, the only ways that were identified in the discussions so
> > far) are either to improve the speed of syntax-ppss by an order of
> > magnitude, in which case it would perhaps become feasible to allow
> > syntax-ppss to have access to the whole buffer, or to equip syntax-ppss with
> > heuristics to make it work "as well as possible" even when it only has
> > access to a portion of the buffer.
> 
> But the locked narrowing is applied based on the presence of long-lines
> rather than based on the total size of the buffer.

That's true, but the two are closely related: a buffer with very long
lines tends also to be a large buffer.

> I think we'll want to decouple the two because they aren't quite the
> same (e.g. in many cases the time taken by `syntax-ppss` doesn't depend
> on the length of lines, whereas the time taken by `font-lock-keywords`
> rues does not depend on the total buffer size).

The solutions for stuff that depends on buffer size will indeed be
different from solutions for stuff that depends on line size.
However, font-lock currently depends on both, and narrowing solves
both, albeit in non-specific ways.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-13  2:01                                                                                         ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-08-13  6:13                                                                                           ` Eli Zaretskii
@ 2022-08-13  7:58                                                                                           ` Dmitry Gutov
  2022-08-13 13:42                                                                                           ` Gregory Heytings
  2 siblings, 0 replies; 685+ messages in thread
From: Dmitry Gutov @ 2022-08-13  7:58 UTC (permalink / raw)
  To: Stefan Monnier, Gregory Heytings; +Cc: 56682@debbugs.gnu.org, Eli Zaretskii

[-- Attachment #1: Type: text/html, Size: 1269 bytes --]

^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-13  6:13                                                                                           ` Eli Zaretskii
@ 2022-08-13  8:00                                                                                             ` dgutov
  2022-08-13 13:44                                                                                             ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-08-13 16:48                                                                                             ` Dmitry Gutov
  2 siblings, 0 replies; 685+ messages in thread
From: dgutov @ 2022-08-13  8:00 UTC (permalink / raw)
  To: Eli Zaretskii, Stefan Monnier; +Cc: 56682@debbugs.gnu.org, gregory@heytings.org

[-- Attachment #1: Type: text/html, Size: 1749 bytes --]

^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-12 21:41                                                                                           ` Gregory Heytings
  2022-08-13  5:56                                                                                             ` Eli Zaretskii
@ 2022-08-13  8:27                                                                                             ` Dmitry Gutov
  1 sibling, 0 replies; 685+ messages in thread
From: Dmitry Gutov @ 2022-08-13  8:27 UTC (permalink / raw)
  To: Gregory Heytings
  Cc: 56682@debbugs.gnu.org, Eli Zaretskii, monnier@iro.umontreal.ca

[-- Attachment #1: Type: text/html, Size: 1079 bytes --]

^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-12 21:31                                                                                       ` Gregory Heytings
  2022-08-13  2:01                                                                                         ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2022-08-13  9:00                                                                                         ` Dmitry Gutov
  2022-08-13 14:24                                                                                           ` Gregory Heytings
  1 sibling, 1 reply; 685+ messages in thread
From: Dmitry Gutov @ 2022-08-13  9:00 UTC (permalink / raw)
  To: Gregory Heytings
  Cc: 56682@debbugs.gnu.org, Eli Zaretskii, monnier@iro.umontreal.ca

[-- Attachment #1: Type: text/html, Size: 3524 bytes --]

^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-13  5:56                                                                                             ` Eli Zaretskii
@ 2022-08-13 13:37                                                                                               ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-08-13 14:25                                                                                                 ` Eli Zaretskii
  0 siblings, 1 reply; 685+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2022-08-13 13:37 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, Gregory Heytings, dgutov

> Is 20MB single-line JSON file fairly representative of such files out
> there?  Do we know of JSON file with much longer lines, for example
> 50MB or 100MB?

IIUC it's very common for JSON files to be made of a single line, so the
line length is the file's length and since those files are
machine-generated I don't expect 100MB to be much less common than 20MB.

> If 20MB is reasonably representative of the long-line JSON, then
> perhaps at least json-mode could consider resetting
> long-line-threshold to nil.

IIUC a nil value for `long-line-threshold` makes Emacs completely
unusable with such long lines even if you disable all the bells
and whistles.  Dmitry's suggestion is to skip the locked-narrowing in
some cases, but not to set `long-line-threshold` to nil.


        Stefan






^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-13  2:01                                                                                         ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-08-13  6:13                                                                                           ` Eli Zaretskii
  2022-08-13  7:58                                                                                           ` Dmitry Gutov
@ 2022-08-13 13:42                                                                                           ` Gregory Heytings
  2022-08-13 14:23                                                                                             ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-08-13 16:59                                                                                             ` Dmitry Gutov
  2 siblings, 2 replies; 685+ messages in thread
From: Gregory Heytings @ 2022-08-13 13:42 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: 56682, Eli Zaretskii, Dmitry Gutov


>
> I think we'll want to decouple the two because they aren't quite the 
> same (e.g. in many cases the time taken by `syntax-ppss` doesn't depend 
> on the length of lines, whereas the time taken by `font-lock-keywords` 
> rues does not depend on the total buffer size).
>

That's what I initially thought, too.  Now I tend to think that it would 
be better to not decouple these two cases, because it would be too 
expensive to distinguish the four possible cases, namely:

1. "normal buffers"

2. non-large buffers with long lines

3. large buffers without long lines

4. large buffers with long lines

It is probably better to group the three last cases in a single group, and 
to use the same optimization techniques for these three cases.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-13  6:13                                                                                           ` Eli Zaretskii
  2022-08-13  8:00                                                                                             ` dgutov
@ 2022-08-13 13:44                                                                                             ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-08-13 16:48                                                                                             ` Dmitry Gutov
  2 siblings, 0 replies; 685+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2022-08-13 13:44 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, gregory, dgutov

>> But the locked narrowing is applied based on the presence of long-lines
>> rather than based on the total size of the buffer.
> That's true, but the two are closely related: a buffer with very long
> lines tends also to be a large buffer.

They are related but I don't think it "closely"-enough to conflate the
two: e.g. many large buffers have no long lines (e.g. log files) and as
Dmitry mentions the thresholds are quite different (back-of-the-envelope
suggests a factor 100 or so).

> The solutions for stuff that depends on buffer size will indeed be
> different from solutions for stuff that depends on line size.
> However, font-lock currently depends on both,

Various parts of it depends on only one of the two, tho.

> and narrowing solves both, albeit in non-specific ways.

And I'm all for it as a blunt-but-effective "fallback", as long as it
can be selectively overridden from ELisp.


        Stefan






^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-13 13:42                                                                                           ` Gregory Heytings
@ 2022-08-13 14:23                                                                                             ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-08-13 14:33                                                                                               ` Gregory Heytings
  2022-08-13 16:59                                                                                             ` Dmitry Gutov
  1 sibling, 1 reply; 685+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2022-08-13 14:23 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, Eli Zaretskii, Dmitry Gutov

Gregory Heytings [2022-08-13 13:42:25] wrote:
> 1. "normal buffers"
> 2. non-large buffers with long lines
> 3. large buffers without long lines
> 4. large buffers with long lines
>
> It is probably better to group the three last cases in a single group, and
> to use the same optimization techniques for these three cases.

(with-half-joking-mode
  Hmm... so should be increase `syntax-wholeline-max` from 10kB to 10MB or
  should we decrease `large-file-warning-threshold` from 10MB down
  to 10kB?)


        Stefan






^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-13  9:00                                                                                         ` Dmitry Gutov
@ 2022-08-13 14:24                                                                                           ` Gregory Heytings
  2022-08-13 17:20                                                                                             ` Dmitry Gutov
  0 siblings, 1 reply; 685+ messages in thread
From: Gregory Heytings @ 2022-08-13 14:24 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: 56682, Eli Zaretskii, monnier


> 
> But they're not. Of course, modes might have problematic rules 
> (font-lock-keywords are turing-complete, after all), but it might be 
> just as easy to fix all the main major modes rather than hobble user 
> experience.
>

You've made it quite clear that in your opinion incorrect font locking 
hobbles user experience more than multi-second delays between motion or 
search commands.  Let's agree to disagree.

>
> Especially if we limit ourselves to modes that are likely to be used 
> with large files.
>

That's not the intention, no.

>
> So please go ahead and experiment, and report on your findings later.
>

I already did, and told you that these multi-second delays were still 
present in larger JSON files (and therefore also in smaller files with 
slower CPUs).

>
> Then the goal failed because we don't disable bidi hpa? It has a much 
> more noticeable effect on editing that font-lock.
>

That's not correct, no.  The BPA algorithm makes C-n and C-p slower at the 
beginning of large files only in a very specific case: when the beginning 
of the buffer contains opening brackets whose matching closing bracket is 
at the end of the buffer.  And the BPA algorithm does not cause 
multi-second delays.

>
> And of course if we wanted to make everything as smooth as possible on 
> every possible machine down to TI calculators,
>

That's not what I aim at, and I think you understood that.

>> Which is why fixing js-mode, and adding a json-mode, as you did, is a 
>> "too local" fix. Of course, that doesn't mean what you did is useless; 
>> it only means that it cannot be considered as a general solution to the 
>> problem at hand.
> 
> That's not what the branch contains.
>

You're playing with words.  The fixes to js-mode and the added json-mode 
are not on the branch because you installed them on master, but what you 
claim the branch demonstrates depends on what you installed on master. 
Or do you claim that what the branch contains makes editing any other file 
(that is, not a .js or a .json file) almost as fast as what is on master?





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-13 13:37                                                                                               ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2022-08-13 14:25                                                                                                 ` Eli Zaretskii
  2022-08-13 14:32                                                                                                   ` Gregory Heytings
  0 siblings, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-13 14:25 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: 56682, gregory, dgutov

> From: Stefan Monnier <monnier@iro.umontreal.ca>
> Cc: Gregory Heytings <gregory@heytings.org>,  dgutov@yandex.ru,
>   56682@debbugs.gnu.org
> Date: Sat, 13 Aug 2022 09:37:06 -0400
> 
> > Is 20MB single-line JSON file fairly representative of such files out
> > there?  Do we know of JSON file with much longer lines, for example
> > 50MB or 100MB?
> 
> IIUC it's very common for JSON files to be made of a single line, so the
> line length is the file's length and since those files are
> machine-generated I don't expect 100MB to be much less common than 20MB.

I think I'd prefer some actual data points.  It's clear that larger
JSON files can happen, the question is how frequently they do happen.

> > If 20MB is reasonably representative of the long-line JSON, then
> > perhaps at least json-mode could consider resetting
> > long-line-threshold to nil.
> 
> IIUC a nil value for `long-line-threshold` makes Emacs completely
> unusable with such long lines even if you disable all the bells
> and whistles.  Dmitry's suggestion is to skip the locked-narrowing in
> some cases, but not to set `long-line-threshold` to nil.

That's what I actually meant.

However, if much larger JSON files exist, we should first see what
that proposal produces with such larger files.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-13 14:25                                                                                                 ` Eli Zaretskii
@ 2022-08-13 14:32                                                                                                   ` Gregory Heytings
  2022-08-13 15:11                                                                                                     ` Eli Zaretskii
  2022-08-13 16:46                                                                                                     ` Dmitry Gutov
  0 siblings, 2 replies; 685+ messages in thread
From: Gregory Heytings @ 2022-08-13 14:32 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, Stefan Monnier, dgutov


>
> However, if much larger JSON files exist, we should first see what that 
> proposal produces with such larger files.
>

As I just said to Dmitry: the same multi-second delays we saw in smaller 
JSON files.  And those who have a slower CPU will see these multi-second 
delays with smaller files.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-13 14:23                                                                                             ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2022-08-13 14:33                                                                                               ` Gregory Heytings
  0 siblings, 0 replies; 685+ messages in thread
From: Gregory Heytings @ 2022-08-13 14:33 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: 56682, Eli Zaretskii, Dmitry Gutov


>
> (with-half-joking-mode Hmm... so should be increase 
> `syntax-wholeline-max` from 10kB to 10MB or should we decrease 
> `large-file-warning-threshold` from 10MB down to 10kB?)
>

C-u C-x C-e => 42





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-13 14:32                                                                                                   ` Gregory Heytings
@ 2022-08-13 15:11                                                                                                     ` Eli Zaretskii
  2022-08-13 15:38                                                                                                       ` Gregory Heytings
  2022-08-13 16:46                                                                                                     ` Dmitry Gutov
  1 sibling, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-13 15:11 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, monnier, dgutov

> Date: Sat, 13 Aug 2022 14:32:08 +0000
> From: Gregory Heytings <gregory@heytings.org>
> cc: Stefan Monnier <monnier@iro.umontreal.ca>, dgutov@yandex.ru, 
>     56682@debbugs.gnu.org
> 
> > However, if much larger JSON files exist, we should first see what that 
> > proposal produces with such larger files.
> 
> As I just said to Dmitry: the same multi-second delays we saw in smaller 
> JSON files.  And those who have a slower CPU will see these multi-second 
> delays with smaller files.

Where can I download such files?





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-13 15:11                                                                                                     ` Eli Zaretskii
@ 2022-08-13 15:38                                                                                                       ` Gregory Heytings
  0 siblings, 0 replies; 685+ messages in thread
From: Gregory Heytings @ 2022-08-13 15:38 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, monnier, dgutov


>>> However, if much larger JSON files exist, we should first see what 
>>> that proposal produces with such larger files.
>>
>> As I just said to Dmitry: the same multi-second delays we saw in 
>> smaller JSON files.  And those who have a slower CPU will see these 
>> multi-second delays with smaller files.
>
> Where can I download such files?
>

As Stefan said, JSON files are machine generated, so you can just 
concatenate the dictionary.json file as many times as you want to obtain a 
larger file.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-13 14:32                                                                                                   ` Gregory Heytings
  2022-08-13 15:11                                                                                                     ` Eli Zaretskii
@ 2022-08-13 16:46                                                                                                     ` Dmitry Gutov
  2022-08-13 17:16                                                                                                       ` Gregory Heytings
  1 sibling, 1 reply; 685+ messages in thread
From: Dmitry Gutov @ 2022-08-13 16:46 UTC (permalink / raw)
  To: Gregory Heytings, Eli Zaretskii; +Cc: 56682, Stefan Monnier

On 13.08.2022 17:32, Gregory Heytings wrote:
> 
>>
>> However, if much larger JSON files exist, we should first see what 
>> that proposal produces with such larger files.
>>
> 
> As I just said to Dmitry: the same multi-second delays we saw in smaller 
> JSON files.  And those who have a slower CPU will see these multi-second 
> delays with smaller files.

No exactly the same ones, though, since the previous tests we did were 
done with the older version of JSON support (not the current 
js-json-mode), with somewhat different performance characteristics.

So re-testing would be a good idea.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-13  6:13                                                                                           ` Eli Zaretskii
  2022-08-13  8:00                                                                                             ` dgutov
  2022-08-13 13:44                                                                                             ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2022-08-13 16:48                                                                                             ` Dmitry Gutov
  2 siblings, 0 replies; 685+ messages in thread
From: Dmitry Gutov @ 2022-08-13 16:48 UTC (permalink / raw)
  To: Eli Zaretskii, Stefan Monnier; +Cc: 56682, gregory

On 13.08.2022 09:13, Eli Zaretskii wrote:
>>> I can only repeat that the only ways to improve font locking in a non-local
>>> way (or at least, the only ways that were identified in the discussions so
>>> far) are either to improve the speed of syntax-ppss by an order of
>>> magnitude, in which case it would perhaps become feasible to allow
>>> syntax-ppss to have access to the whole buffer, or to equip syntax-ppss with
>>> heuristics to make it work "as well as possible" even when it only has
>>> access to a portion of the buffer.
>> But the locked narrowing is applied based on the presence of long-lines
>> rather than based on the total size of the buffer.
> That's true, but the two are closely related: a buffer with very long
> lines tends also to be a large buffer.
> 

The long-line related problems start to become noticeable much earlier 
than the buffer becomes "large".





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-13 13:42                                                                                           ` Gregory Heytings
  2022-08-13 14:23                                                                                             ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2022-08-13 16:59                                                                                             ` Dmitry Gutov
  2022-08-13 17:26                                                                                               ` Gregory Heytings
  1 sibling, 1 reply; 685+ messages in thread
From: Dmitry Gutov @ 2022-08-13 16:59 UTC (permalink / raw)
  To: Gregory Heytings, Stefan Monnier; +Cc: 56682, Eli Zaretskii

On 13.08.2022 16:42, Gregory Heytings wrote:
> 
>>
>> I think we'll want to decouple the two because they aren't quite the 
>> same (e.g. in many cases the time taken by `syntax-ppss` doesn't 
>> depend on the length of lines, whereas the time taken by 
>> `font-lock-keywords` rues does not depend on the total buffer size).
>>
> 
> That's what I initially thought, too.  Now I tend to think that it would 
> be better to not decouple these two cases, because it would be too 
> expensive to distinguish the four possible cases, namely:

I'm fairly sure that my branch demonstrates that there's nothing 
expensive about it.

It's just one commit, 20 additions, 10 deletions. It should take 2 
minutes max to read and understand it.

Yes, it adds a new custom var (for readability's sake we could split it 
in two later). But that's only logical since it handles an orthogonal 
problem to the one that long-line-threshold is about.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-13 16:46                                                                                                     ` Dmitry Gutov
@ 2022-08-13 17:16                                                                                                       ` Gregory Heytings
  2022-08-13 19:10                                                                                                         ` Dmitry Gutov
  2022-08-13 21:15                                                                                                         ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  0 siblings, 2 replies; 685+ messages in thread
From: Gregory Heytings @ 2022-08-13 17:16 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: 56682, Eli Zaretskii, Stefan Monnier

[-- Attachment #1: Type: text/plain, Size: 821 bytes --]


>> As I just said to Dmitry: the same multi-second delays we saw in 
>> smaller JSON files.  And those who have a slower CPU will see these 
>> multi-second delays with smaller files.
>
> No exactly the same ones, though, since the previous tests we did were 
> done with the older version of JSON support (not the current 
> js-json-mode), with somewhat different performance characteristics.
>

Okay, not "the same ones", but delays of the same order of magnitude 
nonetheless.  We had that discussion a month ago, and concluded that local 
fixes in every major (and minor) modes were not the way to go.  Having 
that discussion again does not seem fruitful.  You improved js-mode and 
created json-mode, that's fine, but it doesn't change anything to the way 
all other major (and minor) modes behave.

^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-13 14:24                                                                                           ` Gregory Heytings
@ 2022-08-13 17:20                                                                                             ` Dmitry Gutov
  2022-08-13 17:43                                                                                               ` Gregory Heytings
                                                                                                                 ` (2 more replies)
  0 siblings, 3 replies; 685+ messages in thread
From: Dmitry Gutov @ 2022-08-13 17:20 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, Eli Zaretskii, monnier

On 13.08.2022 17:24, Gregory Heytings wrote:
> 
>>
>> But they're not. Of course, modes might have problematic rules 
>> (font-lock-keywords are turing-complete, after all), but it might be 
>> just as easy to fix all the main major modes rather than hobble user 
>> experience.
>>
> 
> You've made it quite clear that in your opinion incorrect font locking 
> hobbles user experience more than multi-second delays between motion or 
> search commands.

I did not.

As soon as the file becomes very large, such that font-lock actually 
becomes costly even in properly written major modes, we can still do one 
of the two things: apply narrowing during font-lock, or fontify only the 
beginning of the file.

That's what two alternative values of font-lock-large-files (added on 
the branch) aim to do. But what is the good default value, and if it's 
not t, what thresholds to use, those questions require more testing and 
user feedback.

>> Especially if we limit ourselves to modes that are likely to be used 
>> with large files.
>>
> 
> That's not the intention, no.
> 
>>
>> So please go ahead and experiment, and report on your findings later.
>>
> 
> I already did, and told you that these multi-second delays were still 
> present in larger JSON files (and therefore also in smaller files with 
> slower CPUs).

Delays or "a delay"? Just the first time you scroll to EOB? Or did you 
do the whole dance with editing near BOB, then goto EOB, and repeat?

Did you try that with other file formats? What is the size threshold 
where the performance becomes uncomfortable?

>> Then the goal failed because we don't disable bidi hpa? It has a much 
>> more noticeable effect on editing that font-lock.
>>
> 
> That's not correct, no.  The BPA algorithm makes C-n and C-p slower at 
> the beginning of large files only in a very specific case: when the 
> beginning of the buffer contains opening brackets whose matching closing 
> bracket is at the end of the buffer.

To be fair, that's pretty much all JSON files. But I can't quickly 
recall any other format with that properly, OK.

> And the BPA algorithm does not 
> cause multi-second delays.

The ones I saw seemed pretty bad. And they happened on every command 
invocation, not only after you edit the buffer on some distant position.

And bidi-inhibit-hpa is the main cause of C-v/M-v stuttering over here.

>>> Which is why fixing js-mode, and adding a json-mode, as you did, is a 
>>> "too local" fix. Of course, that doesn't mean what you did is 
>>> useless; it only means that it cannot be considered as a general 
>>> solution to the problem at hand.
>>
>> That's not what the branch contains.
>>
> 
> You're playing with words.  The fixes to js-mode and the added json-mode 
> are not on the branch because you installed them on master, but what you 
> claim the branch demonstrates depends on what you installed on master. 
> Or do you claim that what the branch contains makes editing any other 
> file (that is, not a .js or a .json file) almost as fast as what is on 
> master?

The branch:

1) Allows everyone interested to evaluate the performance of 
unrestricted font-lock even in large files (single-line or not) and see 
how big on a problem the delays caused by syntax-ppss actually are in 
their experience. It's an important question.
2) Figure out the file sizes where syntax-ppss's performance really does 
become a problem. That can give us data for better defaults later.
3) Play around with two easy solutions that we discussed previously: 
narrowing during font-lock (one of the values for font-lock-large-files 
pretty much matches the current behavior on master), or fontifying only 
the first X characters (e.g. 1000000) of the buffer, and skipping on the 
rest.
4) It should be plain to see that implementing additional approaches 
should be easy enough. For instance, a hybrid like "fontify the first 1 
MB correctly, and the rest - on best-effort basis". Although the value 
'(narrow . 1000000) should provide behavior a very similar behavior 
already. Maybe ever a better one: the boundaries are stable. Maybe sure 
to try it together with (setq bidi-inhibit-hpa t): the result looks very 
fast to me.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-13 16:59                                                                                             ` Dmitry Gutov
@ 2022-08-13 17:26                                                                                               ` Gregory Heytings
  2022-08-13 19:12                                                                                                 ` Dmitry Gutov
  0 siblings, 1 reply; 685+ messages in thread
From: Gregory Heytings @ 2022-08-13 17:26 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: 56682, Eli Zaretskii, Stefan Monnier

[-- Attachment #1: Type: text/plain, Size: 1061 bytes --]


>> That's what I initially thought, too.  Now I tend to think that it 
>> would be better to not decouple these two cases, because it would be 
>> too expensive to distinguish the four possible cases, namely:
>
> I'm fairly sure that my branch demonstrates that there's nothing 
> expensive about it.
>

If you think this, it means you do not fully understand the problem, 
sorry.  Detecting the presence of long lines in a buffer takes time, and 
it takes more time as the buffer becomes larger.  Again all this has been 
discussed, tested and fine-tuned a month ago.

>
> It's just one commit, 20 additions, 10 deletions. It should take 2 
> minutes max to read and understand it.
>

As I said, I tested that commit.  And I understood it, too.  What you do 
there does not even depend on the presence of long lines in the buffer (or 
on the length of the buffer).  Moreover it does not offer any protection 
against modes which use widen in their font locking routines.  Which was 
the main reason to add the locked narrowing feature.

^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-13 17:20                                                                                             ` Dmitry Gutov
@ 2022-08-13 17:43                                                                                               ` Gregory Heytings
  2022-08-13 19:19                                                                                                 ` Dmitry Gutov
  2022-08-13 17:54                                                                                               ` Eli Zaretskii
  2022-08-15 14:03                                                                                               ` Eli Zaretskii
  2 siblings, 1 reply; 685+ messages in thread
From: Gregory Heytings @ 2022-08-13 17:43 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: 56682, Eli Zaretskii, monnier

[-- Attachment #1: Type: text/plain, Size: 2557 bytes --]


>> I already did, and told you that these multi-second delays were still 
>> present in larger JSON files (and therefore also in smaller files with 
>> slower CPUs).
>
> Delays or "a delay"? Just the first time you scroll to EOB? Or did you 
> do the whole dance with editing near BOB, then goto EOB, and repeat?
>

Delays.  When scrolling to EOB and when using isearch, for example.

>>> Then the goal failed because we don't disable bidi hpa? It has a much 
>>> more noticeable effect on editing that font-lock.
>> 
>> That's not correct, no.  The BPA algorithm makes C-n and C-p slower at 
>> the beginning of large files only in a very specific case: when the 
>> beginning of the buffer contains opening brackets whose matching 
>> closing bracket is at the end of the buffer.
>
> To be fair, that's pretty much all JSON files.
>

Again, the aim of this effort has _nothing_ to do with JSON files.

>
> The branch:
>
> 1) Allows everyone interested to evaluate the performance of 
> unrestricted font-lock even in large files (single-line or not) and see 
> how big on a problem the delays caused by syntax-ppss actually are in 
> their experience. It's an important question.
>
> 2) Figure out the file sizes where syntax-ppss's performance really does 
> become a problem. That can give us data for better defaults later.
>

Buffers with long lines are rare enough.  It wouldn't make sense (and 
would be a nightmare in terms of long term maintenance) to add 25 
defcustoms to allow anyone to fine-tune what Emacs does in such buffers.

>
> 3) Play around with two easy solutions that we discussed previously: 
> narrowing during font-lock (one of the values for font-lock-large-files 
> pretty much matches the current behavior on master), or fontifying only 
> the first X characters (e.g. 1000000) of the buffer, and skipping on the 
> rest.
>
> 4) It should be plain to see that implementing additional approaches 
> should be easy enough. For instance, a hybrid like "fontify the first 1 
> MB correctly, and the rest - on best-effort basis". Although the value 
> '(narrow . 1000000) should provide behavior a very similar behavior 
> already. Maybe ever a better one: the boundaries are stable. Maybe sure 
> to try it together with (setq bidi-inhibit-hpa t): the result looks very 
> fast to me.
>

These 3) and 4) assume that the major (and minor) modes are well-behaving, 
and will obey the restrictions.  Which isn't true, and was the reason why 
locked narrowing was introduced.

^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-13 17:20                                                                                             ` Dmitry Gutov
  2022-08-13 17:43                                                                                               ` Gregory Heytings
@ 2022-08-13 17:54                                                                                               ` Eli Zaretskii
  2022-08-13 19:08                                                                                                 ` Dmitry Gutov
  2022-08-15 14:03                                                                                               ` Eli Zaretskii
  2 siblings, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-13 17:54 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: 56682, gregory, monnier

> Date: Sat, 13 Aug 2022 20:20:04 +0300
> Cc: 56682@debbugs.gnu.org, Eli Zaretskii <eliz@gnu.org>,
>  monnier@iro.umontreal.ca
> From: Dmitry Gutov <dgutov@yandex.ru>
> 
> As soon as the file becomes very large, such that font-lock actually 
> becomes costly even in properly written major modes, we can still do one 
> of the two things: apply narrowing during font-lock, or fontify only the 
> beginning of the file.

Fontifying only the beginning of the file doesn't help when the file
is first shown at another point, like when Emacs or emacsclient is
invoked with the +NN[:nn] argument, or the user uses saveplace or
similar package.  That's admittedly rarer than starting at the
beginning, but it's a valid use case, and I wouldn't like us to
dismiss it.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-13 17:54                                                                                               ` Eli Zaretskii
@ 2022-08-13 19:08                                                                                                 ` Dmitry Gutov
  2022-08-14  5:23                                                                                                   ` Eli Zaretskii
  0 siblings, 1 reply; 685+ messages in thread
From: Dmitry Gutov @ 2022-08-13 19:08 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, gregory, monnier

On 13.08.2022 20:54, Eli Zaretskii wrote:
>> Date: Sat, 13 Aug 2022 20:20:04 +0300
>> Cc:56682@debbugs.gnu.org, Eli Zaretskii<eliz@gnu.org>,
>>   monnier@iro.umontreal.ca
>> From: Dmitry Gutov<dgutov@yandex.ru>
>>
>> As soon as the file becomes very large, such that font-lock actually
>> becomes costly even in properly written major modes, we can still do one
>> of the two things: apply narrowing during font-lock, or fontify only the
>> beginning of the file.
> Fontifying only the beginning of the file doesn't help when the file
> is first shown at another point, like when Emacs or emacsclient is
> invoked with the +NN[:nn] argument, or the user uses saveplace or
> similar package.  That's admittedly rarer than starting at the
> beginning, but it's a valid use case, and I wouldn't like us to
> dismiss it.

The beginning of the file is the part of it which we can fontify quickly 
enough while still doing it correctly.

Starting with some position P, jumping to it will show a larger initial 
delay than you might be comfortable with. Maybe it's 1 MB, maybe 10 MB, 
maybe 100 MB. Or more. But such file size exists because syntax-ppss's 
performance depends linearly on the buffer size. So after that position 
we'll not fontify it anymore. That's really the simplest solution.

Because the main alternative on offer is to use narrowing and thus risk 
getting invalid syntax information. The effect is very noticeable in 
dictionary.json: you can just as easily get strings and non-strings 
inverted (the odds are pretty much 50/50). So the "don't fontify past X" 
strategy is simply based on the idea that no fontification is probably 
better than unreliable and obviously incorrect one.

Now, we could develop more complex approaches from there. But this can 
be a starting point, and the user option allows people to choose the 
strategy they're most comfortable with.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-13 17:16                                                                                                       ` Gregory Heytings
@ 2022-08-13 19:10                                                                                                         ` Dmitry Gutov
  2022-08-13 19:54                                                                                                           ` Gregory Heytings
  2022-08-13 21:15                                                                                                         ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  1 sibling, 1 reply; 685+ messages in thread
From: Dmitry Gutov @ 2022-08-13 19:10 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, Eli Zaretskii, Stefan Monnier

On 13.08.2022 20:16, Gregory Heytings wrote:
> 
>>> As I just said to Dmitry: the same multi-second delays we saw in 
>>> smaller JSON files.  And those who have a slower CPU will see these 
>>> multi-second delays with smaller files.
>>
>> No exactly the same ones, though, since the previous tests we did were 
>> done with the older version of JSON support (not the current 
>> js-json-mode), with somewhat different performance characteristics.
>>
> 
> Okay, not "the same ones", but delays of the same order of magnitude 
> nonetheless.  We had that discussion a month ago, and concluded that 
> local fixes in every major (and minor) modes were not the way to go.  
> Having that discussion again does not seem fruitful.

Did you have that discussion with other people who have not authored a 
single major mode? That's ridiculous.

> You improved 
> js-mode and created json-mode, that's fine, but it doesn't change 
                       ^
                        js-json-mode

> anything to the way all other major (and minor) modes behave.

It showed specific pitfalls we can take care of in other major modes as 
well.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-13 17:26                                                                                               ` Gregory Heytings
@ 2022-08-13 19:12                                                                                                 ` Dmitry Gutov
  2022-08-14  5:29                                                                                                   ` Eli Zaretskii
  0 siblings, 1 reply; 685+ messages in thread
From: Dmitry Gutov @ 2022-08-13 19:12 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, Eli Zaretskii, Stefan Monnier

On 13.08.2022 20:26, Gregory Heytings wrote:
> 
>>> That's what I initially thought, too.  Now I tend to think that it 
>>> would be better to not decouple these two cases, because it would be 
>>> too expensive to distinguish the four possible cases, namely:
>>
>> I'm fairly sure that my branch demonstrates that there's nothing 
>> expensive about it.
>>
> 
> If you think this, it means you do not fully understand the problem, 
> sorry.  Detecting the presence of long lines in a buffer takes time, and 
> it takes more time as the buffer becomes larger.

How is that relevant? font-lock's performance does not depend on the 
presence of long lines.

>> It's just one commit, 20 additions, 10 deletions. It should take 2 
>> minutes max to read and understand it.
>>
> 
> As I said, I tested that commit.  And I understood it, too.  What you do 
> there does not even depend on the presence of long lines in the buffer 
> (or on the length of the buffer).

Exactly.

> Moreover it does not offer any 
> protection against modes which use widen in their font locking 
> routines.  Which was the main reason to add the locked narrowing feature.

The only modes we know that do that (CC Mode) are also incompatible with 
your code. Your "protection" breaks it.

And when CC Mode is fixed to work inside a narrowing, it will 
automatically become compatible with my proposal.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-13 17:43                                                                                               ` Gregory Heytings
@ 2022-08-13 19:19                                                                                                 ` Dmitry Gutov
  2022-08-14  5:36                                                                                                   ` Eli Zaretskii
  0 siblings, 1 reply; 685+ messages in thread
From: Dmitry Gutov @ 2022-08-13 19:19 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, Eli Zaretskii, monnier

On 13.08.2022 20:43, Gregory Heytings wrote:
> 
>>> I already did, and told you that these multi-second delays were still 
>>> present in larger JSON files (and therefore also in smaller files 
>>> with slower CPUs).
>>
>> Delays or "a delay"? Just the first time you scroll to EOB? Or did you 
>> do the whole dance with editing near BOB, then goto EOB, and repeat?
>>
> 
> Delays.  When scrolling to EOB and when using isearch, for example.
> 
>>>> Then the goal failed because we don't disable bidi hpa? It has a 
>>>> much more noticeable effect on editing that font-lock.
>>>
>>> That's not correct, no.  The BPA algorithm makes C-n and C-p slower 
>>> at the beginning of large files only in a very specific case: when 
>>> the beginning of the buffer contains opening brackets whose matching 
>>> closing bracket is at the end of the buffer.
>>
>> To be fair, that's pretty much all JSON files.
>>
> 
> Again, the aim of this effort has _nothing_ to do with JSON files.

What kind of files are your main target?

>> The branch:
>>
>> 1) Allows everyone interested to evaluate the performance of 
>> unrestricted font-lock even in large files (single-line or not) and 
>> see how big on a problem the delays caused by syntax-ppss actually are 
>> in their experience. It's an important question.
>>
>> 2) Figure out the file sizes where syntax-ppss's performance really 
>> does become a problem. That can give us data for better defaults later.
>>
> 
> Buffers with long lines are rare enough.  It wouldn't make sense (and 
> would be a nightmare in terms of long term maintenance) to add 25 
> defcustoms to allow anyone to fine-tune what Emacs does in such buffers.

I have regularly encountered redisplay slowdown caused by long lines in 
my work. One doesn't need to have a 18 MB files to see them.

Having a 5000-10000 character line is enough to see redisplay starting 
to stutter. And, of course, there's nothing font-lock related in those 
stutters.

>> 3) Play around with two easy solutions that we discussed previously: 
>> narrowing during font-lock (one of the values for 
>> font-lock-large-files pretty much matches the current behavior on 
>> master), or fontifying only the first X characters (e.g. 1000000) of 
>> the buffer, and skipping on the rest.
>>
>> 4) It should be plain to see that implementing additional approaches 
>> should be easy enough. For instance, a hybrid like "fontify the first 
>> 1 MB correctly, and the rest - on best-effort basis". Although the 
>> value '(narrow . 1000000) should provide behavior a very similar 
>> behavior already. Maybe ever a better one: the boundaries are stable. 
>> Maybe sure to try it together with (setq bidi-inhibit-hpa t): the 
>> result looks very fast to me.
>>
> 
> These 3) and 4) assume that the major (and minor) modes are 
> well-behaving, and will obey the restrictions.  Which isn't true, and 
> was the reason why locked narrowing was introduced.

What are your examples of misbehaving major/minor modes?





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-13 19:10                                                                                                         ` Dmitry Gutov
@ 2022-08-13 19:54                                                                                                           ` Gregory Heytings
  2022-08-13 20:19                                                                                                             ` Dmitry Gutov
  0 siblings, 1 reply; 685+ messages in thread
From: Gregory Heytings @ 2022-08-13 19:54 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: 56682, Eli Zaretskii, Stefan Monnier


>> We had that discussion a month ago, and concluded that local fixes in 
>> every major (and minor) modes were not the way to go.  Having that 
>> discussion again does not seem fruitful.
>
> Did you have that discussion with other people who have not authored a 
> single major mode? That's ridiculous.
>

You mean, Eli, Lars and me?  I agree with you, we're indeed ridiculous.

>
> It showed specific pitfalls we can take care of in other major modes as 
> well.
>

It doesn't.  Please do (on you Core i9 computer):

for i in $(seq 1 60); do cat dictionary.json; done > hugedictionary.json

Now open that file with the code on master, and with your branch, and type 
M->.  With the code on master the effect is instantaneous (about 50 ms on 
my computer), with your branch it takes ~20 seconds (21 seconds on my 
computer).  If you cannot see the difference, I don't know what else I 
could say.  And please don't tell me "but this is not the kind of file 
size we should care about".  That would be wrong, both because we do care 
about that file size, and because if that basic operation takes 20 seconds 
in a 1 GB file on your Core i9 computer, that same basic operation will 
take 20 seconds on a 20 MB or 50 MB file for someone else who has a slower 
CPU.

Again, the right thing to do here is to improve the efficiency of 
syntax-ppss in one way or another.  Of course, doing that is several 
orders of magnitude more difficult than just undoing what others have 
already done and claiming that the result is better.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-13 19:54                                                                                                           ` Gregory Heytings
@ 2022-08-13 20:19                                                                                                             ` Dmitry Gutov
  0 siblings, 0 replies; 685+ messages in thread
From: Dmitry Gutov @ 2022-08-13 20:19 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, Eli Zaretskii, Stefan Monnier

On 13.08.2022 22:54, Gregory Heytings wrote:
>> It showed specific pitfalls we can take care of in other major modes 
>> as well.
>>
> 
> It doesn't.  Please do (on you Core i9 computer):
> 
> for i in $(seq 1 60); do cat dictionary.json; done > hugedictionary.json
> 
> Now open that file with the code on master, and with your branch, and 
> type M->.  With the code on master the effect is instantaneous (about 50 
> ms on my computer), with your branch it takes ~20 seconds (21 seconds on 
> my computer).  If you cannot see the difference, I don't know what else 
> I could say.  And please don't tell me "but this is not the kind of file 
> size we should care about".

Why would I tell you that after I already spent the effort (yesterday 
morning) to make sure the branch contains whole two alternative working 
strategies for handling such very large files?

Should I explain them again?





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-13 17:16                                                                                                       ` Gregory Heytings
  2022-08-13 19:10                                                                                                         ` Dmitry Gutov
@ 2022-08-13 21:15                                                                                                         ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  1 sibling, 0 replies; 685+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2022-08-13 21:15 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, Eli Zaretskii, Dmitry Gutov

> fixes in every major (and minor) modes were not the way to go.

I think we do want to encourage such fixes since they have other
benefits.  So while we can't rely on those happening everywhere, indeed,
we do want to be able to take advantage of them, otherwise there won't
be any incentive to fix those problems.


        Stefan






^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-13 19:08                                                                                                 ` Dmitry Gutov
@ 2022-08-14  5:23                                                                                                   ` Eli Zaretskii
  2022-08-14 10:29                                                                                                     ` Dmitry Gutov
  0 siblings, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-14  5:23 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: 56682, gregory, monnier

> Date: Sat, 13 Aug 2022 22:08:25 +0300
> Cc: 56682@debbugs.gnu.org, gregory@heytings.org, monnier@iro.umontreal.ca
> From: Dmitry Gutov <dgutov@yandex.ru>
> 
> > Fontifying only the beginning of the file doesn't help when the file
> > is first shown at another point, like when Emacs or emacsclient is
> > invoked with the +NN[:nn] argument, or the user uses saveplace or
> > similar package.  That's admittedly rarer than starting at the
> > beginning, but it's a valid use case, and I wouldn't like us to
> > dismiss it.
> 
> The beginning of the file is the part of it which we can fontify quickly 
> enough while still doing it correctly.

I know, but we are not doing only what is easy to do, do we?  We do
(or should do) what the users expect.  In this case, if we want to
fontify some relatively small portion of the document, it should be
the portion around where the file is first displayed.

> Because the main alternative on offer is to use narrowing and thus risk 
> getting invalid syntax information.

That alternative is a direct and somewhat simplistic way of
restricting misbehaving fontification, so as to prevent them from
making Emacs unresponsive.  Smarter alternatives -- and you seem to be
arguing for such -- should be smarter, not less so.  They should be
like what you installed for JSON on master.

> So the "don't fontify past X" strategy is simply based on the idea
> that no fontification is probably better than unreliable and
> obviously incorrect one.

I disagree with that idea, but if someone agrees with you, they can
simply turn off font-lock.  As was already mentioned many times in
this endless discussion.

> Now, we could develop more complex approaches from there. But this can 
> be a starting point, and the user option allows people to choose the 
> strategy they're most comfortable with.

Sorry, I don't consider this (fontifying the beginning of a file) a
good starting point for making any progress towards smarter, faster
fontifications.  The new json-mode is such a starting point, but we
should do something similar for other major modes as well.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-13 19:12                                                                                                 ` Dmitry Gutov
@ 2022-08-14  5:29                                                                                                   ` Eli Zaretskii
  2022-08-14  9:54                                                                                                     ` Dmitry Gutov
  0 siblings, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-14  5:29 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: 56682, gregory, monnier

> Date: Sat, 13 Aug 2022 22:12:42 +0300
> Cc: 56682@debbugs.gnu.org, Eli Zaretskii <eliz@gnu.org>,
>  Stefan Monnier <monnier@iro.umontreal.ca>
> From: Dmitry Gutov <dgutov@yandex.ru>
> 
> > Moreover it does not offer any 
> > protection against modes which use widen in their font locking 
> > routines.  Which was the main reason to add the locked narrowing feature.
> 
> The only modes we know that do that (CC Mode)

AFAIU, currently _all_ modes widen, because font-lock does.  That part
was not yet fixed in font-0lock, was it?

> are also incompatible with your code. Your "protection" breaks it.

For some value of "breaks".

And that is a deliberate "breakage": we consider responsive Emacs more
important than correct fontification or "accurate" operation of modes
such as CC Mode.  As was already explained numerous times here, and
arguing about that should by now be understood as being futile.
People who disagree with that default can customize
long-line-threshold to a larger value or to a nil value.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-13 19:19                                                                                                 ` Dmitry Gutov
@ 2022-08-14  5:36                                                                                                   ` Eli Zaretskii
  2022-08-14  9:41                                                                                                     ` Dmitry Gutov
  0 siblings, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-14  5:36 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: 56682, gregory, monnier

> Date: Sat, 13 Aug 2022 22:19:26 +0300
> Cc: 56682@debbugs.gnu.org, Eli Zaretskii <eliz@gnu.org>,
>  monnier@iro.umontreal.ca
> From: Dmitry Gutov <dgutov@yandex.ru>
> 
> > Buffers with long lines are rare enough.  It wouldn't make sense (and 
> > would be a nightmare in terms of long term maintenance) to add 25 
> > defcustoms to allow anyone to fine-tune what Emacs does in such buffers.
> 
> I have regularly encountered redisplay slowdown caused by long lines in 
> my work. One doesn't need to have a 18 MB files to see them.
> 
> Having a 5000-10000 character line is enough to see redisplay starting 
> to stutter. And, of course, there's nothing font-lock related in those 
> stutters.

Stuttering in redisplay (and I think you actually mean stuttering in
cursor motion commands, but let's ignore that difference for now) is a
known issue, but it is NOT the goal of this effort.  The goal of this
effort is to avoid making Emacs _completely_unusable_ due to the need
to wait for many seconds for commands to complete and their results to
be shown on display.  Stuttering, while somewhat annoying, doesn't
make Emacs unusable.

So if you are talking about the cases of stuttering, you are focused
on cases that are of no particular interest to us here.  Of course,
any improvement in those other cases will also be welcome, but it is
not directly related to what we are trying to do here, and may or may
not solve the cases that are of interest to us.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-14  5:36                                                                                                   ` Eli Zaretskii
@ 2022-08-14  9:41                                                                                                     ` Dmitry Gutov
  2022-08-14 13:02                                                                                                       ` Eli Zaretskii
  0 siblings, 1 reply; 685+ messages in thread
From: Dmitry Gutov @ 2022-08-14  9:41 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, gregory, monnier

On 14.08.2022 08:36, Eli Zaretskii wrote:
>> Date: Sat, 13 Aug 2022 22:19:26 +0300
>> Cc:56682@debbugs.gnu.org, Eli Zaretskii<eliz@gnu.org>,
>>   monnier@iro.umontreal.ca
>> From: Dmitry Gutov<dgutov@yandex.ru>
>>
>>> Buffers with long lines are rare enough.  It wouldn't make sense (and
>>> would be a nightmare in terms of long term maintenance) to add 25
>>> defcustoms to allow anyone to fine-tune what Emacs does in such buffers.
>> I have regularly encountered redisplay slowdown caused by long lines in
>> my work. One doesn't need to have a 18 MB files to see them.
>>
>> Having a 5000-10000 character line is enough to see redisplay starting
>> to stutter. And, of course, there's nothing font-lock related in those
>> stutters.
> Stuttering in redisplay (and I think you actually mean stuttering in
> cursor motion commands, but let's ignore that difference for now) is a
> known issue, but it is NOT the goal of this effort.  The goal of this
> effort is to avoid making Emacs_completely_unusable_  due to the need
> to wait for many seconds for commands to complete and their results to
> be shown on display.  Stuttering, while somewhat annoying, doesn't
> make Emacs unusable.
> 
> So if you are talking about the cases of stuttering, you are focused
> on cases that are of no particular interest to us here.  Of course,
> any improvement in those other cases will also be welcome, but it is
> not directly related to what we are trying to do here, and may or may
> not solve the cases that are of interest to us.

They *are* solved by Gregory's work.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-14  5:29                                                                                                   ` Eli Zaretskii
@ 2022-08-14  9:54                                                                                                     ` Dmitry Gutov
  0 siblings, 0 replies; 685+ messages in thread
From: Dmitry Gutov @ 2022-08-14  9:54 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, gregory, monnier

On 14.08.2022 08:29, Eli Zaretskii wrote:
>> Date: Sat, 13 Aug 2022 22:12:42 +0300
>> Cc: 56682@debbugs.gnu.org, Eli Zaretskii <eliz@gnu.org>,
>>   Stefan Monnier <monnier@iro.umontreal.ca>
>> From: Dmitry Gutov <dgutov@yandex.ru>
>>
>>> Moreover it does not offer any
>>> protection against modes which use widen in their font locking
>>> routines.  Which was the main reason to add the locked narrowing feature.
>>
>> The only modes we know that do that (CC Mode)
> 
> AFAIU, currently _all_ modes widen, because font-lock does.  That part
> was not yet fixed in font-0lock, was it?

The changes on the branch are right in that area:

-    (unless font-lock-dont-widen (widen))
+    (pcase-exhaustive font-lock-large-files
+      (`t nil)
+      (`(head . ,length)
+       (setq beg (min length beg)
+             end (min length end)))
+      (`(narrow . ,width)
+       (narrow-to-region (max (point-min) (* (1- (/ beg width)) width))
+                         (min (point-max) (* (1+ (/ beg width)) width)))
+       (setq end (min end (point-max)))))
+    (unless (or font-lock-dont-widen
+                (eq (car-safe font-lock-large-files) 'narrow))
+      (widen))

>> are also incompatible with your code. Your "protection" breaks it.
> 
> For some value of "breaks".
> 
> And that is a deliberate "breakage": we consider responsive Emacs more
> important than correct fontification or "accurate" operation of modes
> such as CC Mode.  As was already explained numerous times here, and
> arguing about that should by now be understood as being futile.
> People who disagree with that default can customize
> long-line-threshold to a larger value or to a nil value.

Due to its current way of operation, it might spam errors to the echo 
area, break some navigation commands, or even freeze. I imagine it'll be 
not so easy to rework that.

Though I'd of course welcome that: if you recall the older talks about 
switching it to the syntax-propertize approach, it's one way to do that.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-14  5:23                                                                                                   ` Eli Zaretskii
@ 2022-08-14 10:29                                                                                                     ` Dmitry Gutov
  2022-08-14 13:15                                                                                                       ` Eli Zaretskii
  2022-08-14 16:16                                                                                                       ` Gregory Heytings
  0 siblings, 2 replies; 685+ messages in thread
From: Dmitry Gutov @ 2022-08-14 10:29 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, gregory, monnier

On 14.08.2022 08:23, Eli Zaretskii wrote:
>> Date: Sat, 13 Aug 2022 22:08:25 +0300
>> Cc: 56682@debbugs.gnu.org, gregory@heytings.org, monnier@iro.umontreal.ca
>> From: Dmitry Gutov <dgutov@yandex.ru>
>>
>>> Fontifying only the beginning of the file doesn't help when the file
>>> is first shown at another point, like when Emacs or emacsclient is
>>> invoked with the +NN[:nn] argument, or the user uses saveplace or
>>> similar package.  That's admittedly rarer than starting at the
>>> beginning, but it's a valid use case, and I wouldn't like us to
>>> dismiss it.
>>
>> The beginning of the file is the part of it which we can fontify quickly
>> enough while still doing it correctly.
> 
> I know, but we are not doing only what is easy to do, do we?  We do
> (or should do) what the users expect.  In this case, if we want to
> fontify some relatively small portion of the document, it should be
> the portion around where the file is first displayed.

There's no point in doing that. Either we narrow to some area around 
point (might even using a larger radius like 1 MB), or we we only 
fontify up to some position. The former easily creates bad fontification.

The alternative, of course, is to pay the price of syntax-ppss on larger 
spans and wait the corresponding amount of time the first time the user 
scrolls to EOB. That's what the current default on the branch does.

>> Because the main alternative on offer is to use narrowing and thus risk
>> getting invalid syntax information.
> 
> That alternative is a direct and somewhat simplistic way of
> restricting misbehaving fontification, so as to prevent them from
> making Emacs unresponsive.  Smarter alternatives -- and you seem to be
> arguing for such -- should be smarter, not less so.  They should be
> like what you installed for JSON on master.

js-json-mode is not an "alternative", it's just doing what font-lock is 
supposed to do (I fixed the outstanding problems with the rules).

But as Gregory shows, when you get to _really_ large files (like 1 GB 
JSON file in his example), pressing M-> will still make you wait (I have 
to wait around 20 seconds).

It's still a great improvement from what we had in Emacs 28, though, so 
I'm fine with this default too.

>> So the "don't fontify past X" strategy is simply based on the idea
>> that no fontification is probably better than unreliable and
>> obviously incorrect one.
> 
> I disagree with that idea, but if someone agrees with you, they can
> simply turn off font-lock.  As was already mentioned many times in
> this endless discussion.

If someone agrees with me, they will simply be able to customize 
font-lock-large-files to choose this strategy.

I do not really insist on it being the default. But being able to choose 
this approach (in the absence of better upcoming alternatives) is a good 
thing.

>> Now, we could develop more complex approaches from there. But this can
>> be a starting point, and the user option allows people to choose the
>> strategy they're most comfortable with.
> 
> Sorry, I don't consider this (fontifying the beginning of a file) a
> good starting point for making any progress towards smarter, faster
> fontifications.  The new json-mode is such a starting point, but we
> should do something similar for other major modes as well.

I'm still waiting for people to come forward with other major modes 
which have the same kind of problems. Preferably ones that are likely to 
be used with large files.

But as mentioned, that does not preclude us from having to choose what 
to do with _really_ large files.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-14  9:41                                                                                                     ` Dmitry Gutov
@ 2022-08-14 13:02                                                                                                       ` Eli Zaretskii
  2022-08-14 15:37                                                                                                         ` Dmitry Gutov
  0 siblings, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-14 13:02 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: 56682, gregory, monnier

> Date: Sun, 14 Aug 2022 12:41:33 +0300
> Cc: 56682@debbugs.gnu.org, gregory@heytings.org, monnier@iro.umontreal.ca
> From: Dmitry Gutov <dgutov@yandex.ru>
> 
> > Stuttering in redisplay (and I think you actually mean stuttering in
> > cursor motion commands, but let's ignore that difference for now) is a
> > known issue, but it is NOT the goal of this effort.  The goal of this
> > effort is to avoid making Emacs_completely_unusable_  due to the need
> > to wait for many seconds for commands to complete and their results to
> > be shown on display.  Stuttering, while somewhat annoying, doesn't
> > make Emacs unusable.
> > 
> > So if you are talking about the cases of stuttering, you are focused
> > on cases that are of no particular interest to us here.  Of course,
> > any improvement in those other cases will also be welcome, but it is
> > not directly related to what we are trying to do here, and may or may
> > not solve the cases that are of interest to us.
> 
> They *are* solved by Gregory's work.

Not in all cases and not on all systems.  I still see stuttering in
some cases, at least with my unoptimized builds, and I don't consider
that a problem.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-14 10:29                                                                                                     ` Dmitry Gutov
@ 2022-08-14 13:15                                                                                                       ` Eli Zaretskii
  2022-08-14 17:47                                                                                                         ` Dmitry Gutov
  2022-08-14 16:16                                                                                                       ` Gregory Heytings
  1 sibling, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-14 13:15 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: 56682, gregory, monnier

> Date: Sun, 14 Aug 2022 13:29:42 +0300
> Cc: 56682@debbugs.gnu.org, gregory@heytings.org, monnier@iro.umontreal.ca
> From: Dmitry Gutov <dgutov@yandex.ru>
> 
> > I know, but we are not doing only what is easy to do, do we?  We do
> > (or should do) what the users expect.  In this case, if we want to
> > fontify some relatively small portion of the document, it should be
> > the portion around where the file is first displayed.
> 
> There's no point in doing that. Either we narrow to some area around 
> point (might even using a larger radius like 1 MB), or we we only 
> fontify up to some position. The former easily creates bad fontification.
> 
> The alternative, of course, is to pay the price of syntax-ppss on larger 
> spans and wait the corresponding amount of time the first time the user 
> scrolls to EOB. That's what the current default on the branch does.

You are still thinking in terms of the original design of syntactical
analysis which strives to produce 100% accurate results.  That design
principle doesn't work with very long lines, so sticking to it would
indeed lead us to give up on solving the problem.

The better way is to acknowledge that some inaccuracies are acceptable
in those cases.  With that in mind, one can design a syntax analyzer
that looks back only a short ways, until it finds some place that
could reasonably serve as an anchor point for heuristic decisions
about whether we are inside or outside a string or comment, and then
verifying that guess with some telltale syntactic elements that follow
(like semi-colons or comment-end delimiters in C).  While this kind of
heuristics can sometimes fail, if they only fail rarely, the result is
a huge win.

> But as Gregory shows, when you get to _really_ large files (like 1 GB 
> JSON file in his example), pressing M-> will still make you wait (I have 
> to wait around 20 seconds).

Try with the latest master, it might have improved (fingers crossed).

In any case, the way to speed up these cases is to look at the profile
and identify the code that is slowing us down; then attempt to make it
faster.  (20 sec is actually long enough for us to interrupt Emacs
under a debugger and look at the backtrace to find the culprit.)

> >> So the "don't fontify past X" strategy is simply based on the idea
> >> that no fontification is probably better than unreliable and
> >> obviously incorrect one.
> > 
> > I disagree with that idea, but if someone agrees with you, they can
> > simply turn off font-lock.  As was already mentioned many times in
> > this endless discussion.
> 
> If someone agrees with me, they will simply be able to customize 
> font-lock-large-files to choose this strategy.

If that solves the problems in a reasonable way for very long lines,
maybe we will eventually have such an option.

> I'm still waiting for people to come forward with other major modes 
> which have the same kind of problems. Preferably ones that are likely to 
> be used with large files.

One such major mode and one such file was presented long ago : a
single-line XML file.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-14 13:02                                                                                                       ` Eli Zaretskii
@ 2022-08-14 15:37                                                                                                         ` Dmitry Gutov
  2022-08-14 16:24                                                                                                           ` Gregory Heytings
  0 siblings, 1 reply; 685+ messages in thread
From: Dmitry Gutov @ 2022-08-14 15:37 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, gregory, monnier

On 14.08.2022 16:02, Eli Zaretskii wrote:
>> Date: Sun, 14 Aug 2022 12:41:33 +0300
>> Cc:56682@debbugs.gnu.org,gregory@heytings.org,monnier@iro.umontreal.ca
>> From: Dmitry Gutov<dgutov@yandex.ru>
>>
>>> Stuttering in redisplay (and I think you actually mean stuttering in
>>> cursor motion commands, but let's ignore that difference for now) is a
>>> known issue, but it is NOT the goal of this effort.  The goal of this
>>> effort is to avoid making Emacs_completely_unusable_  due to the need
>>> to wait for many seconds for commands to complete and their results to
>>> be shown on display.  Stuttering, while somewhat annoying, doesn't
>>> make Emacs unusable.
>>>
>>> So if you are talking about the cases of stuttering, you are focused
>>> on cases that are of no particular interest to us here.  Of course,
>>> any improvement in those other cases will also be welcome, but it is
>>> not directly related to what we are trying to do here, and may or may
>>> not solve the cases that are of interest to us.
>> They*are*  solved by Gregory's work.
> Not in all cases and not on all systems.  I still see stuttering in
> some cases, at least with my unoptimized builds, and I don't consider
> that a problem.

Point is, Gregory's work improves performance in many real-world 
scenarios, not just in rare special files.

So being able to fine-tune the behavior makes sense. Certainly not a 
"maintenance nightmare".





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-14 10:29                                                                                                     ` Dmitry Gutov
  2022-08-14 13:15                                                                                                       ` Eli Zaretskii
@ 2022-08-14 16:16                                                                                                       ` Gregory Heytings
  2022-08-14 17:54                                                                                                         ` Dmitry Gutov
  1 sibling, 1 reply; 685+ messages in thread
From: Gregory Heytings @ 2022-08-14 16:16 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: 56682, Eli Zaretskii, monnier


>
> The alternative, of course, is to pay the price of syntax-ppss on larger 
> spans and wait the corresponding amount of time the first time the user 
> scrolls to EOB.
>

Or to speed up syntax-ppss in a way or another.

>
> But as Gregory shows, when you get to _really_ large files (like 1 GB 
> JSON file in his example), pressing M-> will still make you wait (I have 
> to wait around 20 seconds).
>

Or when you have a slower CPU, with moderately large files.

>
> But being able to choose this approach (in the absence of better 
> upcoming alternatives) is a good thing.
>

The problem is (again) that what you would like does not provide any 
protection against modes which use widen inside their fontification 
routines.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-14 15:37                                                                                                         ` Dmitry Gutov
@ 2022-08-14 16:24                                                                                                           ` Gregory Heytings
  2022-08-14 17:51                                                                                                             ` Dmitry Gutov
  0 siblings, 1 reply; 685+ messages in thread
From: Gregory Heytings @ 2022-08-14 16:24 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: 56682, Eli Zaretskii, monnier


>
> So being able to fine-tune the behavior makes sense. Certainly not a 
> "maintenance nightmare".
>

If the conclusion is, after some reasonable effort, that there is no way 
to make syntax-ppss significantly faster in one way or another in such 
cases, and that there is no way to make font locking reasonably accurate 
even when it doesn't have access to the whole buffer, it might make sense 
to provide user options to fine-tune the behavior.  But we are not there 
yet.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-14 13:15                                                                                                       ` Eli Zaretskii
@ 2022-08-14 17:47                                                                                                         ` Dmitry Gutov
  2022-08-14 17:59                                                                                                           ` Eli Zaretskii
  0 siblings, 1 reply; 685+ messages in thread
From: Dmitry Gutov @ 2022-08-14 17:47 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, gregory, monnier

On 14.08.2022 16:15, Eli Zaretskii wrote:

>> There's no point in doing that. Either we narrow to some area around
>> point (might even using a larger radius like 1 MB), or we we only
>> fontify up to some position. The former easily creates bad fontification.
>>
>> The alternative, of course, is to pay the price of syntax-ppss on larger
>> spans and wait the corresponding amount of time the first time the user
>> scrolls to EOB. That's what the current default on the branch does.
> 
> You are still thinking in terms of the original design of syntactical
> analysis which strives to produce 100% accurate results.  That design
> principle doesn't work with very long lines, so sticking to it would
> indeed lead us to give up on solving the problem.

s/very long lines/very large files

In any case, the "original design" is not going anywhere (as the only 
way to achieve correctness), and I'm talking in terms of balance between 
accuracy and performance. To use Gregory's narrowing approach in 
font-lock, checkout the branch under discussion 
(scratch/font_lock_large_files) and evaluate

   (setq font-lock-large-files '(narrow . 5000))

You'll see the same behavior as on master now (except narrowing isn't 
"hard"), with the same performance characteristics.

> The better way is to acknowledge that some inaccuracies are acceptable
> in those cases.  With that in mind, one can design a syntax analyzer
> that looks back only a short ways, until it finds some place that
> could reasonably serve as an anchor point for heuristic decisions
> about whether we are inside or outside a string or comment, and then
> verifying that guess with some telltale syntactic elements that follow
> (like semi-colons or comment-end delimiters in C).  While this kind of
> heuristics can sometimes fail, if they only fail rarely, the result is
> a huge win.

You cannot design a language-agnostic syntax analyzer like that. It's 
something every major mode would have to consider how to implement.

It's relatively easy to design for JSON (again) because the syntax is so 
simple, but for others -- not so much.

So we need to settle on the basic design first. The code on the branch 
includes the narrowing approach which is trivially extended to use the 
"find safe place" hook when it's available. But it won't be always 
available.

>> But as Gregory shows, when you get to _really_ large files (like 1 GB
>> JSON file in his example), pressing M-> will still make you wait (I have
>> to wait around 20 seconds).
> 
> Try with the latest master, it might have improved (fingers crossed).

All improvements are welcome, but that's unlikely:

> In any case, the way to speed up these cases is to look at the profile
> and identify the code that is slowing us down; then attempt to make it
> faster.  (20 sec is actually long enough for us to interrupt Emacs
> under a debugger and look at the backtrace to find the culprit.)

I've profiled and benchmarked this scenario already: all of the delay 
(17 seconds, to be precise) come from parse-partial-sexp. 1 GB is a lot.

>>>> So the "don't fontify past X" strategy is simply based on the idea
>>>> that no fontification is probably better than unreliable and
>>>> obviously incorrect one.
>>>
>>> I disagree with that idea, but if someone agrees with you, they can
>>> simply turn off font-lock.  As was already mentioned many times in
>>> this endless discussion.
>>
>> If someone agrees with me, they will simply be able to customize
>> font-lock-large-files to choose this strategy.
> 
> If that solves the problems in a reasonable way for very long lines,
> maybe we will eventually have such an option.

Can I merge the branch, then?

I was hoping for a stylistic review, perhaps. Like, whether you like the 
name of the variable, and should it be split in two.

A change of the default value(s) is on the table too.

>> I'm still waiting for people to come forward with other major modes
>> which have the same kind of problems. Preferably ones that are likely to
>> be used with large files.
> 
> One such major mode and one such file was presented long ago : a
> single-line XML file.

XMl is indeed slower. It takes almost 3 seconds for me to scroll to the 
end of a 20 MB XML file.

Most of it comes from sgml--syntax-propertize-ppss, which is probably 
justified: XML is a more complex language.

But other than the initial delay, scrolling, and isearch, and local 
editing, all work fast, unlike the original situation with JSON.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-14 16:24                                                                                                           ` Gregory Heytings
@ 2022-08-14 17:51                                                                                                             ` Dmitry Gutov
  2022-08-14 17:54                                                                                                               ` Gregory Heytings
  2022-08-14 18:01                                                                                                               ` Eli Zaretskii
  0 siblings, 2 replies; 685+ messages in thread
From: Dmitry Gutov @ 2022-08-14 17:51 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, Eli Zaretskii, monnier

On 14.08.2022 19:24, Gregory Heytings wrote:
> 
>>
>> So being able to fine-tune the behavior makes sense. Certainly not a 
>> "maintenance nightmare".
>>
> 
> If the conclusion is, after some reasonable effort, that there is no way 
> to make syntax-ppss significantly faster in one way or another in such 
> cases, and that there is no way to make font locking reasonably accurate 
> even when it doesn't have access to the whole buffer, it might make 
> sense to provide user options to fine-tune the behavior.  But we are not 
> there yet.

Both conclusions lead to removing the applications of narrowing from 
handle_fontified_prop. So how about we either do that (defaulting to 
accurate font-lock), or merge the branch I proposed, and then continue 
on to the more complex developments?

Implementing the "font locking reasonably accurate even when it doesn't 
have access to the whole buffer" would also have to be implemented in 
Lisp, so narrowing outside of font-lock doesn't make sense.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-14 17:51                                                                                                             ` Dmitry Gutov
@ 2022-08-14 17:54                                                                                                               ` Gregory Heytings
  2022-08-14 18:18                                                                                                                 ` Dmitry Gutov
  2022-08-14 18:01                                                                                                               ` Eli Zaretskii
  1 sibling, 1 reply; 685+ messages in thread
From: Gregory Heytings @ 2022-08-14 17:54 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: 56682, Eli Zaretskii, monnier

[-- Attachment #1: Type: text/plain, Size: 606 bytes --]


>> If the conclusion is, after some reasonable effort, that there is no 
>> way to make syntax-ppss significantly faster in one way or another in 
>> such cases, and that there is no way to make font locking reasonably 
>> accurate even when it doesn't have access to the whole buffer, it might 
>> make sense to provide user options to fine-tune the behavior.  But we 
>> are not there yet.
>
> Both conclusions lead to removing the applications of narrowing from 
> handle_fontified_prop.
>

I have seen no effort whatsoever to make syntax-ppss significantly faster 
in one way or another.

^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-14 16:16                                                                                                       ` Gregory Heytings
@ 2022-08-14 17:54                                                                                                         ` Dmitry Gutov
  2022-08-14 18:47                                                                                                           ` Gregory Heytings
  2022-08-15  1:23                                                                                                           ` Ihor Radchenko
  0 siblings, 2 replies; 685+ messages in thread
From: Dmitry Gutov @ 2022-08-14 17:54 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, Eli Zaretskii, monnier

On 14.08.2022 19:16, Gregory Heytings wrote:
> 
>>
>> The alternative, of course, is to pay the price of syntax-ppss on 
>> larger spans and wait the corresponding amount of time the first time 
>> the user scrolls to EOB.
>>
> 
> Or to speed up syntax-ppss in a way or another.

I suggest you try tweaking parse-partial-sexp's implementation.

>> But as Gregory shows, when you get to _really_ large files (like 1 GB 
>> JSON file in his example), pressing M-> will still make you wait (I 
>> have to wait around 20 seconds).
>>
> 
> Or when you have a slower CPU, with moderately large files.

I doubt there are any CPUs in wide use that are even 5x slower than mine.

And even 200 MB is pretty large, and not something we've been reasonable 
able to edit before.

>> But being able to choose this approach (in the absence of better 
>> upcoming alternatives) is a good thing.
>>
> 
> The problem is (again) that what you would like does not provide any 
> protection against modes which use widen inside their fontification 
> routines.

Do you have examples of such modes?

Calling 'widen' inside font-lock-keywords is a bug, and the bugs should 
be fixed at the source.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-14 17:47                                                                                                         ` Dmitry Gutov
@ 2022-08-14 17:59                                                                                                           ` Eli Zaretskii
  2022-08-14 20:46                                                                                                             ` Dmitry Gutov
  0 siblings, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-14 17:59 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: 56682, gregory, monnier

> Date: Sun, 14 Aug 2022 20:47:40 +0300
> Cc: 56682@debbugs.gnu.org, gregory@heytings.org, monnier@iro.umontreal.ca
> From: Dmitry Gutov <dgutov@yandex.ru>
> 
> > The better way is to acknowledge that some inaccuracies are acceptable
> > in those cases.  With that in mind, one can design a syntax analyzer
> > that looks back only a short ways, until it finds some place that
> > could reasonably serve as an anchor point for heuristic decisions
> > about whether we are inside or outside a string or comment, and then
> > verifying that guess with some telltale syntactic elements that follow
> > (like semi-colons or comment-end delimiters in C).  While this kind of
> > heuristics can sometimes fail, if they only fail rarely, the result is
> > a huge win.
> 
> You cannot design a language-agnostic syntax analyzer like that.

_I_ cannot, but hopefully someone else will.

> > In any case, the way to speed up these cases is to look at the profile
> > and identify the code that is slowing us down; then attempt to make it
> > faster.  (20 sec is actually long enough for us to interrupt Emacs
> > under a debugger and look at the backtrace to find the culprit.)
> 
> I've profiled and benchmarked this scenario already: all of the delay 
> (17 seconds, to be precise) come from parse-partial-sexp. 1 GB is a lot.

Before we get to 1GB files, there are 20MB files and 250MB files.  I
found quite a few low-hanging fruit in those that are worth plucking,
while we wait for parse-partial-sexp to get its act together.

> > If that solves the problems in a reasonable way for very long lines,
> > maybe we will eventually have such an option.
> 
> Can I merge the branch, then?

Please wait until I have time to review it.

> I was hoping for a stylistic review, perhaps. Like, whether you like the 
> name of the variable, and should it be split in two.
> 
> A change of the default value(s) is on the table too.

Will definitely do, I'm just busy with "other things" right now, most
of them related to other aspects of long lines.

> > One such major mode and one such file was presented long ago : a
> > single-line XML file.
> 
> XMl is indeed slower. It takes almost 3 seconds for me to scroll to the 
> end of a 20 MB XML file.
> 
> Most of it comes from sgml--syntax-propertize-ppss, which is probably 
> justified: XML is a more complex language.

Did you wait till nxml-mode did its initial scan and displayed "Valid"
in the mode line?  The performance is quite different before and after
that.

> But other than the initial delay, scrolling, and isearch, and local 
> editing, all work fast, unlike the original situation with JSON.

With which branch?





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-14 17:51                                                                                                             ` Dmitry Gutov
  2022-08-14 17:54                                                                                                               ` Gregory Heytings
@ 2022-08-14 18:01                                                                                                               ` Eli Zaretskii
  2022-08-14 18:14                                                                                                                 ` Dmitry Gutov
  1 sibling, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-14 18:01 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: 56682, gregory, monnier

> Date: Sun, 14 Aug 2022 20:51:14 +0300
> Cc: 56682@debbugs.gnu.org, Eli Zaretskii <eliz@gnu.org>,
>  monnier@iro.umontreal.ca
> From: Dmitry Gutov <dgutov@yandex.ru>
> 
> > If the conclusion is, after some reasonable effort, that there is no way 
> > to make syntax-ppss significantly faster in one way or another in such 
> > cases, and that there is no way to make font locking reasonably accurate 
> > even when it doesn't have access to the whole buffer, it might make 
> > sense to provide user options to fine-tune the behavior.  But we are not 
> > there yet.
> 
> Both conclusions lead to removing the applications of narrowing from 
> handle_fontified_prop.

We will not remove that, no.

> So how about we either do that (defaulting to accurate font-lock),
> or merge the branch I proposed, and then continue on to the more
> complex developments?

Please wait with requests to merge until I had time to review the
branch.

> Implementing the "font locking reasonably accurate even when it doesn't 
> have access to the whole buffer" would also have to be implemented in 
> Lisp, so narrowing outside of font-lock doesn't make sense.

Cannot parse this, sorry.  I guess some typo?





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-14 18:01                                                                                                               ` Eli Zaretskii
@ 2022-08-14 18:14                                                                                                                 ` Dmitry Gutov
  2022-08-14 18:27                                                                                                                   ` Eli Zaretskii
  2022-08-15  8:59                                                                                                                   ` Gregory Heytings
  0 siblings, 2 replies; 685+ messages in thread
From: Dmitry Gutov @ 2022-08-14 18:14 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, gregory, monnier

On 14.08.2022 21:01, Eli Zaretskii wrote:
>> Date: Sun, 14 Aug 2022 20:51:14 +0300
>> Cc: 56682@debbugs.gnu.org, Eli Zaretskii <eliz@gnu.org>,
>>   monnier@iro.umontreal.ca
>> From: Dmitry Gutov <dgutov@yandex.ru>
>>
>>> If the conclusion is, after some reasonable effort, that there is no way
>>> to make syntax-ppss significantly faster in one way or another in such
>>> cases, and that there is no way to make font locking reasonably accurate
>>> even when it doesn't have access to the whole buffer, it might make
>>> sense to provide user options to fine-tune the behavior.  But we are not
>>> there yet.
>>
>> Both conclusions lead to removing the applications of narrowing from
>> handle_fontified_prop.
> 
> We will not remove that, no.

Please look at the branch. It moves the (potential) narrowing from C to 
Lisp.

>> So how about we either do that (defaulting to accurate font-lock),
>> or merge the branch I proposed, and then continue on to the more
>> complex developments?
> 
> Please wait with requests to merge until I had time to review the
> branch.

Waiting, and thanks.

>> Implementing the "font locking reasonably accurate even when it doesn't
>> have access to the whole buffer" would also have to be implemented in
>> Lisp, so narrowing outside of font-lock doesn't make sense.
> 
> Cannot parse this, sorry.  I guess some typo?

The implementation of the idea that Gregory mentioned (font locking 
reasonably accurate even when it doesn't have access to the whole 
buffer) will have to be done in Lisp anyway. So that's where the 
narrowing should be applied too.

Does that parse? Not sure how to phrase it better.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-14 17:54                                                                                                               ` Gregory Heytings
@ 2022-08-14 18:18                                                                                                                 ` Dmitry Gutov
  2022-08-15  8:53                                                                                                                   ` Gregory Heytings
  0 siblings, 1 reply; 685+ messages in thread
From: Dmitry Gutov @ 2022-08-14 18:18 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, Eli Zaretskii, monnier

On 14.08.2022 20:54, Gregory Heytings wrote:
> 
>>> If the conclusion is, after some reasonable effort, that there is no 
>>> way to make syntax-ppss significantly faster in one way or another in 
>>> such cases, and that there is no way to make font locking reasonably 
>>> accurate even when it doesn't have access to the whole buffer, it 
>>> might make sense to provide user options to fine-tune the behavior.  
>>> But we are not there yet.
>>
>> Both conclusions lead to removing the applications of narrowing from 
>> handle_fontified_prop.
>>
> 
> I have seen no effort whatsoever to make syntax-ppss significantly 
> faster in one way or another.

syntax-ppss is limited in its performance by parse-partial-sexp.

Could you take a look at it? Seems like more of your area of expertise.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-14 18:14                                                                                                                 ` Dmitry Gutov
@ 2022-08-14 18:27                                                                                                                   ` Eli Zaretskii
  2022-08-14 22:07                                                                                                                     ` Dmitry Gutov
  2022-08-15  8:59                                                                                                                   ` Gregory Heytings
  1 sibling, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-14 18:27 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: 56682, gregory, monnier

> Date: Sun, 14 Aug 2022 21:14:00 +0300
> Cc: 56682@debbugs.gnu.org, gregory@heytings.org, monnier@iro.umontreal.ca
> From: Dmitry Gutov <dgutov@yandex.ru>
> 
> The implementation of the idea that Gregory mentioned (font locking 
> reasonably accurate even when it doesn't have access to the whole 
> buffer) will have to be done in Lisp anyway. So that's where the 
> narrowing should be applied too.

I don't see how it follows.  If we decide (and I don't say we did, but
if we do) that fontification-functions must run narrowed, then they
will run narrowed, and the best place to do that is in the caller.

> Does that parse?

Yes, it's clear now, thanks.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-14 17:54                                                                                                         ` Dmitry Gutov
@ 2022-08-14 18:47                                                                                                           ` Gregory Heytings
  2022-08-14 19:15                                                                                                             ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-08-15  1:23                                                                                                           ` Ihor Radchenko
  1 sibling, 1 reply; 685+ messages in thread
From: Gregory Heytings @ 2022-08-14 18:47 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: 56682, Eli Zaretskii, monnier


>> Or when you have a slower CPU, with moderately large files.
>
> I doubt there are any CPUs in wide use that are even 5x slower than 
> mine.
>

Have a look at e.g. https://www.cpubenchmark.net/singleThread.html , 
you'll see that many CPUs in wide use are 5x slower, or more than 5x 
slower, than your CPU.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-14 18:47                                                                                                           ` Gregory Heytings
@ 2022-08-14 19:15                                                                                                             ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-08-14 21:03                                                                                                               ` Dmitry Gutov
  2022-08-15  8:51                                                                                                               ` Gregory Heytings
  0 siblings, 2 replies; 685+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2022-08-14 19:15 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, Eli Zaretskii, Dmitry Gutov

>>> Or when you have a slower CPU, with moderately large files.
>> I doubt there are any CPUs in wide use that are even 5x slower than mine.
> Have a look at e.g. https://www.cpubenchmark.net/singleThread.html , you'll
> see that many CPUs in wide use are 5x slower, or more than 5x slower, than
> your CPU.

Which one of those CPUs that are 5x slower than the top performer do you
consider as being "in wide use"?

AFAICT the highest score there is 4400.  So 5x slower would mean a score
below 880.  My 2006-vintage Thinkpad T60 is just below at 848.  But my
T61 (released in 2007, tho I bought it refurbished in 2012) is already
rated at 1K.

Admittedly, these were top-of-the-line machines when they were released,
and are hence faster than many machine released later (e.g. netbooks),
but still: I have seen *very* few people recently using machines slower
than my T61.

I don't know what machine Dmitry is using, but based on that
"cpubenchmark" data I'd indeed be very surprised if "there are any CPUs
in wide use that are even 5x slower than" his.


        Stefan






^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-14 17:59                                                                                                           ` Eli Zaretskii
@ 2022-08-14 20:46                                                                                                             ` Dmitry Gutov
  2022-08-15 14:06                                                                                                               ` Eli Zaretskii
  0 siblings, 1 reply; 685+ messages in thread
From: Dmitry Gutov @ 2022-08-14 20:46 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, gregory, monnier

On 14.08.2022 20:59, Eli Zaretskii wrote:
>> Date: Sun, 14 Aug 2022 20:47:40 +0300
>> Cc: 56682@debbugs.gnu.org, gregory@heytings.org, monnier@iro.umontreal.ca
>> From: Dmitry Gutov <dgutov@yandex.ru>
>>
>>> The better way is to acknowledge that some inaccuracies are acceptable
>>> in those cases.  With that in mind, one can design a syntax analyzer
>>> that looks back only a short ways, until it finds some place that
>>> could reasonably serve as an anchor point for heuristic decisions
>>> about whether we are inside or outside a string or comment, and then
>>> verifying that guess with some telltale syntactic elements that follow
>>> (like semi-colons or comment-end delimiters in C).  While this kind of
>>> heuristics can sometimes fail, if they only fail rarely, the result is
>>> a huge win.
>>
>> You cannot design a language-agnostic syntax analyzer like that.
> 
> _I_ cannot, but hopefully someone else will.

That seems unlikely. Nothing's impossible, of course, but I wouldn't 
want to wait for such an invention to come up before we make the 
decision on how to proceed now.

What _can_ be done is make syntax-ppss's cache invalidations more local 
by introducing a "repair" step. That would only speed up certain 
operations, at most, and the initial wait near EOB can't be avoided this 
way.

>>> In any case, the way to speed up these cases is to look at the profile
>>> and identify the code that is slowing us down; then attempt to make it
>>> faster.  (20 sec is actually long enough for us to interrupt Emacs
>>> under a debugger and look at the backtrace to find the culprit.)
>>
>> I've profiled and benchmarked this scenario already: all of the delay
>> (17 seconds, to be precise) come from parse-partial-sexp. 1 GB is a lot.
> 
> Before we get to 1GB files, there are 20MB files and 250MB files.  I
> found quite a few low-hanging fruit in those that are worth plucking,
> while we wait for parse-partial-sexp to get its act together.

Definitely.

But when the profiler output in a 1 GB file comes down to syntax-ppss 
only, that means the low-handing fruit has been picked.

>>> If that solves the problems in a reasonable way for very long lines,
>>> maybe we will eventually have such an option.
>>
>> Can I merge the branch, then?
> 
> Please wait until I have time to review it.
> 
>> I was hoping for a stylistic review, perhaps. Like, whether you like the
>> name of the variable, and should it be split in two.
>>
>> A change of the default value(s) is on the table too.
> 
> Will definitely do, I'm just busy with "other things" right now, most
> of them related to other aspects of long lines.

Roger that.

>>> One such major mode and one such file was presented long ago : a
>>> single-line XML file.
>>
>> XMl is indeed slower. It takes almost 3 seconds for me to scroll to the
>> end of a 20 MB XML file.
>>
>> Most of it comes from sgml--syntax-propertize-ppss, which is probably
>> justified: XML is a more complex language.
> 
> Did you wait till nxml-mode did its initial scan and displayed "Valid"
> in the mode line?  The performance is quite different before and after
> that.

It takes a while to switch from "Validated: 0" to "Valid", but the 
performance seems about the same in both states.

Maybe some other example file would show different behavior, IDK.

>> But other than the initial delay, scrolling, and isearch, and local
>> editing, all work fast, unlike the original situation with JSON.
> 
> With which branch?

scratch/font_lock_large_files, with 'emacs -Q'

I've also run this test on master now, and M-> is not instant there 
either. Apparently, a fair amount time is also spent in 
nxml-extend-region (which calls sgml-syntax-propertize and syntax-ppss).

Not sure why it would spend any significant time in either, though, if 
they're called inside a narrowing.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-14 19:15                                                                                                             ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2022-08-14 21:03                                                                                                               ` Dmitry Gutov
  2022-08-15  8:51                                                                                                               ` Gregory Heytings
  1 sibling, 0 replies; 685+ messages in thread
From: Dmitry Gutov @ 2022-08-14 21:03 UTC (permalink / raw)
  To: Stefan Monnier, Gregory Heytings; +Cc: 56682, Eli Zaretskii

On 14.08.2022 22:15, Stefan Monnier via Bug reports for GNU Emacs, the 
Swiss army knife of text editors wrote:
> I don't know what machine Dmitry is using, but based on that
> "cpubenchmark" data I'd indeed be very surprised if "there are any CPUs
> in wide use that are even 5x slower than" his.

Right. I have a beefy CPU, but not the latest-and-greatest one anyway:

Intel Core i9-8950HK @ 2.90GHz: single-threaded score 2,492





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-14 18:27                                                                                                                   ` Eli Zaretskii
@ 2022-08-14 22:07                                                                                                                     ` Dmitry Gutov
  2022-08-15  2:32                                                                                                                       ` Eli Zaretskii
  0 siblings, 1 reply; 685+ messages in thread
From: Dmitry Gutov @ 2022-08-14 22:07 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, gregory, monnier

On 14.08.2022 21:27, Eli Zaretskii wrote:
>> Date: Sun, 14 Aug 2022 21:14:00 +0300
>> Cc: 56682@debbugs.gnu.org, gregory@heytings.org, monnier@iro.umontreal.ca
>> From: Dmitry Gutov <dgutov@yandex.ru>
>>
>> The implementation of the idea that Gregory mentioned (font locking
>> reasonably accurate even when it doesn't have access to the whole
>> buffer) will have to be done in Lisp anyway. So that's where the
>> narrowing should be applied too.
> 
> I don't see how it follows.  If we decide (and I don't say we did, but
> if we do) that fontification-functions must run narrowed, then they
> will run narrowed, and the best place to do that is in the caller.

Only if we somehow decided that it makes sense to always use the same 
narrowing bounds. But as experiment shows, font-lock can use 100x larger 
narrowing, and still perform well.

Further, the thing which is going to call the language-specific 
safe-position-finding logic is likely to want to update the bounds of 
the narrowing (to then call syntax-ppss within those bounds, where START 
is a "safe" position).

So yeah, the font-lock related widen/narrowing logic should indeed live 
in one place. And until now it has resided in font-lock-fontify-region.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-14 17:54                                                                                                         ` Dmitry Gutov
  2022-08-14 18:47                                                                                                           ` Gregory Heytings
@ 2022-08-15  1:23                                                                                                           ` Ihor Radchenko
  2022-08-15  1:52                                                                                                             ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  1 sibling, 1 reply; 685+ messages in thread
From: Ihor Radchenko @ 2022-08-15  1:23 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: 56682, Gregory Heytings, Eli Zaretskii, monnier

Dmitry Gutov <dgutov@yandex.ru> writes:

>> The problem is (again) that what you would like does not provide any 
>> protection against modes which use widen inside their fontification 
>> routines.
>
> Do you have examples of such modes?
>
> Calling 'widen' inside font-lock-keywords is a bug, and the bugs should 
> be fixed at the source.

widen inside save-restriction is likely used by Org mode (or will be).
This is needed by Org parser to determine the syntax element at point.

-- 
Ihor Radchenko,
Org mode contributor,
Learn more about Org mode at https://orgmode.org/.
Support Org development at https://liberapay.com/org-mode,
or support my work at https://liberapay.com/yantar92





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-15  1:23                                                                                                           ` Ihor Radchenko
@ 2022-08-15  1:52                                                                                                             ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-08-15  2:10                                                                                                               ` Ihor Radchenko
  0 siblings, 1 reply; 685+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2022-08-15  1:52 UTC (permalink / raw)
  To: Ihor Radchenko; +Cc: 56682, Gregory Heytings, Eli Zaretskii, Dmitry Gutov

Ihor Radchenko [2022-08-15 09:23:21] wrote:
> Dmitry Gutov <dgutov@yandex.ru> writes:
>> Do you have examples of such modes?
>> Calling 'widen' inside font-lock-keywords is a bug, and the bugs should 
>> be fixed at the source.
> widen inside save-restriction is likely used by Org mode (or will be).

Why?

> This is needed by Org parser to determine the syntax element at point.

But font-lock widens before using Org-mode's `font-lock-keywords`, so
there should be no need for Org-mode to widen in that case.


        Stefan


PS: Not sure if Org-mode qualifies as a mode that is likely to suffer
from the kinds of long-lines or large-file problems that Gregory has
tried to tackle, tho.  I've never seen an Org file with lines >10kB nor
an Org file larger than 10MB.






^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-15  1:52                                                                                                             ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2022-08-15  2:10                                                                                                               ` Ihor Radchenko
  2022-08-15  2:41                                                                                                                 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-08-15 11:17                                                                                                                 ` Eli Zaretskii
  0 siblings, 2 replies; 685+ messages in thread
From: Ihor Radchenko @ 2022-08-15  2:10 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: 56682, Gregory Heytings, Eli Zaretskii, Dmitry Gutov

Stefan Monnier <monnier@iro.umontreal.ca> writes:

> Ihor Radchenko [2022-08-15 09:23:21] wrote:
>> Dmitry Gutov <dgutov@yandex.ru> writes:
>>> Do you have examples of such modes?
>>> Calling 'widen' inside font-lock-keywords is a bug, and the bugs should 
>>> be fixed at the source.
>> widen inside save-restriction is likely used by Org mode (or will be).
>
> Why?

Because Org syntax is context-dependent, and we may need to look
backwards to determine the "container" element before knowing what the
element at point is.

>> This is needed by Org parser to determine the syntax element at point.
>
> But font-lock widens before using Org-mode's `font-lock-keywords`, so
> there should be no need for Org-mode to widen in that case.

Yes, but Org parser is not written explicitly for font-locking purposes.
org-element-at-point knows nothing about buffer restriction upon
calling and thus has to widen to ensure correctness.

> PS: Not sure if Org-mode qualifies as a mode that is likely to suffer
> from the kinds of long-lines or large-file problems that Gregory has
> tried to tackle, tho.  I've never seen an Org file with lines >10kB nor
> an Org file larger than 10MB.

I have seen very long lines in Org. Specifically, in source block
output. (http query)

My notes.org file is over 20Mb.
Even larger files can be auto-generated by https://gitlab.com/publicvoit/Memacs

-- 
Ihor Radchenko,
Org mode contributor,
Learn more about Org mode at https://orgmode.org/.
Support Org development at https://liberapay.com/org-mode,
or support my work at https://liberapay.com/yantar92





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-14 22:07                                                                                                                     ` Dmitry Gutov
@ 2022-08-15  2:32                                                                                                                       ` Eli Zaretskii
  2022-08-15 10:06                                                                                                                         ` Dmitry Gutov
  0 siblings, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-15  2:32 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: 56682, gregory, monnier

> Date: Mon, 15 Aug 2022 01:07:08 +0300
> Cc: 56682@debbugs.gnu.org, gregory@heytings.org, monnier@iro.umontreal.ca
> From: Dmitry Gutov <dgutov@yandex.ru>
> 
> On 14.08.2022 21:27, Eli Zaretskii wrote:
> >> Date: Sun, 14 Aug 2022 21:14:00 +0300
> >> Cc: 56682@debbugs.gnu.org, gregory@heytings.org, monnier@iro.umontreal.ca
> >> From: Dmitry Gutov <dgutov@yandex.ru>
> >>
> >> The implementation of the idea that Gregory mentioned (font locking
> >> reasonably accurate even when it doesn't have access to the whole
> >> buffer) will have to be done in Lisp anyway. So that's where the
> >> narrowing should be applied too.
> > 
> > I don't see how it follows.  If we decide (and I don't say we did, but
> > if we do) that fontification-functions must run narrowed, then they
> > will run narrowed, and the best place to do that is in the caller.
> 
> Only if we somehow decided that it makes sense to always use the same 
> narrowing bounds. But as experiment shows, font-lock can use 100x larger 
> narrowing, and still perform well.

So what?  The proponents of the widening claim that they need to go to
BOB, and no "arbitrary" narrowing smaller than that will suffice.

And btw, I have very different impression of what happens with 100x
larger narrowing on my machine and with unoptimized builds.

> Further, the thing which is going to call the language-specific 
> safe-position-finding logic is likely to want to update the bounds of 
> the narrowing (to then call syntax-ppss within those bounds, where START 
> is a "safe" position).
> 
> So yeah, the font-lock related widen/narrowing logic should indeed live 
> in one place. And until now it has resided in font-lock-fontify-region.

Since when is font-lock-fontify-region specific to a language?  It is
as general as xdisp.c.






^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-15  2:10                                                                                                               ` Ihor Radchenko
@ 2022-08-15  2:41                                                                                                                 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-08-15  3:10                                                                                                                   ` Ihor Radchenko
  2022-08-15 11:17                                                                                                                 ` Eli Zaretskii
  1 sibling, 1 reply; 685+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2022-08-15  2:41 UTC (permalink / raw)
  To: Ihor Radchenko; +Cc: 56682, Gregory Heytings, Eli Zaretskii, Dmitry Gutov

>>> This is needed by Org parser to determine the syntax element at point.
>> But font-lock widens before using Org-mode's `font-lock-keywords`, so
>> there should be no need for Org-mode to widen in that case.
> Yes, but Org parser is not written explicitly for font-locking purposes.
> org-element-at-point knows nothing about buffer restriction upon
> calling and thus has to widen to ensure correctness.

That will break uses of MMM-mode where one of the chunks is using
Org-mode.  Admittedly, this is unlikely, but still: It would be much
better to arrange to do `widen` *outside* of Org-mode's font-lock (and
indentation) code.

>> PS: Not sure if Org-mode qualifies as a mode that is likely to suffer
>> from the kinds of long-lines or large-file problems that Gregory has
>> tried to tackle, tho.  I've never seen an Org file with lines >10kB nor
>> an Org file larger than 10MB.
>
> I have seen very long lines in Org. Specifically, in source block
> output. (http query)
>
> My notes.org file is over 20Mb.
> Even larger files can be auto-generated by https://gitlab.com/publicvoit/Memacs

I stand corrected,


        Stefan






^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-15  2:41                                                                                                                 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2022-08-15  3:10                                                                                                                   ` Ihor Radchenko
  2022-08-15  9:11                                                                                                                     ` Gregory Heytings
  2022-08-15  9:56                                                                                                                     ` Dmitry Gutov
  0 siblings, 2 replies; 685+ messages in thread
From: Ihor Radchenko @ 2022-08-15  3:10 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: 56682, Gregory Heytings, Eli Zaretskii, Dmitry Gutov

Stefan Monnier <monnier@iro.umontreal.ca> writes:

>>>> This is needed by Org parser to determine the syntax element at point.
>>> But font-lock widens before using Org-mode's `font-lock-keywords`, so
>>> there should be no need for Org-mode to widen in that case.
>> Yes, but Org parser is not written explicitly for font-locking purposes.
>> org-element-at-point knows nothing about buffer restriction upon
>> calling and thus has to widen to ensure correctness.
>
> That will break uses of MMM-mode where one of the chunks is using
> Org-mode.  Admittedly, this is unlikely, but still: It would be much
> better to arrange to do `widen` *outside* of Org-mode's font-lock (and
> indentation) code.

The fact that MMM-mode is relying on narrowing is a bug in MMM-mode.
Polymode (an alternative to MMM-mode) is using a different approach.

Correct me if I am wrong, but I assume that having a specific major mode
in buffer implies that the whole buffer is considered to contribute to
the major mode.

If the Org parser does not ensure that buffer is widened then the parser
output may depend on the narrowing state. For font-lock, it also means
that different fontification must be used with/without narrowing -
something that font-lock will fail to achieve unless buffer is
re-fontified every time the narrowing changes.

Further, Org parser is caching parse results and reuse them to not
re-parse on every invocation. The need to maintain separate parser
caches for every possible narrowing state will be a nightmare.
Especially considering the user narrowing may also be an option and
having a different parser/command behaviour will be unexpected to the
user.

More generally, prohibiting the innocent-looking
(save-restriction (widen) ...) means that font-lock-keywords cannot
safely call any kind of general-purpose API function without checking
(widen) usage inside that function and inside all the deeper nesting
levels. This will be fragile, especially for user-defined keywords.

-- 
Ihor Radchenko,
Org mode contributor,
Learn more about Org mode at https://orgmode.org/.
Support Org development at https://liberapay.com/org-mode,
or support my work at https://liberapay.com/yantar92





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-14 19:15                                                                                                             ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-08-14 21:03                                                                                                               ` Dmitry Gutov
@ 2022-08-15  8:51                                                                                                               ` Gregory Heytings
  1 sibling, 0 replies; 685+ messages in thread
From: Gregory Heytings @ 2022-08-15  8:51 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: 56682, Eli Zaretskii, Dmitry Gutov


>
> Which one of those CPUs that are 5x slower than the top performer do you 
> consider as being "in wide use"?
>
> AFAICT the highest score there is 4400.  So 5x slower would mean a score 
> below 880.  My 2006-vintage Thinkpad T60 is just below at 848.  But my 
> T61 (released in 2007, tho I bought it refurbished in 2012) is already 
> rated at 1K.
>
> Admittedly, these were top-of-the-line machines when they were released, 
> and are hence faster than many machine released later (e.g. netbooks), 
> but still: I have seen *very* few people recently using machines slower 
> than my T61.
>

This is more and more tangent, but anyway: I think you should look around 
more carefully.  The Raspberry Pi 4B has a quad-core ARM CPU (Cortex A72) 
whose single core benchmark on that website is 456.  And nowadays "thin 
client" computers, in which slow CPUs are used, are very common both in 
industry and in schools/universities.  One random example, which I've seen 
a few days ago, is the Dell Wyse 3040, which is equipped with an Intel 
Atom X5 Z8350 CPU, whose single core benchmark is 480.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-14 18:18                                                                                                                 ` Dmitry Gutov
@ 2022-08-15  8:53                                                                                                                   ` Gregory Heytings
  0 siblings, 0 replies; 685+ messages in thread
From: Gregory Heytings @ 2022-08-15  8:53 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: 56682, Eli Zaretskii, monnier


>> I have seen no effort whatsoever to make syntax-ppss significantly 
>> faster in one way or another.
>
> syntax-ppss is limited in its performance by parse-partial-sexp.
>
> Could you take a look at it? Seems like more of your area of expertise.
>

I already said (at least twice) that I would do that.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-14 18:14                                                                                                                 ` Dmitry Gutov
  2022-08-14 18:27                                                                                                                   ` Eli Zaretskii
@ 2022-08-15  8:59                                                                                                                   ` Gregory Heytings
  1 sibling, 0 replies; 685+ messages in thread
From: Gregory Heytings @ 2022-08-15  8:59 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: 56682, Eli Zaretskii, monnier


>
> The implementation of the idea that Gregory mentioned (font locking 
> reasonably accurate even when it doesn't have access to the whole 
> buffer) will have to be done in Lisp anyway. So that's where the 
> narrowing should be applied too.
>

It would be helpful if you did not reiterate your arguments again and 
again.  I think everybody here has understood what your preference would 
be, and your reasons for that preference.  Please give us some time to 
explore the current direction, before asking us to go back and take 
another direction.  The current situation is already, in many aspects, way 
better than it was two months ago.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-15  3:10                                                                                                                   ` Ihor Radchenko
@ 2022-08-15  9:11                                                                                                                     ` Gregory Heytings
  2022-08-15 11:47                                                                                                                       ` Ihor Radchenko
  2022-08-15  9:56                                                                                                                     ` Dmitry Gutov
  1 sibling, 1 reply; 685+ messages in thread
From: Gregory Heytings @ 2022-08-15  9:11 UTC (permalink / raw)
  To: Ihor Radchenko; +Cc: 56682, Eli Zaretskii, Stefan Monnier, Dmitry Gutov


>
> Further, Org parser is caching parse results and reuse them to not 
> re-parse on every invocation. The need to maintain separate parser 
> caches for every possible narrowing state will be a nightmare. 
> Especially considering the user narrowing may also be an option and 
> having a different parser/command behaviour will be unexpected to the 
> user.
>

I'm not sure I correctly understand what you mean, but it seems to me that 
the fact that the Org parser caches its results implies that Org doesn't 
need to access the whole buffer to make "local" decisions.  It can use the 
data in cache for everything that is outside of the current narrowing, and 
update the portion of the cache corresponding to the current narrowing. 
IOW, there is no need to maintain separate parser caches for each possible 
narrowing state.  Am I misunderstanding something?





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-15  3:10                                                                                                                   ` Ihor Radchenko
  2022-08-15  9:11                                                                                                                     ` Gregory Heytings
@ 2022-08-15  9:56                                                                                                                     ` Dmitry Gutov
  2022-08-15 12:08                                                                                                                       ` Ihor Radchenko
  1 sibling, 1 reply; 685+ messages in thread
From: Dmitry Gutov @ 2022-08-15  9:56 UTC (permalink / raw)
  To: Ihor Radchenko, Stefan Monnier; +Cc: 56682, Gregory Heytings, Eli Zaretskii

On 15.08.2022 06:10, Ihor Radchenko wrote:
> The fact that MMM-mode is relying on narrowing is a bug in MMM-mode.
> Polymode (an alternative to MMM-mode) is using a different approach.

Does it really?

 From what I see, Polymode does use narrowing: 
https://github.com/polymode/polymode/search?q=narrow&type=code

But it also contains provisions for modes whose syntax highlighting 
cannot function with it. With different tradeoffs.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-15  2:32                                                                                                                       ` Eli Zaretskii
@ 2022-08-15 10:06                                                                                                                         ` Dmitry Gutov
  2022-08-15 11:51                                                                                                                           ` Eli Zaretskii
  0 siblings, 1 reply; 685+ messages in thread
From: Dmitry Gutov @ 2022-08-15 10:06 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, gregory, monnier

On 15.08.2022 05:32, Eli Zaretskii wrote:
>> Date: Mon, 15 Aug 2022 01:07:08 +0300
>> Cc: 56682@debbugs.gnu.org, gregory@heytings.org, monnier@iro.umontreal.ca
>> From: Dmitry Gutov <dgutov@yandex.ru>
>>
>> On 14.08.2022 21:27, Eli Zaretskii wrote:
>>>> Date: Sun, 14 Aug 2022 21:14:00 +0300
>>>> Cc: 56682@debbugs.gnu.org, gregory@heytings.org, monnier@iro.umontreal.ca
>>>> From: Dmitry Gutov <dgutov@yandex.ru>
>>>>
>>>> The implementation of the idea that Gregory mentioned (font locking
>>>> reasonably accurate even when it doesn't have access to the whole
>>>> buffer) will have to be done in Lisp anyway. So that's where the
>>>> narrowing should be applied too.
>>>
>>> I don't see how it follows.  If we decide (and I don't say we did, but
>>> if we do) that fontification-functions must run narrowed, then they
>>> will run narrowed, and the best place to do that is in the caller.
>>
>> Only if we somehow decided that it makes sense to always use the same
>> narrowing bounds. But as experiment shows, font-lock can use 100x larger
>> narrowing, and still perform well.
> 
> So what?  The proponents of the widening claim that they need to go to
> BOB, and no "arbitrary" narrowing smaller than that will suffice.

I'm trying to support several approaches, including narrowing.

> And btw, I have very different impression of what happens with 100x
> larger narrowing on my machine and with unoptimized builds.

Given what we've seen about your parse-partial-sexp's performance (10x 
slower than mine), I would hope for someone to figure out why it's so 
slow in your unoptimized build. But if it doesn't happen, you would 
probably use a different threshold/narrowing radius (through customization).

It would make sense for our defaults not to be tailored to this very 
particular development rig.

>> Further, the thing which is going to call the language-specific
>> safe-position-finding logic is likely to want to update the bounds of
>> the narrowing (to then call syntax-ppss within those bounds, where START
>> is a "safe" position).
>>
>> So yeah, the font-lock related widen/narrowing logic should indeed live
>> in one place. And until now it has resided in font-lock-fontify-region.
> 
> Since when is font-lock-fontify-region specific to a language?  It is
> as general as xdisp.c.

syntax-propertize is general, and yet it invokes language-specific rules 
(through syntax-propertize-function).





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-15  2:10                                                                                                               ` Ihor Radchenko
  2022-08-15  2:41                                                                                                                 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2022-08-15 11:17                                                                                                                 ` Eli Zaretskii
  2022-08-16  4:38                                                                                                                   ` Ihor Radchenko
  1 sibling, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-15 11:17 UTC (permalink / raw)
  To: Ihor Radchenko; +Cc: 56682, gregory, monnier, dgutov

> From: Ihor Radchenko <yantar92@gmail.com>
> Cc: Dmitry Gutov <dgutov@yandex.ru>,  Gregory Heytings
>  <gregory@heytings.org>,  56682@debbugs.gnu.org,  Eli Zaretskii
>  <eliz@gnu.org>
> Date: Mon, 15 Aug 2022 10:10:36 +0800
> 
> > PS: Not sure if Org-mode qualifies as a mode that is likely to suffer
> > from the kinds of long-lines or large-file problems that Gregory has
> > tried to tackle, tho.  I've never seen an Org file with lines >10kB nor
> > an Org file larger than 10MB.
> 
> I have seen very long lines in Org. Specifically, in source block
> output. (http query)

How long is "very long" in those cases?





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-15  9:11                                                                                                                     ` Gregory Heytings
@ 2022-08-15 11:47                                                                                                                       ` Ihor Radchenko
  2022-08-16 10:24                                                                                                                         ` Gregory Heytings
  0 siblings, 1 reply; 685+ messages in thread
From: Ihor Radchenko @ 2022-08-15 11:47 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, Eli Zaretskii, Stefan Monnier, Dmitry Gutov

Gregory Heytings <gregory@heytings.org> writes:

> I'm not sure I correctly understand what you mean, but it seems to me that 
> the fact that the Org parser caches its results implies that Org doesn't 
> need to access the whole buffer to make "local" decisions.  It can use the 
> data in cache for everything that is outside of the current narrowing, and 
> update the portion of the cache corresponding to the current narrowing. 
> IOW, there is no need to maintain separate parser caches for each possible 
> narrowing state.  Am I misunderstanding something?

Cache existence is not guaranteed.
When cache does not exist, Org must widen. If not, the cache will be
valid only for the current narrowing.
When cache do exist, Org may not need to widen. But that also mean that
widening has happened in the past when the cache was generated.

At the end, Org does need to be able to widen safely. At least in some
cases.

-- 
Ihor Radchenko,
Org mode contributor,
Learn more about Org mode at https://orgmode.org/.
Support Org development at https://liberapay.com/org-mode,
or support my work at https://liberapay.com/yantar92





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-15 10:06                                                                                                                         ` Dmitry Gutov
@ 2022-08-15 11:51                                                                                                                           ` Eli Zaretskii
  2022-08-15 12:01                                                                                                                             ` dick
  2022-08-15 12:06                                                                                                                             ` Dmitry Gutov
  0 siblings, 2 replies; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-15 11:51 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: 56682, gregory, monnier

> Date: Mon, 15 Aug 2022 13:06:14 +0300
> Cc: 56682@debbugs.gnu.org, gregory@heytings.org, monnier@iro.umontreal.ca
> From: Dmitry Gutov <dgutov@yandex.ru>
> 
> > And btw, I have very different impression of what happens with 100x
> > larger narrowing on my machine and with unoptimized builds.
> 
> Given what we've seen about your parse-partial-sexp's performance (10x 
> slower than mine), I would hope for someone to figure out why it's so 
> slow in your unoptimized build. But if it doesn't happen, you would 
> probably use a different threshold/narrowing radius (through customization).
> 
> It would make sense for our defaults not to be tailored to this very 
> particular development rig.

If you are willing to lose my ability to debug complex redisplay
problems in many cases, sure, go ahead.

> >> So yeah, the font-lock related widen/narrowing logic should indeed live
> >> in one place. And until now it has resided in font-lock-fontify-region.
> > 
> > Since when is font-lock-fontify-region specific to a language?  It is
> > as general as xdisp.c.
> 
> syntax-propertize is general, and yet it invokes language-specific rules 
> (through syntax-propertize-function).

Nothing prevents xdisp.c from invoking those same rules if needed.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-15 11:51                                                                                                                           ` Eli Zaretskii
@ 2022-08-15 12:01                                                                                                                             ` dick
  2022-08-15 12:06                                                                                                                             ` Dmitry Gutov
  1 sibling, 0 replies; 685+ messages in thread
From: dick @ 2022-08-15 12:01 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, gregory, monnier, Dmitry Gutov

EZ> If you are willing to lose my ability to debug complex redisplay
EZ> problems in many cases, sure, go ahead.

Willing!  I'll consider "sure, go ahead" as ratification.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-15 11:51                                                                                                                           ` Eli Zaretskii
  2022-08-15 12:01                                                                                                                             ` dick
@ 2022-08-15 12:06                                                                                                                             ` Dmitry Gutov
  2022-08-15 12:45                                                                                                                               ` Eli Zaretskii
  2022-08-15 14:19                                                                                                                               ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  1 sibling, 2 replies; 685+ messages in thread
From: Dmitry Gutov @ 2022-08-15 12:06 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, gregory, monnier

On 15.08.2022 14:51, Eli Zaretskii wrote:
>> Date: Mon, 15 Aug 2022 13:06:14 +0300
>> Cc: 56682@debbugs.gnu.org, gregory@heytings.org, monnier@iro.umontreal.ca
>> From: Dmitry Gutov <dgutov@yandex.ru>
>>
>>> And btw, I have very different impression of what happens with 100x
>>> larger narrowing on my machine and with unoptimized builds.
>>
>> Given what we've seen about your parse-partial-sexp's performance (10x
>> slower than mine), I would hope for someone to figure out why it's so
>> slow in your unoptimized build. But if it doesn't happen, you would
>> probably use a different threshold/narrowing radius (through customization).
>>
>> It would make sense for our defaults not to be tailored to this very
>> particular development rig.
> 
> If you are willing to lose my ability to debug complex redisplay
> problems in many cases, sure, go ahead.

Why? You would customize an option to a lower value, and go on to debugging.

Though I guess reproducing the exact conditions on the user's machine 
might get harder sometimes.

>>>> So yeah, the font-lock related widen/narrowing logic should indeed live
>>>> in one place. And until now it has resided in font-lock-fontify-region.
>>>
>>> Since when is font-lock-fontify-region specific to a language?  It is
>>> as general as xdisp.c.
>>
>> syntax-propertize is general, and yet it invokes language-specific rules
>> (through syntax-propertize-function).
> 
> Nothing prevents xdisp.c from invoking those same rules if needed.

True. We could basically rewrite any Lisp function we have in C 
(font-lock-fontify-region, for example).

And by doing that bar a lot of power users/potential developers from 
being able to read that code, debug and contribute improvements.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-15  9:56                                                                                                                     ` Dmitry Gutov
@ 2022-08-15 12:08                                                                                                                       ` Ihor Radchenko
  2022-08-15 12:46                                                                                                                         ` Eli Zaretskii
  2022-08-15 14:26                                                                                                                         ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  0 siblings, 2 replies; 685+ messages in thread
From: Ihor Radchenko @ 2022-08-15 12:08 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: 56682, Gregory Heytings, Eli Zaretskii, Stefan Monnier

Dmitry Gutov <dgutov@yandex.ru> writes:

> On 15.08.2022 06:10, Ihor Radchenko wrote:
>> The fact that MMM-mode is relying on narrowing is a bug in MMM-mode.
>> Polymode (an alternative to MMM-mode) is using a different approach.
>
> Does it really?
>
>  From what I see, Polymode does use narrowing: 
> https://github.com/polymode/polymode/search?q=narrow&type=code

> But it also contains provisions for modes whose syntax highlighting 
> cannot function with it. With different tradeoffs.

AFAIK, it allows running commands across multiple chunks of the same
foreign mode.

In any case, do not take my word on this. I have been studying MMM-mode
and polymode years back.

However, I do insist on my statement that expecting major-mode to not
widen is a bug. There are valid cases when a major mode needs to examine
the whole buffer.

-- 
Ihor Radchenko,
Org mode contributor,
Learn more about Org mode at https://orgmode.org/.
Support Org development at https://liberapay.com/org-mode,
or support my work at https://liberapay.com/yantar92





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-15 12:06                                                                                                                             ` Dmitry Gutov
@ 2022-08-15 12:45                                                                                                                               ` Eli Zaretskii
  2022-08-15 14:19                                                                                                                               ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  1 sibling, 0 replies; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-15 12:45 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: 56682, gregory, monnier

> Date: Mon, 15 Aug 2022 15:06:35 +0300
> Cc: 56682@debbugs.gnu.org, gregory@heytings.org, monnier@iro.umontreal.ca
> From: Dmitry Gutov <dgutov@yandex.ru>
> 
> >> It would make sense for our defaults not to be tailored to this very
> >> particular development rig.
> > 
> > If you are willing to lose my ability to debug complex redisplay
> > problems in many cases, sure, go ahead.
> 
> Why? You would customize an option to a lower value, and go on to debugging.

I will forget to do it and waste time.

> >> syntax-propertize is general, and yet it invokes language-specific rules
> >> (through syntax-propertize-function).
> > 
> > Nothing prevents xdisp.c from invoking those same rules if needed.
> 
> True. We could basically rewrite any Lisp function we have in C 
> (font-lock-fontify-region, for example).

No need to go ad absurdum.  I was responding to your assertion that
this must be done from font-lock.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-15 12:08                                                                                                                       ` Ihor Radchenko
@ 2022-08-15 12:46                                                                                                                         ` Eli Zaretskii
  2022-08-15 14:26                                                                                                                         ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  1 sibling, 0 replies; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-15 12:46 UTC (permalink / raw)
  To: Ihor Radchenko; +Cc: 56682, gregory, monnier, dgutov

> From: Ihor Radchenko <yantar92@gmail.com>
> Cc: Stefan Monnier <monnier@iro.umontreal.ca>,  56682@debbugs.gnu.org,
>   Gregory Heytings <gregory@heytings.org>,  Eli Zaretskii <eliz@gnu.org>
> Date: Mon, 15 Aug 2022 20:08:12 +0800
> 
> However, I do insist on my statement that expecting major-mode to not
> widen is a bug.

We only don't expect that when the mode is invoked from redisplay.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-13 17:20                                                                                             ` Dmitry Gutov
  2022-08-13 17:43                                                                                               ` Gregory Heytings
  2022-08-13 17:54                                                                                               ` Eli Zaretskii
@ 2022-08-15 14:03                                                                                               ` Eli Zaretskii
  2022-08-15 15:52                                                                                                 ` Dmitry Gutov
  2 siblings, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-15 14:03 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: 56682, gregory, monnier

> Date: Sat, 13 Aug 2022 20:20:04 +0300
> Cc: 56682@debbugs.gnu.org, Eli Zaretskii <eliz@gnu.org>,
>  monnier@iro.umontreal.ca
> From: Dmitry Gutov <dgutov@yandex.ru>
> 
> The branch:
> 
> 1) Allows everyone interested to evaluate the performance of 
> unrestricted font-lock even in large files (single-line or not) and see 
> how big on a problem the delays caused by syntax-ppss actually are in 
> their experience. It's an important question.
> 2) Figure out the file sizes where syntax-ppss's performance really does 
> become a problem. That can give us data for better defaults later.
> 3) Play around with two easy solutions that we discussed previously: 
> narrowing during font-lock (one of the values for font-lock-large-files 
> pretty much matches the current behavior on master), or fontifying only 
> the first X characters (e.g. 1000000) of the buffer, and skipping on the 
> rest.
> 4) It should be plain to see that implementing additional approaches 
> should be easy enough. For instance, a hybrid like "fontify the first 1 
> MB correctly, and the rest - on best-effort basis". Although the value 
> '(narrow . 1000000) should provide behavior a very similar behavior 
> already. Maybe ever a better one: the boundaries are stable. Maybe sure 
> to try it together with (setq bidi-inhibit-hpa t): the result looks very 
> fast to me.

Thanks.

I tested this branch with an unoptimized build and a 416MB file made
of 23 copies of dictionary.json, after disabling show-paren-mode.

Observations:

  . With the default value of font-lock-large-files, which allows
    font-lock to widen as it pleases, the initial M-> in takes 5 min
    here.  That's way too long.  On master, this is instantaneous.
  . Thereafter jumping into various random places inside the file is
    much faster, but still takes between 1 min and 2.25 min -- again
    too long, even if I divide by 10 to get an approximation to your
    faster machine.  On master this takes maybe 1 sec, maybe less.
  . Horizontal and vertical motion commands are as fast (or as slow)
    as on master, which is not surprising.

Bottom line: with the default value of font-lock-large-files, this
scales much worse than the master branch -- which again is no
surprise.  My conclusion is that we do need to prevent uncontrolled
widening in fontification-functions, if we want a scalable solution.

How small or large should the narrowing be is a separate issue.  If we
want to allow a more flexible control of that, we could introduce yet
another variable exposed to Lisp, so that users and perhaps Lisp
programs could tune that, instead of hard-coding the value as we do
now on master.

I honestly don't see any reason to explore more sophisticated
alternatives for where and how to narrow, until and unless major modes
will on their side develop capabilities which will make such
complications (both in code, but mainly on the user part) justified.

If you agree, I'll add on master a variable to control the narrowing
when we call fontification-functions.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-14 20:46                                                                                                             ` Dmitry Gutov
@ 2022-08-15 14:06                                                                                                               ` Eli Zaretskii
  2022-08-15 15:42                                                                                                                 ` Dmitry Gutov
  0 siblings, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-15 14:06 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: 56682, gregory, monnier

> Date: Sun, 14 Aug 2022 23:46:13 +0300
> Cc: 56682@debbugs.gnu.org, gregory@heytings.org, monnier@iro.umontreal.ca
> From: Dmitry Gutov <dgutov@yandex.ru>
> 
> I've also run this test on master now, and M-> is not instant there 
> either.

It's instantaneous here, so I'm not sure why you see something
different.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-15 12:06                                                                                                                             ` Dmitry Gutov
  2022-08-15 12:45                                                                                                                               ` Eli Zaretskii
@ 2022-08-15 14:19                                                                                                                               ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  1 sibling, 0 replies; 685+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2022-08-15 14:19 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: 56682, Eli Zaretskii, gregory

>> If you are willing to lose my ability to debug complex redisplay
>> problems in many cases, sure, go ahead.
> Why? You would customize an option to a lower value, and go on to debugging.

I suspect that the "large-file-threshold" and the "long-line-threshold"
can both be kept small enough that they accommodate the case of Eli (or
myself) running a slow build of Emacs on a slowish machine without
significantly affecting those who could live with larger thresholds.

IOW, I think this part of your discussion should wait to see what actual
thresholds seem to work well in practice because it may prove to be
a non-problem.


        Stefan






^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-15 12:08                                                                                                                       ` Ihor Radchenko
  2022-08-15 12:46                                                                                                                         ` Eli Zaretskii
@ 2022-08-15 14:26                                                                                                                         ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-08-16  4:31                                                                                                                           ` Ihor Radchenko
  1 sibling, 1 reply; 685+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2022-08-15 14:26 UTC (permalink / raw)
  To: Ihor Radchenko; +Cc: 56682, Gregory Heytings, Eli Zaretskii, Dmitry Gutov

> However, I do insist on my statement that expecting major-mode to not
> widen is a bug.

No, it's a design decision, which makes it possible to use specific
implementation techniques.  Org-mode's support for multiple major modes
(org-babel) uses an implementation technique that does not require
narrowing.  Both approaches have their virtues and downsides, but if the
submode widens then the supermode has less freedom in terms of which
implementation technique to use.

> There are valid cases when a major mode needs to examine
> the whole buffer.

Not if the whole buffer contains text which the major mode can't
understand.  There are valid cases where a major mode needs to widen,
indeed, but not when called from font-lock or from
`indent-line-function`.


        Stefan






^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-15 14:06                                                                                                               ` Eli Zaretskii
@ 2022-08-15 15:42                                                                                                                 ` Dmitry Gutov
  2022-08-15 15:52                                                                                                                   ` Eli Zaretskii
  0 siblings, 1 reply; 685+ messages in thread
From: Dmitry Gutov @ 2022-08-15 15:42 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, gregory, monnier

On 15.08.2022 17:06, Eli Zaretskii wrote:
>> Date: Sun, 14 Aug 2022 23:46:13 +0300
>> Cc: 56682@debbugs.gnu.org, gregory@heytings.org, monnier@iro.umontreal.ca
>> From: Dmitry Gutov <dgutov@yandex.ru>
>>
>> I've also run this test on master now, and M-> is not instant there
>> either.
> 
> It's instantaneous here, so I'm not sure why you see something
> different.

No idea. Size of file, or even the contents might the reason.

Here's the profiler output anyway:

         1067  85% - command-execute
         1067  85%  - call-interactively
         1023  82%   - funcall-interactively
         1012  81%    - end-of-buffer
         1008  81%     - recenter
         1008  81%      - jit-lock-function
         1008  81%       - jit-lock-fontify-now
         1008  81%        - jit-lock--run-functions
         1008  81%         - run-hook-wrapped
         1008  81%          - #<compiled -0x149e7c2f08a063c3>
         1008  81%           - font-lock-fontify-region
         1008  81%            - font-lock-default-fontify-region
         1008  81%             - nxml-extend-region
          720  57%              - skip-syntax-forward
          720  57%               - internal--syntax-propertize
          720  57%                - syntax-propertize
          720  57%                 - nxml-syntax-propertize
          720  57%                  - sgml-syntax-propertize
          378  30%                     #<compiled -0x12505696cac83570>
          294  23%                     sgml--syntax-propertize-ppss
          288  23%              - nxml-move-outside-backwards
          288  23%               - nxml-inside-start
          288  23%                  syntax-ppss
           11   0%    + execute-extended-command
           44   3%   + byte-code
          171  13% - ...
          171  13%    Automatic GC
            5   0% + timer-event-handler






^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-15 15:42                                                                                                                 ` Dmitry Gutov
@ 2022-08-15 15:52                                                                                                                   ` Eli Zaretskii
  2022-08-15 16:44                                                                                                                     ` Dmitry Gutov
  0 siblings, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-15 15:52 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: 56682, gregory, monnier

> Date: Mon, 15 Aug 2022 18:42:08 +0300
> Cc: 56682@debbugs.gnu.org, gregory@heytings.org, monnier@iro.umontreal.ca
> From: Dmitry Gutov <dgutov@yandex.ru>
> 
> On 15.08.2022 17:06, Eli Zaretskii wrote:
> >> Date: Sun, 14 Aug 2022 23:46:13 +0300
> >> Cc: 56682@debbugs.gnu.org, gregory@heytings.org, monnier@iro.umontreal.ca
> >> From: Dmitry Gutov <dgutov@yandex.ru>
> >>
> >> I've also run this test on master now, and M-> is not instant there
> >> either.
> > 
> > It's instantaneous here, so I'm not sure why you see something
> > different.
> 
> No idea. Size of file, or even the contents might the reason.
> 
> Here's the profiler output anyway:
> 
>          1067  85% - command-execute
>          1067  85%  - call-interactively
>          1023  82%   - funcall-interactively
>          1012  81%    - end-of-buffer
>          1008  81%     - recenter
>          1008  81%      - jit-lock-function

When did you last resync from Git?  'recenter' got "optimized"
yesterday for buffers with long lines.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-15 14:03                                                                                               ` Eli Zaretskii
@ 2022-08-15 15:52                                                                                                 ` Dmitry Gutov
  2022-08-15 16:05                                                                                                   ` Eli Zaretskii
  0 siblings, 1 reply; 685+ messages in thread
From: Dmitry Gutov @ 2022-08-15 15:52 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, gregory, monnier

On 15.08.2022 17:03, Eli Zaretskii wrote:

> I tested this branch with an unoptimized build and a 416MB file made
> of 23 copies of dictionary.json, after disabling show-paren-mode.
> 
> Observations:
> 
>    . With the default value of font-lock-large-files, which allows
>      font-lock to widen as it pleases, the initial M-> in takes 5 min
>      here.  That's way too long.  On master, this is instantaneous.
>    . Thereafter jumping into various random places inside the file is
>      much faster, but still takes between 1 min and 2.25 min -- again
>      too long, even if I divide by 10 to get an approximation to your
>      faster machine.  On master this takes maybe 1 sec, maybe less.
>    . Horizontal and vertical motion commands are as fast (or as slow)
>      as on master, which is not surprising.
> 
> Bottom line: with the default value of font-lock-large-files, this
> scales much worse than the master branch -- which again is no
> surprise.

So we change the default, then?

   (setq font-lock-large-files '(narrow . 5000))

> My conclusion is that we do need to prevent uncontrolled
> widening in fontification-functions, if we want a scalable solution.

Do you mean the widening inside font-lock-fontify-region that's 
controlled by font-lock-dont-widen?

> How small or large should the narrowing be is a separate issue.

Right.

> If we
> want to allow a more flexible control of that, we could introduce yet
> another variable exposed to Lisp, so that users and perhaps Lisp
> programs could tune that, instead of hard-coding the value as we do
> now on master.
> 
> I honestly don't see any reason to explore more sophisticated
> alternatives for where and how to narrow, until and unless major modes
> will on their side develop capabilities which will make such
> complications (both in code, but mainly on the user part) justified.

I'm pretty sure that doing all that in Lisp is a good thing, and would 
be conducive to whatever improvements we might want to add later...

> If you agree, I'll add on master a variable to control the narrowing
> when we call fontification-functions.

...but if you've sure in your decision, okay, please add that additional 
var which will decide the narrowing bounds for fontification-functions 
(and whether to narrow at all).

That should solve my immediate needs, and I'll try to avoid this subject 
from now on. Thanks.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-15 15:52                                                                                                 ` Dmitry Gutov
@ 2022-08-15 16:05                                                                                                   ` Eli Zaretskii
  2022-08-15 18:17                                                                                                     ` Dmitry Gutov
  2022-08-15 19:36                                                                                                     ` Gregory Heytings
  0 siblings, 2 replies; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-15 16:05 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: 56682, gregory, monnier

> Date: Mon, 15 Aug 2022 18:52:41 +0300
> Cc: 56682@debbugs.gnu.org, gregory@heytings.org, monnier@iro.umontreal.ca
> From: Dmitry Gutov <dgutov@yandex.ru>
> 
> On 15.08.2022 17:03, Eli Zaretskii wrote:
> 
> > I tested this branch with an unoptimized build and a 416MB file made
> > of 23 copies of dictionary.json, after disabling show-paren-mode.
> > 
> > Observations:
> > 
> >    . With the default value of font-lock-large-files, which allows
> >      font-lock to widen as it pleases, the initial M-> in takes 5 min
> >      here.  That's way too long.  On master, this is instantaneous.
> >    . Thereafter jumping into various random places inside the file is
> >      much faster, but still takes between 1 min and 2.25 min -- again
> >      too long, even if I divide by 10 to get an approximation to your
> >      faster machine.  On master this takes maybe 1 sec, maybe less.
> >    . Horizontal and vertical motion commands are as fast (or as slow)
> >      as on master, which is not surprising.
> > 
> > Bottom line: with the default value of font-lock-large-files, this
> > scales much worse than the master branch -- which again is no
> > surprise.
> 
> So we change the default, then?
> 
>    (setq font-lock-large-files '(narrow . 5000))

No, I want a simple variable that just gives the size of the narrowed
region, with nil meaning don't narrow at all.

> > My conclusion is that we do need to prevent uncontrolled
> > widening in fontification-functions, if we want a scalable solution.
> 
> Do you mean the widening inside font-lock-fontify-region that's 
> controlled by font-lock-dont-widen?

No, I mean _any_ widening in _any_ function placed on the
fontification-functions hook.

> > I honestly don't see any reason to explore more sophisticated
> > alternatives for where and how to narrow, until and unless major modes
> > will on their side develop capabilities which will make such
> > complications (both in code, but mainly on the user part) justified.
> 
> I'm pretty sure that doing all that in Lisp is a good thing, and would 
> be conducive to whatever improvements we might want to add later...

No, because quite a few packages use jit-lock-register to run stuff
that is not font-lock at all, and I don't want that to slow down
redisplay when long lines are involved.  And trying various values of
a variable exposed to Lisp is easy enough.

> > If you agree, I'll add on master a variable to control the narrowing
> > when we call fontification-functions.
> 
> ...but if you've sure in your decision, okay, please add that additional 
> var which will decide the narrowing bounds for fontification-functions 
> (and whether to narrow at all).

Will do soon.

Thanks.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-15 15:52                                                                                                                   ` Eli Zaretskii
@ 2022-08-15 16:44                                                                                                                     ` Dmitry Gutov
  2022-08-15 16:58                                                                                                                       ` Eli Zaretskii
  0 siblings, 1 reply; 685+ messages in thread
From: Dmitry Gutov @ 2022-08-15 16:44 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, gregory, monnier

On 15.08.2022 18:52, Eli Zaretskii wrote:
>> Date: Mon, 15 Aug 2022 18:42:08 +0300
>> Cc:56682@debbugs.gnu.org,gregory@heytings.org,monnier@iro.umontreal.ca
>> From: Dmitry Gutov<dgutov@yandex.ru>
>>
>> On 15.08.2022 17:06, Eli Zaretskii wrote:
>>>> Date: Sun, 14 Aug 2022 23:46:13 +0300
>>>> Cc:56682@debbugs.gnu.org,gregory@heytings.org,monnier@iro.umontreal.ca
>>>> From: Dmitry Gutov<dgutov@yandex.ru>
>>>>
>>>> I've also run this test on master now, and M-> is not instant there
>>>> either.
>>> It's instantaneous here, so I'm not sure why you see something
>>> different.
>> No idea. Size of file, or even the contents might the reason.
>>
>> Here's the profiler output anyway:
>>
>>           1067  85% - command-execute
>>           1067  85%  - call-interactively
>>           1023  82%   - funcall-interactively
>>           1012  81%    - end-of-buffer
>>           1008  81%     - recenter
>>           1008  81%      - jit-lock-function
> When did you last resync from Git?  'recenter' got "optimized"
> yesterday for buffers with long lines.

Just today.

In any case, it doesn't look like recenter's problem, since the output 
says all (or vast majority) of its time is spent in jit-lock-function.

I just did 'make bootstrap' to be doubly sure: no change.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-15 16:44                                                                                                                     ` Dmitry Gutov
@ 2022-08-15 16:58                                                                                                                       ` Eli Zaretskii
  2022-08-15 19:51                                                                                                                         ` Dmitry Gutov
  0 siblings, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-15 16:58 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: 56682, gregory, monnier

> Date: Mon, 15 Aug 2022 19:44:07 +0300
> Cc: 56682@debbugs.gnu.org, gregory@heytings.org, monnier@iro.umontreal.ca
> From: Dmitry Gutov <dgutov@yandex.ru>
> 
> >> Here's the profiler output anyway:
> >>
> >>           1067  85% - command-execute
> >>           1067  85%  - call-interactively
> >>           1023  82%   - funcall-interactively
> >>           1012  81%    - end-of-buffer
> >>           1008  81%     - recenter
> >>           1008  81%      - jit-lock-function
> > When did you last resync from Git?  'recenter' got "optimized"
> > yesterday for buffers with long lines.
> 
> Just today.
> 
> In any case, it doesn't look like recenter's problem, since the output 
> says all (or vast majority) of its time is spent in jit-lock-function.

AFAIU 'recenter' shouldn't at all call jit-lock-function in a buffer
with long lines.  Is this "emacs -Q" without any changes from
defaults?

> I just did 'make bootstrap' to be doubly sure: no change.

What can I say? I'm stumped.  It's definitely instantaneous here, in
the long-line.xml file.  Even if I don't turn off show-paren-mode.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-15 16:05                                                                                                   ` Eli Zaretskii
@ 2022-08-15 18:17                                                                                                     ` Dmitry Gutov
  2022-08-15 18:28                                                                                                       ` Eli Zaretskii
  2022-08-15 19:25                                                                                                       ` Gregory Heytings
  2022-08-15 19:36                                                                                                     ` Gregory Heytings
  1 sibling, 2 replies; 685+ messages in thread
From: Dmitry Gutov @ 2022-08-15 18:17 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, gregory, monnier

On 15.08.2022 19:05, Eli Zaretskii wrote:
>> Date: Mon, 15 Aug 2022 18:52:41 +0300
>> Cc: 56682@debbugs.gnu.org, gregory@heytings.org, monnier@iro.umontreal.ca
>> From: Dmitry Gutov <dgutov@yandex.ru>
>>
>> On 15.08.2022 17:03, Eli Zaretskii wrote:
>>
>>> I tested this branch with an unoptimized build and a 416MB file made
>>> of 23 copies of dictionary.json, after disabling show-paren-mode.
>>>
>>> Observations:
>>>
>>>     . With the default value of font-lock-large-files, which allows
>>>       font-lock to widen as it pleases, the initial M-> in takes 5 min
>>>       here.  That's way too long.  On master, this is instantaneous.
>>>     . Thereafter jumping into various random places inside the file is
>>>       much faster, but still takes between 1 min and 2.25 min -- again
>>>       too long, even if I divide by 10 to get an approximation to your
>>>       faster machine.  On master this takes maybe 1 sec, maybe less.
>>>     . Horizontal and vertical motion commands are as fast (or as slow)
>>>       as on master, which is not surprising.
>>>
>>> Bottom line: with the default value of font-lock-large-files, this
>>> scales much worse than the master branch -- which again is no
>>> surprise.
>>
>> So we change the default, then?
>>
>>     (setq font-lock-large-files '(narrow . 5000))
> 
> No, I want a simple variable that just gives the size of the narrowed
> region, with nil meaning don't narrow at all.

OK.

>>> My conclusion is that we do need to prevent uncontrolled
>>> widening in fontification-functions, if we want a scalable solution.
>>
>> Do you mean the widening inside font-lock-fontify-region that's
>> controlled by font-lock-dont-widen?
> 
> No, I mean _any_ widening in _any_ function placed on the
> fontification-functions hook.
> 
>>> I honestly don't see any reason to explore more sophisticated
>>> alternatives for where and how to narrow, until and unless major modes
>>> will on their side develop capabilities which will make such
>>> complications (both in code, but mainly on the user part) justified.
>>
>> I'm pretty sure that doing all that in Lisp is a good thing, and would
>> be conducive to whatever improvements we might want to add later...
> 
> No, because quite a few packages use jit-lock-register to run stuff
> that is not font-lock at all, and I don't want that to slow down
> redisplay when long lines are involved.  And trying various values of
> a variable exposed to Lisp is easy enough.

It should also be possible to move the whole invocation of the 
fontification-functions up to Lisp, and apply the narrowing in the new 
function that does that.

Another reason I chose font-lock-fontify-region, though, is that it's 
called from different places. It's the common entry point for font-lock.

Like, from 'font-lock-ensure', for example (font-lock-turn-on-thing-lock 
sets font-lock-ensure-function to #'jit-lock-fontify-now).

It's called from Org (see all references to org-font-lock-ensure), for 
instance. mmm-mode calls font-lock-fontify-region directly (sometime 
we'll change it to use font-lock-ensure instead). Also see 
htmlfontify-buffer, occur-engine-line, describe-variable, 
diff-syntax-fontify-props.

It's also used in after-change-functions when font-lock-support-mode is 
not `jit-lock', but that's probably not important.

Some of these definitely can be dealing with long lines and/or large 
files. If font-lock-fontify-region decides the narrowing bounds, it can 
apply them correctly it each case.

I get what you're saying about alternative fontification-functions, 
though: we have multiple similar hooks: it, then jit-lock-functions, and 
font-lock-keywords are more or less used for the same purpose.

I've never seen fontification-functions contain anything but 
jit-lock-function, but jit-lock-functions is used by nlinum, for 
instance. And bug-reference-mode, and goto-address-mode. Perhaps we 
should ask Stefan's opinion on this.

As a practical matter, though, neither goto-addr, nor bug-reference 
should call syntax-ppss or do anything similarly costly in on long 
lines/in large files.

And nlinum might not appreciate being narrowed. It seems to be working 
okay without that in my 20 MB XML file. And in 200 MB one too.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-15 18:17                                                                                                     ` Dmitry Gutov
@ 2022-08-15 18:28                                                                                                       ` Eli Zaretskii
  2022-08-15 21:18                                                                                                         ` Dmitry Gutov
  2022-08-15 19:25                                                                                                       ` Gregory Heytings
  1 sibling, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-15 18:28 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: 56682, gregory, monnier

> Date: Mon, 15 Aug 2022 21:17:23 +0300
> Cc: 56682@debbugs.gnu.org, gregory@heytings.org, monnier@iro.umontreal.ca
> From: Dmitry Gutov <dgutov@yandex.ru>
> 
> >> I'm pretty sure that doing all that in Lisp is a good thing, and would
> >> be conducive to whatever improvements we might want to add later...
> > 
> > No, because quite a few packages use jit-lock-register to run stuff
> > that is not font-lock at all, and I don't want that to slow down
> > redisplay when long lines are involved.  And trying various values of
> > a variable exposed to Lisp is easy enough.
> 
> It should also be possible to move the whole invocation of the 
> fontification-functions up to Lisp

How do you do that, given that these functions should be called from
redisplay with the region of buffer text only redisplay knows about?

> Another reason I chose font-lock-fontify-region, though, is that it's 
> called from different places. It's the common entry point for font-lock.

I have no problem with doing something similar in font-lock, I'm just
saying that it cannot be the only place.

> I've never seen fontification-functions contain anything but 
> jit-lock-function, but jit-lock-functions is used by nlinum, for 
> instance. And bug-reference-mode, and goto-address-mode. Perhaps we 
> should ask Stefan's opinion on this.

Stefan was and is on the CC list for the entire discussion.

> And nlinum might not appreciate being narrowed. It seems to be working 
> okay without that in my 20 MB XML file. And in 200 MB one too.

Why is it important what nlinum does, when we have native line numbers
nowadays?





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-15 18:17                                                                                                     ` Dmitry Gutov
  2022-08-15 18:28                                                                                                       ` Eli Zaretskii
@ 2022-08-15 19:25                                                                                                       ` Gregory Heytings
  2022-08-15 19:54                                                                                                         ` Dmitry Gutov
  1 sibling, 1 reply; 685+ messages in thread
From: Gregory Heytings @ 2022-08-15 19:25 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: 56682, Eli Zaretskii, monnier


>
> I've never seen fontification-functions contain anything but 
> jit-lock-function,
>

You did not read the thread carefully enough: two weeks ago it was 
mentioned that fontification-functions has at least two other users: in 
ELPA multi-mode.el sets fontification-functions to multi-fontify, and in 
MELPA poly-lock.el sets fontification-functions to poly-lock-function.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-15 16:05                                                                                                   ` Eli Zaretskii
  2022-08-15 18:17                                                                                                     ` Dmitry Gutov
@ 2022-08-15 19:36                                                                                                     ` Gregory Heytings
  2022-08-15 20:17                                                                                                       ` Dmitry Gutov
  2022-08-16  2:28                                                                                                       ` Eli Zaretskii
  1 sibling, 2 replies; 685+ messages in thread
From: Gregory Heytings @ 2022-08-15 19:36 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, monnier, Dmitry Gutov


>
> No, I want a simple variable that just gives the size of the narrowed 
> region, with nil meaning don't narrow at all.
>

FWIW, I strongly object to the addition of such a variable (unless it is 
clearly stated that it is added temporarily and should not be used except 
for testing purposes).

Adding such a variable only two weeks after locked narrowing has been 
introduced means that modes will have little incentive to adapt to that 
stronger constraint, if they can "fix" whatever problems that constraint 
might cause by setting that variable to nil in their initialization hooks.

We did not have enough time yet to explore whether and how syntax-ppss can 
be improved.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-15 16:58                                                                                                                       ` Eli Zaretskii
@ 2022-08-15 19:51                                                                                                                         ` Dmitry Gutov
  2022-08-16  2:33                                                                                                                           ` Eli Zaretskii
  0 siblings, 1 reply; 685+ messages in thread
From: Dmitry Gutov @ 2022-08-15 19:51 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, gregory, monnier

On 15.08.2022 19:58, Eli Zaretskii wrote:
>> Date: Mon, 15 Aug 2022 19:44:07 +0300
>> Cc: 56682@debbugs.gnu.org, gregory@heytings.org, monnier@iro.umontreal.ca
>> From: Dmitry Gutov <dgutov@yandex.ru>
>>
>>>> Here's the profiler output anyway:
>>>>
>>>>            1067  85% - command-execute
>>>>            1067  85%  - call-interactively
>>>>            1023  82%   - funcall-interactively
>>>>            1012  81%    - end-of-buffer
>>>>            1008  81%     - recenter
>>>>            1008  81%      - jit-lock-function
>>> When did you last resync from Git?  'recenter' got "optimized"
>>> yesterday for buffers with long lines.
>>
>> Just today.
>>
>> In any case, it doesn't look like recenter's problem, since the output
>> says all (or vast majority) of its time is spent in jit-lock-function.
> 
> AFAIU 'recenter' shouldn't at all call jit-lock-function in a buffer
> with long lines.  Is this "emacs -Q" without any changes from
> defaults?

It's a buffer without long lines. Simply a large file.

'emacs -Q', yes.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-15 19:25                                                                                                       ` Gregory Heytings
@ 2022-08-15 19:54                                                                                                         ` Dmitry Gutov
  2022-08-15 20:25                                                                                                           ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  0 siblings, 1 reply; 685+ messages in thread
From: Dmitry Gutov @ 2022-08-15 19:54 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, Eli Zaretskii, monnier

On 15.08.2022 22:25, Gregory Heytings wrote:
> 
>>
>> I've never seen fontification-functions contain anything but 
>> jit-lock-function,
>>
> 
> You did not read the thread carefully enough: two weeks ago it was 
> mentioned that fontification-functions has at least two other users: in 
> ELPA multi-mode.el sets fontification-functions to multi-fontify, and in 
> MELPA poly-lock.el sets fontification-functions to poly-lock-function.

Okay. But those should be easily adapted to use jit-lock-functions instead.

They'll get all the corresponding performance improvements (just-in-time 
fontification) as a bonus.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-15 19:36                                                                                                     ` Gregory Heytings
@ 2022-08-15 20:17                                                                                                       ` Dmitry Gutov
  2022-08-15 20:29                                                                                                         ` Gregory Heytings
  2022-08-15 21:42                                                                                                         ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-08-16  2:28                                                                                                       ` Eli Zaretskii
  1 sibling, 2 replies; 685+ messages in thread
From: Dmitry Gutov @ 2022-08-15 20:17 UTC (permalink / raw)
  To: Gregory Heytings, Eli Zaretskii; +Cc: 56682, monnier

On 15.08.2022 22:36, Gregory Heytings wrote:
> 
>>
>> No, I want a simple variable that just gives the size of the narrowed 
>> region, with nil meaning don't narrow at all.
>>
> 
> FWIW, I strongly object to the addition of such a variable (unless it is 
> clearly stated that it is added temporarily and should not be used 
> except for testing purposes).
> 
> Adding such a variable only two weeks after locked narrowing has been 
> introduced means that modes will have little incentive to adapt to that 
> stronger constraint, if they can "fix" whatever problems that constraint 
> might cause by setting that variable to nil in their initialization hooks.

I don't think major modes would take advantage of that var. I hope not, 
at least.

> We did not have enough time yet to explore whether and how syntax-ppss 
> can be improved.

If you wanted the development to take this route, it would have really 
made more sense to hold off on applying the narrowing to 
fontification-functions, keeping font-lock slow-ish in large files. That 
would have encouraged direct work on speeding it up.

But anyway. Suppose we have some more success with syntax-ppss. Two options:

1) parse-partial-sexp is now faster by 10x. That just means we have 10x 
larger files to deal with.

2) We have learned to find a "safe position" in some file types, to 
avoid the full scan from the beginning. It's not hard to implement that 
for JSON and XML, as long as we can stand _some_ imprecision. But there 
will remain all other file types for which nobody has written such logic.

In both cases we fall back to something. And the preceding discussion 
has concluded that that something is narrowing.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-15 19:54                                                                                                         ` Dmitry Gutov
@ 2022-08-15 20:25                                                                                                           ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-08-15 20:40                                                                                                             ` Dmitry Gutov
  0 siblings, 1 reply; 685+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2022-08-15 20:25 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: 56682, Gregory Heytings, Eli Zaretskii

Dmitry Gutov [2022-08-15 22:54:30] wrote:
> On 15.08.2022 22:25, Gregory Heytings wrote:
>>> I've never seen fontification-functions contain anything but
>>> jit-lock-function,
>>>
>> You did not read the thread carefully enough: two weeks ago it was
>> mentioned that fontification-functions has at least two other users: in
>> ELPA multi-mode.el sets fontification-functions to multi-fontify, and in
>> MELPA poly-lock.el sets fontification-functions to poly-lock-function.
>
> Okay.  But those should be easily adapted to use jit-lock-functions instead.

IIUC they use `fontification-functions` to wrap the "select the current
major mode" operation around the call to `jit-lock-function` so that
each submode can use its own set of jit-lock clients.

It's harder to hook into `jit-lock-functions` to do that because you
need to detect when `jit-lock-functions` is modified.

AFAICT mmm-mode does not try to do that at all.

> They'll get all the corresponding performance improvements (just-in-time
> fontification) as a bonus.

Not sure what you mean by that.  `fontification-functions` is already
called "just-in-time" (and those packages don't re-implement jit-lock on
their own, they just wrap themselves around jit-lock).


        Stefan






^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-15 20:17                                                                                                       ` Dmitry Gutov
@ 2022-08-15 20:29                                                                                                         ` Gregory Heytings
  2022-08-15 20:44                                                                                                           ` Dmitry Gutov
  2022-08-15 21:42                                                                                                         ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  1 sibling, 1 reply; 685+ messages in thread
From: Gregory Heytings @ 2022-08-15 20:29 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: 56682, Eli Zaretskii, monnier


>
> I don't think major modes would take advantage of that var. I hope not, 
> at least.
>

You're optimistic, let's say I'm less optimistic.

>
> If you wanted the development to take this route, it would have really 
> made more sense to hold off on applying the narrowing to 
> fontification-functions, keeping font-lock slow-ish in large files. That 
> would have encouraged direct work on speeding it up.
>

That's your opinion.  What I think would have most likely happened is what 
you yourself said: these are large files, it's unavoidable that font 
locking takes somes time (these are not your exact words, I hope they 
express what you said faithfully).

>
> But anyway. Suppose we have some more success with syntax-ppss. Two 
> options:
>

There are many other options besides the two options you listed.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-15 20:25                                                                                                           ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2022-08-15 20:40                                                                                                             ` Dmitry Gutov
  2022-08-15 21:57                                                                                                               ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  0 siblings, 1 reply; 685+ messages in thread
From: Dmitry Gutov @ 2022-08-15 20:40 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: 56682, Gregory Heytings, Eli Zaretskii

On 15.08.2022 23:25, Stefan Monnier via Bug reports for GNU Emacs, the 
Swiss army knife of text editors wrote:
> Dmitry Gutov [2022-08-15 22:54:30] wrote:
>> On 15.08.2022 22:25, Gregory Heytings wrote:
>>>> I've never seen fontification-functions contain anything but
>>>> jit-lock-function,
>>>>
>>> You did not read the thread carefully enough: two weeks ago it was
>>> mentioned that fontification-functions has at least two other users: in
>>> ELPA multi-mode.el sets fontification-functions to multi-fontify, and in
>>> MELPA poly-lock.el sets fontification-functions to poly-lock-function.
>>
>> Okay.  But those should be easily adapted to use jit-lock-functions instead.
> 
> IIUC they use `fontification-functions` to wrap the "select the current
> major mode" operation around the call to `jit-lock-function` so that
> each submode can use its own set of jit-lock clients.
> 
> It's harder to hook into `jit-lock-functions` to do that because you
> need to detect when `jit-lock-functions` is modified.

Do they detect when fontification-functions are modified? Sounds like 
just as much of a rare occurrence.

> AFAICT mmm-mode does not try to do that at all.

It does the wrapping through custom font-lock-fontify-region-function 
and syntax-propertize-function. The major mode specific values are saved 
after the major mode is called. Any subsequent modifications are just 
ignored.

>> They'll get all the corresponding performance improvements (just-in-time
>> fontification) as a bonus.
> 
> Not sure what you mean by that.  `fontification-functions` is already
> called "just-in-time" (and those packages don't re-implement jit-lock on
> their own, they just wrap themselves around jit-lock).

Okay then.

Sounds like somewhere in there there's a duplication of design still.

But also: if they go on to call jit-lock anyway, then they would go 
through whatever application of narrowing that we put in there. Be that 
in font-lock-fontify-region, or in jit-lock-function.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-15 20:29                                                                                                         ` Gregory Heytings
@ 2022-08-15 20:44                                                                                                           ` Dmitry Gutov
  2022-08-15 20:53                                                                                                             ` Gregory Heytings
  0 siblings, 1 reply; 685+ messages in thread
From: Dmitry Gutov @ 2022-08-15 20:44 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, Eli Zaretskii, monnier

On 15.08.2022 23:29, Gregory Heytings wrote:

>> If you wanted the development to take this route, it would have really 
>> made more sense to hold off on applying the narrowing to 
>> fontification-functions, keeping font-lock slow-ish in large files. 
>> That would have encouraged direct work on speeding it up.
>>
> 
> That's your opinion.  What I think would have most likely happened is 
> what you yourself said: these are large files, it's unavoidable that 
> font locking takes somes time (these are not your exact words, I hope 
> they express what you said faithfully).

I said those words just as I was working on improving font-lock's 
performance in JSON files. An effort which doesn't make sense if you 
narrow around font-lock anyway.

Also note that until now it has been impossible to improve redisplay of 
big files by working on font-lock (other bottlenecks were much more 
significant).

>> But anyway. Suppose we have some more success with syntax-ppss. Two 
>> options:
>>
> 
> There are many other options besides the two options you listed.

Perhaps. I don't think anybody's mentioned them here, though.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-15 20:44                                                                                                           ` Dmitry Gutov
@ 2022-08-15 20:53                                                                                                             ` Gregory Heytings
  2022-08-15 21:15                                                                                                               ` Dmitry Gutov
  0 siblings, 1 reply; 685+ messages in thread
From: Gregory Heytings @ 2022-08-15 20:53 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: 56682, Eli Zaretskii, monnier


>
> I said those words just as I was working on improving font-lock's 
> performance in JSON files. An effort which doesn't make sense if you 
> narrow around font-lock anyway.
>
> Also note that until now it has been impossible to improve redisplay of 
> big files by working on font-lock (other bottlenecks were much more 
> significant).
>

Wrong.  The (much more common) case of big files _without_ long lines, in 
which the same font locking slowdowns already exist, has AFAICS not been a 
sufficient incentive to improve font locking.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-15 20:53                                                                                                             ` Gregory Heytings
@ 2022-08-15 21:15                                                                                                               ` Dmitry Gutov
  2022-08-15 22:08                                                                                                                 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  0 siblings, 1 reply; 685+ messages in thread
From: Dmitry Gutov @ 2022-08-15 21:15 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, Eli Zaretskii, monnier

On 15.08.2022 23:53, Gregory Heytings wrote:
>>
>> I said those words just as I was working on improving font-lock's 
>> performance in JSON files. An effort which doesn't make sense if you 
>> narrow around font-lock anyway.
>>
>> Also note that until now it has been impossible to improve redisplay 
>> of big files by working on font-lock (other bottlenecks were much more 
>> significant).
>>
> 
> Wrong.  The (much more common) case of big files _without_ long lines, 
> in which the same font locking slowdowns already exist, has AFAICS not 
> been a sufficient incentive to improve font locking.

Okay, you're right about that.

There have been many more complaints about being unable to edit a file 
with a 5000+ line comfortably, than about editing 100+ MB files.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-15 18:28                                                                                                       ` Eli Zaretskii
@ 2022-08-15 21:18                                                                                                         ` Dmitry Gutov
  2022-08-16  2:45                                                                                                           ` Eli Zaretskii
  0 siblings, 1 reply; 685+ messages in thread
From: Dmitry Gutov @ 2022-08-15 21:18 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, gregory, monnier

[-- Attachment #1: Type: text/plain, Size: 2243 bytes --]

On 15.08.2022 21:28, Eli Zaretskii wrote:
>> Date: Mon, 15 Aug 2022 21:17:23 +0300
>> Cc: 56682@debbugs.gnu.org, gregory@heytings.org, monnier@iro.umontreal.ca
>> From: Dmitry Gutov <dgutov@yandex.ru>
>>
>>>> I'm pretty sure that doing all that in Lisp is a good thing, and would
>>>> be conducive to whatever improvements we might want to add later...
>>>
>>> No, because quite a few packages use jit-lock-register to run stuff
>>> that is not font-lock at all, and I don't want that to slow down
>>> redisplay when long lines are involved.  And trying various values of
>>> a variable exposed to Lisp is easy enough.
>>
>> It should also be possible to move the whole invocation of the
>> fontification-functions up to Lisp
> 
> How do you do that, given that these functions should be called from
> redisplay with the region of buffer text only redisplay knows about?

Something like in the attached patch.

>> Another reason I chose font-lock-fontify-region, though, is that it's
>> called from different places. It's the common entry point for font-lock.
> 
> I have no problem with doing something similar in font-lock, I'm just
> saying that it cannot be the only place.

If we apply narrowing in handle_fontified_prop (or like in the 
attachment), and also in font-lock-fontify-region, it seems like every 
significant (*) execution path will go through two repetitions of the 
same logic.

That's not ideal.

(*) Significant by the metric of having impact on Emacs's performance, 
in large files especially.

>> I've never seen fontification-functions contain anything but
>> jit-lock-function, but jit-lock-functions is used by nlinum, for
>> instance. And bug-reference-mode, and goto-address-mode. Perhaps we
>> should ask Stefan's opinion on this.
> 
> Stefan was and is on the CC list for the entire discussion.
> 
>> And nlinum might not appreciate being narrowed. It seems to be working
>> okay without that in my 20 MB XML file. And in 200 MB one too.
> 
> Why is it important what nlinum does, when we have native line numbers
> nowadays?

Just an example of a mode which uses jit-lock-functions. With an 
implication that other, less known modes, might have similar needs and 
behavior. There aren't too many known examples.

[-- Attachment #2: run-fontification-functions.diff --]
[-- Type: text/x-patch, Size: 2306 bytes --]

diff --git a/lisp/font-core.el b/lisp/font-core.el
index f70c42bb03..09e55bcfb1 100644
--- a/lisp/font-core.el
+++ b/lisp/font-core.el
@@ -266,6 +266,12 @@ turn-on-font-lock-if-desired
     (let (inhibit-quit)
       (turn-on-font-lock))))
 
+(defun run-fontification-functions (pos)
+  ;; XXX: Apply narrowing around here.
+  ;; (pcase-exhaustive font-lock-large-files
+  ;;   ...)
+  (run-hook-with-args 'fontification-functions pos))
+
 (define-globalized-minor-mode global-font-lock-mode
   font-lock-mode turn-on-font-lock-if-desired
   ;; What was this :extra-args thingy for?  --Stef
diff --git a/src/xdisp.c b/src/xdisp.c
index 1e8f70b2db..ce90aeefbc 100644
--- a/src/xdisp.c
+++ b/src/xdisp.c
@@ -4381,53 +4381,18 @@ handle_fontified_prop (struct it *it)
 	  NILP (prop) && IT_CHARPOS (*it) < Z))
     {
       specpdl_ref count = SPECPDL_INDEX ();
-      Lisp_Object val;
       struct buffer *obuf = current_buffer;
       ptrdiff_t begv = BEGV, zv = ZV;
       bool old_clip_changed = current_buffer->clip_changed;
       bool saved_inhibit_flag = it->f->inhibit_clear_image_cache;
 
-      val = Vfontification_functions;
-      specbind (Qfontification_functions, Qnil);
-
       eassert (it->end_charpos == ZV);
 
       /* Don't allow Lisp that runs from 'fontification-functions'
 	 clear our face and image caches behind our back.  */
       it->f->inhibit_clear_image_cache = true;
 
-      if (!CONSP (val) || EQ (XCAR (val), Qlambda))
-	safe_call1 (val, pos);
-      else
-	{
-	  Lisp_Object fns, fn;
-
-	  fns = Qnil;
-
-	  for (; CONSP (val); val = XCDR (val))
-	    {
-	      fn = XCAR (val);
-
-	      if (EQ (fn, Qt))
-		{
-		  /* A value of t indicates this hook has a local
-		     binding; it means to run the global binding too.
-		     In a global value, t should not occur.  If it
-		     does, we must ignore it to avoid an endless
-		     loop.  */
-		  for (fns = Fdefault_value (Qfontification_functions);
-		       CONSP (fns);
-		       fns = XCDR (fns))
-		    {
-		      fn = XCAR (fns);
-		      if (!EQ (fn, Qt))
-			safe_call1 (fn, pos);
-		    }
-		}
-	      else
-		safe_call1 (fn, pos);
-	    }
-	}
+      safe_call1 (intern ("run-fontification-functions"), pos);
 
       it->f->inhibit_clear_image_cache = saved_inhibit_flag;
       unbind_to (count, Qnil);

^ permalink raw reply related	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-15 20:17                                                                                                       ` Dmitry Gutov
  2022-08-15 20:29                                                                                                         ` Gregory Heytings
@ 2022-08-15 21:42                                                                                                         ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-08-15 21:47                                                                                                           ` Gregory Heytings
  1 sibling, 1 reply; 685+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2022-08-15 21:42 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: 56682, Gregory Heytings, Eli Zaretskii

>> FWIW, I strongly object to the addition of such a variable (unless it is
>> clearly stated that it is added temporarily and should not be used except
>> for testing purposes).
>> Adding such a variable only two weeks after locked narrowing has been
>> introduced means that modes will have little incentive to adapt to that
>> stronger constraint, if they can "fix" whatever problems that constraint
>> might cause by setting that variable to nil in their initialization hooks.
> I don't think major modes would take advantage of that var.
> I hope not, at least.

I wouldn't mind because if things get slow, we get to point the finger
squarely at the culprit.


        Stefan






^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-15 21:42                                                                                                         ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2022-08-15 21:47                                                                                                           ` Gregory Heytings
  2022-08-15 22:15                                                                                                             ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-08-15 22:20                                                                                                             ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  0 siblings, 2 replies; 685+ messages in thread
From: Gregory Heytings @ 2022-08-15 21:47 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: 56682, Eli Zaretskii, Dmitry Gutov


>>> FWIW, I strongly object to the addition of such a variable (unless it 
>>> is clearly stated that it is added temporarily and should not be used 
>>> except for testing purposes).
>>>
>>> Adding such a variable only two weeks after locked narrowing has been 
>>> introduced means that modes will have little incentive to adapt to 
>>> that stronger constraint, if they can "fix" whatever problems that 
>>> constraint might cause by setting that variable to nil in their 
>>> initialization hooks.
>>
>> I don't think major modes would take advantage of that var. I hope not, 
>> at least.
>
> I wouldn't mind because if things get slow, we get to point the finger 
> squarely at the culprit.
>

If it is clearly stated that it should only be used for testing/debugging 
purposes, yes.  Otherwise it's just another variable that anyone can use 
as they see fit.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-15 20:40                                                                                                             ` Dmitry Gutov
@ 2022-08-15 21:57                                                                                                               ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-08-15 23:33                                                                                                                 ` Dmitry Gutov
  0 siblings, 1 reply; 685+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2022-08-15 21:57 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: 56682, Gregory Heytings, Eli Zaretskii

>> IIUC they use `fontification-functions` to wrap the "select the current
>> major mode" operation around the call to `jit-lock-function` so that
>> each submode can use its own set of jit-lock clients.
>> It's harder to hook into `jit-lock-functions` to do that because you
>> need to detect when `jit-lock-functions` is modified.
>
> Do they detect when fontification-functions are modified? Sounds like just
> as much of a rare occurrence.

Could be.

>> AFAICT mmm-mode does not try to do that at all.
>
> It does the wrapping through custom font-lock-fontify-region-function and
> syntax-propertize-function. The major mode specific values are saved after
> the major mode is called. Any subsequent modifications are just ignored.

I'm not sure why they decided to wrap `fontification-functions`, but in
theory it lets them support things like a submode that's using
`nhexl-mode`, another using `nlinum-mode`, and yet another using
`glasses-mode`.

In any case, these multi mode packages always need to "look back" in
order to find which mode to use at a given position, so they inevitably
need some kind of widening to work correctly.

>>> They'll get all the corresponding performance improvements (just-in-time
>>> fontification) as a bonus.
>> Not sure what you mean by that.  `fontification-functions` is already
>> called "just-in-time" (and those packages don't re-implement jit-lock on
>> their own, they just wrap themselves around jit-lock).
> Okay then.
> Sounds like somewhere in there there's a duplication of design still.

I think the duplication is in the weird semantics of
`fontification-functions`: this supposedly holds a list of functions,
but it's difficult to make it work right with more than one function.
I think it should be replaced with a single `fontification-function` instead.

> But also: if they go on to call jit-lock anyway, then they would go through
> whatever application of narrowing that we put in there. Be that in
> font-lock-fontify-region, or in jit-lock-function.

Indeed.  But before doing so, they may(?) scan the whole buffer to find out
which submode to use at the current location.

I think it's OK to "break" those packages with some forced narrowing
until they get improved to do something sane in large files or
long lines.  But of course it should be possible to unbreak them without
recompiling Emacs.


        Stefan






^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-15 21:15                                                                                                               ` Dmitry Gutov
@ 2022-08-15 22:08                                                                                                                 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-08-15 22:14                                                                                                                   ` Gregory Heytings
  0 siblings, 1 reply; 685+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2022-08-15 22:08 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: 56682, Gregory Heytings, Eli Zaretskii

> There have been many more complaints about being unable to edit a file with
> a 5000+ line comfortably, than about editing 100+ MB files.

Also because we have things like so-long to handle the large file case.


        Stefan






^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-15 22:08                                                                                                                 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2022-08-15 22:14                                                                                                                   ` Gregory Heytings
  2022-08-15 22:23                                                                                                                     ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  0 siblings, 1 reply; 685+ messages in thread
From: Gregory Heytings @ 2022-08-15 22:14 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: 56682, Eli Zaretskii, Dmitry Gutov


>> There have been many more complaints about being unable to edit a file 
>> with a 5000+ line comfortably, than about editing 100+ MB files.
>
> Also because we have things like so-long to handle the large file case.
>

These things are expedients for want of anything better, aren't they?





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-15 21:47                                                                                                           ` Gregory Heytings
@ 2022-08-15 22:15                                                                                                             ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-08-15 22:20                                                                                                             ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  1 sibling, 0 replies; 685+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2022-08-15 22:15 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, Eli Zaretskii, Dmitry Gutov

> If it is clearly stated that it should only be used for testing/debugging
> purposes, yes.  Otherwise it's just another variable that anyone can use as
> they see fit.

I don't think it should be restricted to testing/debugging.  But it
should clearly say that using it should be limited to code that has been
carefully written to take into account the potential
performance implications.


        Stefan






^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-15 21:47                                                                                                           ` Gregory Heytings
  2022-08-15 22:15                                                                                                             ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2022-08-15 22:20                                                                                                             ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-08-16  8:12                                                                                                               ` Gregory Heytings
  1 sibling, 1 reply; 685+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2022-08-15 22:20 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, Eli Zaretskii, Dmitry Gutov

> Otherwise it's just another variable that anyone can use as they see fit.

All Emacs variables and functions are like that.  It's not something to
deplore, on the contrary, it's what makes Emacs what it is.


        Stefan






^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-15 22:14                                                                                                                   ` Gregory Heytings
@ 2022-08-15 22:23                                                                                                                     ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-08-16  8:12                                                                                                                       ` Gregory Heytings
  0 siblings, 1 reply; 685+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2022-08-15 22:23 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, Eli Zaretskii, Dmitry Gutov

Gregory Heytings [2022-08-15 22:14:07] wrote:
>>> There have been many more complaints about being unable to edit a file
>>> with a 5000+ line comfortably, than about editing 100+ MB files.
>> Also because we have things like so-long to handle the large file case.
> These things are expedients for want of anything better, aren't they?

Yes, just like the narrowing your use in your long lines patch.

They're slightly different in that they don't try to prevent replacing
those solutions with something better (or worse), tho.


        Stefan






^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-15 21:57                                                                                                               ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2022-08-15 23:33                                                                                                                 ` Dmitry Gutov
  0 siblings, 0 replies; 685+ messages in thread
From: Dmitry Gutov @ 2022-08-15 23:33 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: 56682, Gregory Heytings, Eli Zaretskii

On 16.08.2022 00:57, Stefan Monnier via Bug reports for GNU Emacs, the 
Swiss army knife of text editors wrote:

>>> AFAICT mmm-mode does not try to do that at all.
>>
>> It does the wrapping through custom font-lock-fontify-region-function and
>> syntax-propertize-function. The major mode specific values are saved after
>> the major mode is called. Any subsequent modifications are just ignored.
> 
> I'm not sure why they decided to wrap `fontification-functions`, but in
> theory it lets them support things like a submode that's using
> `nhexl-mode`, another using `nlinum-mode`, and yet another using
> `glasses-mode`.

I'm guessing this could also be implemented through a wrapping 
jit-lock-functions element if mmm-mode, say, saved the value of this 
variable corresponding to each major mode. Similarly to 
mmm-fontify-region-function.

But doing it in a caller up a level looks a little cleaner, of course.

> In any case, these multi mode packages always need to "look back" in
> order to find which mode to use at a given position, so they inevitably
> need some kind of widening to work correctly.

Right. Even if they need to skip back just a little bit (usually), being 
able to look back is useful.

Although the "which mode" information is often available through an 
overlay or text property at point, so that need might be worked around 
in a lot of cases.

>>>> They'll get all the corresponding performance improvements (just-in-time
>>>> fontification) as a bonus.
>>> Not sure what you mean by that.  `fontification-functions` is already
>>> called "just-in-time" (and those packages don't re-implement jit-lock on
>>> their own, they just wrap themselves around jit-lock).
>> Okay then.
>> Sounds like somewhere in there there's a duplication of design still.
> 
> I think the duplication is in the weird semantics of
> `fontification-functions`: this supposedly holds a list of functions,
> but it's difficult to make it work right with more than one function.
> I think it should be replaced with a single `fontification-function` instead.

I would try to go further: either document that `fontification-function' 
is ultimately supposed to call jit-lock, or call jit-lock-function 
directly (from handle_fontified_props or whatever), forcing polymode and 
multi-mode to use around-advice on that function (will that work on a 
function directly called from C?).

If we clarify that fontification has to go through jit-lock-function 
either way, we can more confidently move the application of font-lock 
narrowing to jit-lock-fontify-now (that's where fontification-functions 
and font-lock-ensure meet).





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-15 19:36                                                                                                     ` Gregory Heytings
  2022-08-15 20:17                                                                                                       ` Dmitry Gutov
@ 2022-08-16  2:28                                                                                                       ` Eli Zaretskii
  2022-08-16  8:26                                                                                                         ` Gregory Heytings
  1 sibling, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-16  2:28 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, monnier, dgutov

> Date: Mon, 15 Aug 2022 19:36:49 +0000
> From: Gregory Heytings <gregory@heytings.org>
> cc: Dmitry Gutov <dgutov@yandex.ru>, 56682@debbugs.gnu.org, 
>     monnier@iro.umontreal.ca
> 
> > No, I want a simple variable that just gives the size of the narrowed 
> > region, with nil meaning don't narrow at all.
> >
> 
> FWIW, I strongly object to the addition of such a variable (unless it is 
> clearly stated that it is added temporarily and should not be used except 
> for testing purposes).
> 
> Adding such a variable only two weeks after locked narrowing has been 
> introduced means that modes will have little incentive to adapt to that 
> stronger constraint, if they can "fix" whatever problems that constraint 
> might cause by setting that variable to nil in their initialization hooks.

Modes can do that already by changing long-line-threshold to nil,
don't they?





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-15 19:51                                                                                                                         ` Dmitry Gutov
@ 2022-08-16  2:33                                                                                                                           ` Eli Zaretskii
  2022-08-16 14:00                                                                                                                             ` Dmitry Gutov
  0 siblings, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-16  2:33 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: 56682, gregory, monnier

> Date: Mon, 15 Aug 2022 22:51:16 +0300
> Cc: 56682@debbugs.gnu.org, gregory@heytings.org, monnier@iro.umontreal.ca
> From: Dmitry Gutov <dgutov@yandex.ru>
> 
> On 15.08.2022 19:58, Eli Zaretskii wrote:
> >> Date: Mon, 15 Aug 2022 19:44:07 +0300
> >> Cc: 56682@debbugs.gnu.org, gregory@heytings.org, monnier@iro.umontreal.ca
> >> From: Dmitry Gutov <dgutov@yandex.ru>
> >>
> >>>> Here's the profiler output anyway:
> >>>>
> >>>>            1067  85% - command-execute
> >>>>            1067  85%  - call-interactively
> >>>>            1023  82%   - funcall-interactively
> >>>>            1012  81%    - end-of-buffer
> >>>>            1008  81%     - recenter
> >>>>            1008  81%      - jit-lock-function
> >>> When did you last resync from Git?  'recenter' got "optimized"
> >>> yesterday for buffers with long lines.
> >>
> >> Just today.
> >>
> >> In any case, it doesn't look like recenter's problem, since the output
> >> says all (or vast majority) of its time is spent in jit-lock-function.
> > 
> > AFAIU 'recenter' shouldn't at all call jit-lock-function in a buffer
> > with long lines.  Is this "emacs -Q" without any changes from
> > defaults?
> 
> It's a buffer without long lines. Simply a large file.

??? Are we talking about long-line.xml, or are we talking about
some other file?  We did nothing to change the behavior in large files
without long lines.

If you are saying that 'recenter' takes too long in some file, and
therefore delays M-> for too long, it is probably a separate issue, so
please report that as a separate bug, preferably with the file that
causes it.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-15 21:18                                                                                                         ` Dmitry Gutov
@ 2022-08-16  2:45                                                                                                           ` Eli Zaretskii
  2022-08-16 10:57                                                                                                             ` Dmitry Gutov
  0 siblings, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-16  2:45 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: 56682, gregory, monnier

> Date: Tue, 16 Aug 2022 00:18:35 +0300
> Cc: 56682@debbugs.gnu.org, gregory@heytings.org, monnier@iro.umontreal.ca
> From: Dmitry Gutov <dgutov@yandex.ru>
> 
> >> It should also be possible to move the whole invocation of the
> >> fontification-functions up to Lisp
> > 
> > How do you do that, given that these functions should be called from
> > redisplay with the region of buffer text only redisplay knows about?
> 
> Something like in the attached patch.

I fail to see the difference which would justify such a change.

> If we apply narrowing in handle_fontified_prop (or like in the 
> attachment), and also in font-lock-fontify-region, it seems like every 
> significant (*) execution path will go through two repetitions of the 
> same logic.
> 
> That's not ideal.

But not a catastrophe, either.

> >> And nlinum might not appreciate being narrowed. It seems to be working
> >> okay without that in my 20 MB XML file. And in 200 MB one too.
> > 
> > Why is it important what nlinum does, when we have native line numbers
> > nowadays?
> 
> Just an example of a mode which uses jit-lock-functions. With an 
> implication that other, less known modes, might have similar needs and 
> behavior. There aren't too many known examples.

Let's hear them hollering, and then see what are their problems.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-15 14:26                                                                                                                         ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2022-08-16  4:31                                                                                                                           ` Ihor Radchenko
  2022-08-16 10:26                                                                                                                             ` Gregory Heytings
  2022-08-16 13:20                                                                                                                             ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  0 siblings, 2 replies; 685+ messages in thread
From: Ihor Radchenko @ 2022-08-16  4:31 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: 56682, Gregory Heytings, Eli Zaretskii, Dmitry Gutov

Stefan Monnier <monnier@iro.umontreal.ca> writes:

>> However, I do insist on my statement that expecting major-mode to not
>> widen is a bug.
>
> No, it's a design decision, which makes it possible to use specific
> implementation techniques.  Org-mode's support for multiple major modes
> (org-babel) uses an implementation technique that does not require
> narrowing.  Both approaches have their virtues and downsides, but if the
> submode widens then the supermode has less freedom in terms of which
> implementation technique to use.

I agree that major-mode doing (widen) may be problematic. However, at
least Org mode does need to do it in order to parse the buffer.

>> There are valid cases when a major mode needs to examine
>> the whole buffer.
>
> Not if the whole buffer contains text which the major mode can't
> understand.  There are valid cases where a major mode needs to widen,
> indeed, but not when called from font-lock or from
> `indent-line-function`.

`org-indent-line' (the value of `indent-line-function' in Org mode) does
require invoking parser in order to determine the syntactic object at
point, which, in turn, needs to consider the full buffer contents. This
is prescribed by Org syntax. We cannot avoid this.

-- 
Ihor Radchenko,
Org mode contributor,
Learn more about Org mode at https://orgmode.org/.
Support Org development at https://liberapay.com/org-mode,
or support my work at https://liberapay.com/yantar92





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-15 11:17                                                                                                                 ` Eli Zaretskii
@ 2022-08-16  4:38                                                                                                                   ` Ihor Radchenko
  2022-08-16 11:19                                                                                                                     ` Eli Zaretskii
  0 siblings, 1 reply; 685+ messages in thread
From: Ihor Radchenko @ 2022-08-16  4:38 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, gregory, monnier, dgutov

Eli Zaretskii <eliz@gnu.org> writes:

>> I have seen very long lines in Org. Specifically, in source block
>> output. (http query)
>
> How long is "very long" in those cases?

AFAIR, over a screen full of text when truncate-lines is set to nil.
It should be over 5k symbols in my screen.

I remember this because it triggered a significant fontification
slowdown caused by some (now fixed) Org regexp hitting too many matches
on that line.

Also, I just checked some of my org files and found a >15k chars long line.

-- 
Ihor Radchenko,
Org mode contributor,
Learn more about Org mode at https://orgmode.org/.
Support Org development at https://liberapay.com/org-mode,
or support my work at https://liberapay.com/yantar92





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-15 22:20                                                                                                             ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2022-08-16  8:12                                                                                                               ` Gregory Heytings
  0 siblings, 0 replies; 685+ messages in thread
From: Gregory Heytings @ 2022-08-16  8:12 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: 56682, Eli Zaretskii, Dmitry Gutov


>> Otherwise it's just another variable that anyone can use as they see 
>> fit.
>
> All Emacs variables and functions are like that.
>

Not all of them, no.  See the three examples I mentioned earlier: 
internal-interpreter-environment, max-specpdl-size, max-lisp-eval-depth. 
And I'm sure there are others.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-15 22:23                                                                                                                     ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2022-08-16  8:12                                                                                                                       ` Gregory Heytings
  2022-08-16  8:21                                                                                                                         ` Gregory Heytings
  2022-08-16 13:39                                                                                                                         ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  0 siblings, 2 replies; 685+ messages in thread
From: Gregory Heytings @ 2022-08-16  8:12 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: 56682, Eli Zaretskii, Dmitry Gutov


>>>> There have been many more complaints about being unable to edit a 
>>>> file with a 5000+ line comfortably, than about editing 100+ MB files.
>>>
>>> Also because we have things like so-long to handle the large file 
>>> case.
>>
>> These things are expedients for want of anything better, aren't they?
>
> Yes, just like the narrowing your use in your long lines patch.
>

That's... unfair.  These things turn off everything (in particular, the 
major mode and font locking) and provide a bare-bones editing experience. 
What we'd like now is to provide Emacs users a near-complete editing 
experience in all buffers.

>
> They're slightly different in that they don't try to prevent replacing 
> those solutions with something better (or worse), tho.
>

When one looks at things from far enough, everything is indeed "slightly 
different" from everything else.  For example, the Statue of Liberty is 
"slightly different" from Empire State Building.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-16  8:12                                                                                                                       ` Gregory Heytings
@ 2022-08-16  8:21                                                                                                                         ` Gregory Heytings
  2022-08-16 13:43                                                                                                                           ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-08-16 13:39                                                                                                                         ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  1 sibling, 1 reply; 685+ messages in thread
From: Gregory Heytings @ 2022-08-16  8:21 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: 56682, Eli Zaretskii, Dmitry Gutov


>>>>> There have been many more complaints about being unable to edit a 
>>>>> file with a 5000+ line comfortably, than about editing 100+ MB 
>>>>> files.
>>>> 
>>>> Also because we have things like so-long to handle the large file 
>>>> case.
>>> 
>>> These things are expedients for want of anything better, aren't they?
>> 
>> Yes, just like the narrowing your use in your long lines patch.
>
> That's... unfair.  These things turn off everything (in particular, the 
> major mode and font locking) and provide a bare-bones editing 
> experience. What we'd like now is to provide Emacs users a near-complete 
> editing experience in all buffers.
>

And, by the way, what could be a better solution?  Without assuming that 
computers have infinitely fast CPUs, that is?





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-16  2:28                                                                                                       ` Eli Zaretskii
@ 2022-08-16  8:26                                                                                                         ` Gregory Heytings
  2022-08-16 11:34                                                                                                           ` Eli Zaretskii
  2022-08-16 13:07                                                                                                           ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  0 siblings, 2 replies; 685+ messages in thread
From: Gregory Heytings @ 2022-08-16  8:26 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, monnier, dgutov


>>> No, I want a simple variable that just gives the size of the narrowed 
>>> region, with nil meaning don't narrow at all.
>>
>> FWIW, I strongly object to the addition of such a variable (unless it 
>> is clearly stated that it is added temporarily and should not be used 
>> except for testing purposes).
>>
>> Adding such a variable only two weeks after locked narrowing has been 
>> introduced means that modes will have little incentive to adapt to that 
>> stronger constraint, if they can "fix" whatever problems that 
>> constraint might cause by setting that variable to nil in their 
>> initialization hooks.
>
> Modes can do that already by changing long-line-threshold to nil, don't 
> they?
>

They can indeed, but that variable is documented as "for debugging 
purposes" only.  Moreover setting that variable to nil implies that they 
deactivate all long line optimizations, which is a higher price to pay.

The way I see this is that Emacs is doing efforts to solve editing 
slowdowns as best as possible, but that there is a "last mile" that cannot 
be solved without the collaboration from major and minor modes.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-15 11:47                                                                                                                       ` Ihor Radchenko
@ 2022-08-16 10:24                                                                                                                         ` Gregory Heytings
  2022-08-16 10:49                                                                                                                           ` Ihor Radchenko
  0 siblings, 1 reply; 685+ messages in thread
From: Gregory Heytings @ 2022-08-16 10:24 UTC (permalink / raw)
  To: Ihor Radchenko; +Cc: 56682, Eli Zaretskii, Stefan Monnier, Dmitry Gutov


>> I'm not sure I correctly understand what you mean, but it seems to me 
>> that the fact that the Org parser caches its results implies that Org 
>> doesn't need to access the whole buffer to make "local" decisions.  It 
>> can use the data in cache for everything that is outside of the current 
>> narrowing, and update the portion of the cache corresponding to the 
>> current narrowing. IOW, there is no need to maintain separate parser 
>> caches for each possible narrowing state.  Am I misunderstanding 
>> something?
>
> Cache existence is not guaranteed.
>

Can that cache not be created unconditionally when the Org file is opened?

>
> When cache does not exist, Org must widen. If not, the cache will be 
> valid only for the current narrowing.
>
> When cache do exist, Org may not need to widen. But that also mean that 
> widening has happened in the past when the cache was generated.
>
> At the end, Org does need to be able to widen safely. At least in some 
> cases.
>

That will always be possible.  What should better be avoided is to use 
widen (and to scan the whole buffer) in performance-critical places, such 
as fontification-functions.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-16  4:31                                                                                                                           ` Ihor Radchenko
@ 2022-08-16 10:26                                                                                                                             ` Gregory Heytings
  2022-08-16 10:52                                                                                                                               ` Ihor Radchenko
  2022-08-16 13:20                                                                                                                             ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  1 sibling, 1 reply; 685+ messages in thread
From: Gregory Heytings @ 2022-08-16 10:26 UTC (permalink / raw)
  To: Ihor Radchenko; +Cc: 56682, Eli Zaretskii, Stefan Monnier, Dmitry Gutov


>> Not if the whole buffer contains text which the major mode can't 
>> understand.  There are valid cases where a major mode needs to widen, 
>> indeed, but not when called from font-lock or from 
>> `indent-line-function`.
>
> `org-indent-line' (the value of `indent-line-function' in Org mode) does 
> require invoking parser in order to determine the syntactic object at 
> point, which, in turn, needs to consider the full buffer contents. This 
> is prescribed by Org syntax. We cannot avoid this.
>

Do you really mean that there is no way to avoid invoking the parser on 
the whole buffer, and to possibly process 20 MB of data, when 
org-indent-line is called?





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-16 10:24                                                                                                                         ` Gregory Heytings
@ 2022-08-16 10:49                                                                                                                           ` Ihor Radchenko
  2022-08-16 11:30                                                                                                                             ` Gregory Heytings
  0 siblings, 1 reply; 685+ messages in thread
From: Ihor Radchenko @ 2022-08-16 10:49 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, Eli Zaretskii, Stefan Monnier, Dmitry Gutov

Gregory Heytings <gregory@heytings.org> writes:

>> Cache existence is not guaranteed.
>>
>
> Can that cache not be created unconditionally when the Org file is opened?

Without cache, the parser will have to process everything on every
request to determine object at point.

>> When cache does not exist, Org must widen. If not, the cache will be 
>> valid only for the current narrowing.
>>
>> When cache do exist, Org may not need to widen. But that also mean that 
>> widening has happened in the past when the cache was generated.
>>
>> At the end, Org does need to be able to widen safely. At least in some 
>> cases.
>>
>
> That will always be possible.  What should better be avoided is to use 
> widen (and to scan the whole buffer) in performance-critical places, such 
> as fontification-functions.

We tried to. In fact, public Org repository does use regexp search and
tries to scan as little as possible inside fontification-function.

However, that approach proved incorrect in a number of occasions. We
have a stable stream of bug reports related to incorrect fontification.
Some were fixed by creating more intricate heuristics, but we reached
the point when using the parser can be actually faster compared to the
fragile heuristic tower in our fontification code.

Our parser, in fact, does not really scan the whole buffer from the very
beginning to determine object at point. It only parses the minimal
possible portion that is sufficient to determine syntax object at the
requested position. This scan is very fast and becomes even faster with
caching. But it does need to look at the whole buffer because Org syntax
is context-dependent. Previous objects outside narrowing can alter the
syntax inside.

-- 
Ihor Radchenko,
Org mode contributor,
Learn more about Org mode at https://orgmode.org/.
Support Org development at https://liberapay.com/org-mode,
or support my work at https://liberapay.com/yantar92





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-16 10:26                                                                                                                             ` Gregory Heytings
@ 2022-08-16 10:52                                                                                                                               ` Ihor Radchenko
  0 siblings, 0 replies; 685+ messages in thread
From: Ihor Radchenko @ 2022-08-16 10:52 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, Eli Zaretskii, Stefan Monnier, Dmitry Gutov

Gregory Heytings <gregory@heytings.org> writes:

>> `org-indent-line' (the value of `indent-line-function' in Org mode) does 
>> require invoking parser in order to determine the syntactic object at 
>> point, which, in turn, needs to consider the full buffer contents. This 
>> is prescribed by Org syntax. We cannot avoid this.
>>
>
> Do you really mean that there is no way to avoid invoking the parser on 
> the whole buffer, and to possibly process 20 MB of data, when 
> org-indent-line is called?

In the worst-case scenario, yes. However, it is usually not the case.
org-indent-line usually needs to look no further than the parent
headline - a few lines above in the majority of Org documents.

-- 
Ihor Radchenko,
Org mode contributor,
Learn more about Org mode at https://orgmode.org/.
Support Org development at https://liberapay.com/org-mode,
or support my work at https://liberapay.com/yantar92





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-16  2:45                                                                                                           ` Eli Zaretskii
@ 2022-08-16 10:57                                                                                                             ` Dmitry Gutov
  0 siblings, 0 replies; 685+ messages in thread
From: Dmitry Gutov @ 2022-08-16 10:57 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, gregory, monnier

On 16.08.2022 05:45, Eli Zaretskii wrote:
>> If we apply narrowing in handle_fontified_prop (or like in the
>> attachment), and also in font-lock-fontify-region, it seems like every
>> significant (*) execution path will go through two repetitions of the
>> same logic.
>>
>> That's not ideal.
> But not a catastrophe, either.

I suppose not.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-16  4:38                                                                                                                   ` Ihor Radchenko
@ 2022-08-16 11:19                                                                                                                     ` Eli Zaretskii
  2022-08-16 11:30                                                                                                                       ` Ihor Radchenko
  0 siblings, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-16 11:19 UTC (permalink / raw)
  To: Ihor Radchenko; +Cc: 56682, gregory, monnier, dgutov

> From: Ihor Radchenko <yantar92@gmail.com>
> Cc: monnier@iro.umontreal.ca,  dgutov@yandex.ru,  gregory@heytings.org,
>   56682@debbugs.gnu.org
> Date: Tue, 16 Aug 2022 12:38:37 +0800
> 
> Eli Zaretskii <eliz@gnu.org> writes:
> 
> >> I have seen very long lines in Org. Specifically, in source block
> >> output. (http query)
> >
> > How long is "very long" in those cases?
> 
> AFAIR, over a screen full of text when truncate-lines is set to nil.
> It should be over 5k symbols in my screen.
> 
> I remember this because it triggered a significant fontification
> slowdown caused by some (now fixed) Org regexp hitting too many matches
> on that line.
> 
> Also, I just checked some of my org files and found a >15k chars long line.

5k shouldn't present a problem, especially when some/most of it is
invisible (as frequently is the case in Org).  15k might be a problem,
indeed, depending on what's there.  However, since you never
complained about long lines until this day, I guess it isn't such a
big problem.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-16 11:19                                                                                                                     ` Eli Zaretskii
@ 2022-08-16 11:30                                                                                                                       ` Ihor Radchenko
  2022-08-16 12:10                                                                                                                         ` Eli Zaretskii
  2022-08-16 13:26                                                                                                                         ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  0 siblings, 2 replies; 685+ messages in thread
From: Ihor Radchenko @ 2022-08-16 11:30 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, gregory, monnier, dgutov

Eli Zaretskii <eliz@gnu.org> writes:

>> Also, I just checked some of my org files and found a >15k chars long line.
>
> 5k shouldn't present a problem, especially when some/most of it is
> invisible (as frequently is the case in Org).  15k might be a problem,
> indeed, depending on what's there.  However, since you never
> complained about long lines until this day, I guess it isn't such a
> big problem.

You are likely right. Note that this branch of the discussion mostly
started from me clarifying data about some large Org files. I did not
imply that Org files commonly have very long lines. Simply large-sized
Org files are more common (5-20Mb).

Also, regarding most of the lines being invisible. Unless I miss
something, jit-lock actually tries to trigger fontification in the
invisible lines when we have something like:
-- <window top>
* headline
<Mbs of invisible text hidden using 'invisible text property>
* another headline
-- <window bottom>

I even had to write a dedicated filter in
org-fold-core.el:org-fold-core-fontify-region (on Org main branch) to
avoid fontification inside hidden text.

-- 
Ihor Radchenko,
Org mode contributor,
Learn more about Org mode at https://orgmode.org/.
Support Org development at https://liberapay.com/org-mode,
or support my work at https://liberapay.com/yantar92





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-16 10:49                                                                                                                           ` Ihor Radchenko
@ 2022-08-16 11:30                                                                                                                             ` Gregory Heytings
  2022-08-16 11:33                                                                                                                               ` Ihor Radchenko
  0 siblings, 1 reply; 685+ messages in thread
From: Gregory Heytings @ 2022-08-16 11:30 UTC (permalink / raw)
  To: Ihor Radchenko; +Cc: 56682, Eli Zaretskii, Stefan Monnier, Dmitry Gutov


>>> Cache existence is not guaranteed.
>>
>> Can that cache not be created unconditionally when the Org file is 
>> opened?
>
> Without cache, the parser will have to process everything on every 
> request to determine object at point.
>

I'm not sure I understand what you mean?  If the cache is created when the 
Org file is opened and updated when necessary, its existence becomes 
guaranteed, no?





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-16 11:30                                                                                                                             ` Gregory Heytings
@ 2022-08-16 11:33                                                                                                                               ` Ihor Radchenko
  0 siblings, 0 replies; 685+ messages in thread
From: Ihor Radchenko @ 2022-08-16 11:33 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, Eli Zaretskii, Stefan Monnier, Dmitry Gutov

Gregory Heytings <gregory@heytings.org> writes:

>>>> Cache existence is not guaranteed.
>>>
>>> Can that cache not be created unconditionally when the Org file is 
>>> opened?
>>
>> Without cache, the parser will have to process everything on every 
>> request to determine object at point.
>>
>
> I'm not sure I understand what you mean?  If the cache is created when the 
> Org file is opened and updated when necessary, its existence becomes 
> guaranteed, no?

Cache (or parts of cache) may be invalidated when buffer is edited.

-- 
Ihor Radchenko,
Org mode contributor,
Learn more about Org mode at https://orgmode.org/.
Support Org development at https://liberapay.com/org-mode,
or support my work at https://liberapay.com/yantar92





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-16  8:26                                                                                                         ` Gregory Heytings
@ 2022-08-16 11:34                                                                                                           ` Eli Zaretskii
  2022-08-16 12:42                                                                                                             ` Gregory Heytings
  2022-08-16 13:07                                                                                                           ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  1 sibling, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-16 11:34 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, monnier, dgutov

> Date: Tue, 16 Aug 2022 08:26:49 +0000
> From: Gregory Heytings <gregory@heytings.org>
> cc: 56682@debbugs.gnu.org, monnier@iro.umontreal.ca, dgutov@yandex.ru
> 
> >> Adding such a variable only two weeks after locked narrowing has been 
> >> introduced means that modes will have little incentive to adapt to that 
> >> stronger constraint, if they can "fix" whatever problems that 
> >> constraint might cause by setting that variable to nil in their 
> >> initialization hooks.
> >
> > Modes can do that already by changing long-line-threshold to nil, don't 
> > they?
> 
> They can indeed, but that variable is documented as "for debugging 
> purposes" only.

That never stopped anyone, IME.

> Moreover setting that variable to nil implies that they 
> deactivate all long line optimizations, which is a higher price to pay.

They could do that only locally in one buffer, or temporarily, or just
set it to a much larger value, or ...

> The way I see this is that Emacs is doing efforts to solve editing 
> slowdowns as best as possible, but that there is a "last mile" that cannot 
> be solved without the collaboration from major and minor modes.

I'm not worried by that: we do control what code gets installed in the
modes that are part of Emacs, so we can always prevent any such modes
from (ab)using these variables.  And if third-party packages want to
do that, in effect harming their users, it's eventually their funeral.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-16 11:30                                                                                                                       ` Ihor Radchenko
@ 2022-08-16 12:10                                                                                                                         ` Eli Zaretskii
  2022-08-16 12:25                                                                                                                           ` Ihor Radchenko
  2022-08-16 13:26                                                                                                                         ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  1 sibling, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-16 12:10 UTC (permalink / raw)
  To: Ihor Radchenko; +Cc: 56682, gregory, monnier, dgutov

> From: Ihor Radchenko <yantar92@gmail.com>
> Cc: monnier@iro.umontreal.ca,  dgutov@yandex.ru,  gregory@heytings.org,
>   56682@debbugs.gnu.org
> Date: Tue, 16 Aug 2022 19:30:11 +0800
> 
> Eli Zaretskii <eliz@gnu.org> writes:
> 
> >> Also, I just checked some of my org files and found a >15k chars long line.
> >
> > 5k shouldn't present a problem, especially when some/most of it is
> > invisible (as frequently is the case in Org).  15k might be a problem,
> > indeed, depending on what's there.  However, since you never
> > complained about long lines until this day, I guess it isn't such a
> > big problem.
> 
> You are likely right. Note that this branch of the discussion mostly
> started from me clarifying data about some large Org files. I did not
> imply that Org files commonly have very long lines. Simply large-sized
> Org files are more common (5-20Mb).
> 
> Also, regarding most of the lines being invisible. Unless I miss
> something, jit-lock actually tries to trigger fontification in the
> invisible lines when we have something like:
> -- <window top>
> * headline
> <Mbs of invisible text hidden using 'invisible text property>
> * another headline
> -- <window bottom>

That 's true, but:

  . jit-lock is called by the display engine, and the display engine
    skips invisible text
  . jit-lock calls the fontification functions with a relatively small
    chunk of buffer text

The result of these two factoids is that (a) jit-lock shouldn't
attempt fontifications, except when the un-fontified text starts
exactly at the beginning of invisible text; and (b) even if
fontifications are invoked on invisible text, it should be a
relatively small chunk of it.

More importantly, when I wrote the above, I wasn't thinking about
fontifications, I was thinking about the rest of the display code,
which always skips invisible characters, and skips them using
relatively fast search for text properties, not the much slower
iteration through the text one character at a time.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-16 12:10                                                                                                                         ` Eli Zaretskii
@ 2022-08-16 12:25                                                                                                                           ` Ihor Radchenko
  2022-08-16 12:46                                                                                                                             ` Eli Zaretskii
  0 siblings, 1 reply; 685+ messages in thread
From: Ihor Radchenko @ 2022-08-16 12:25 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, gregory, monnier, dgutov

Eli Zaretskii <eliz@gnu.org> writes:

>> Also, regarding most of the lines being invisible. Unless I miss
>> something, jit-lock actually tries to trigger fontification in the
>> invisible lines when we have something like:
>> -- <window top>
>> * headline
>> <Mbs of invisible text hidden using 'invisible text property>
>> * another headline
>> -- <window bottom>
>
> That 's true, but:
>
>   . jit-lock is called by the display engine, and the display engine
>     skips invisible text
>   . jit-lock calls the fontification functions with a relatively small
>     chunk of buffer text

Apparently large chunks of text were requested in my tests. In any case,
let's not go into this here. Let me re-check these observations again and
file a bug report if I can create a reproducer. This issue is unrelated
to the changes described in the current thread.

> More importantly, when I wrote the above, I wasn't thinking about
> fontifications, I was thinking about the rest of the display code,
> which always skips invisible characters, and skips them using
> relatively fast search for text properties, not the much slower
> iteration through the text one character at a time.

Just in case, please note that Org does not touch 'invisible text
property to hide text. Instead, we set char-property-alias-alist
remapping several other text properties with different non-nil values
into 'invisible. This also means that functions like
`next-single-property-change' may not skip the whole invisible chunk in
one go. Not sure if it is important.

-- 
Ihor Radchenko,
Org mode contributor,
Learn more about Org mode at https://orgmode.org/.
Support Org development at https://liberapay.com/org-mode,
or support my work at https://liberapay.com/yantar92





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-16 11:34                                                                                                           ` Eli Zaretskii
@ 2022-08-16 12:42                                                                                                             ` Gregory Heytings
  2022-08-16 12:51                                                                                                               ` Eli Zaretskii
  0 siblings, 1 reply; 685+ messages in thread
From: Gregory Heytings @ 2022-08-16 12:42 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, monnier, dgutov


>>>> Adding such a variable only two weeks after locked narrowing has been 
>>>> introduced means that modes will have little incentive to adapt to 
>>>> that stronger constraint, if they can "fix" whatever problems that 
>>>> constraint might cause by setting that variable to nil in their 
>>>> initialization hooks.
>>>
>>> Modes can do that already by changing long-line-threshold to nil, 
>>> don't they?
>>
>> They can indeed, but that variable is documented as "for debugging 
>> purposes" only.
>
> That never stopped anyone, IME.
>

At least they cannot tell the haven't been warned...

Can this change at least wait a few days?  I'm working on the next 
iteration of the code, I'll see if I can include such a feature.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-16 12:25                                                                                                                           ` Ihor Radchenko
@ 2022-08-16 12:46                                                                                                                             ` Eli Zaretskii
  0 siblings, 0 replies; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-16 12:46 UTC (permalink / raw)
  To: Ihor Radchenko; +Cc: 56682, gregory, monnier, dgutov

> From: Ihor Radchenko <yantar92@gmail.com>
> Cc: monnier@iro.umontreal.ca,  dgutov@yandex.ru,  gregory@heytings.org,
>   56682@debbugs.gnu.org
> Date: Tue, 16 Aug 2022 20:25:57 +0800
> 
> > More importantly, when I wrote the above, I wasn't thinking about
> > fontifications, I was thinking about the rest of the display code,
> > which always skips invisible characters, and skips them using
> > relatively fast search for text properties, not the much slower
> > iteration through the text one character at a time.
> 
> Just in case, please note that Org does not touch 'invisible text
> property to hide text. Instead, we set char-property-alias-alist
> remapping several other text properties with different non-nil values
> into 'invisible. This also means that functions like
> `next-single-property-change' may not skip the whole invisible chunk in
> one go. Not sure if it is important.

I don't think I understand what you are saying, but as long as
whatever you do causes the relevant text not to be displayed, it means
the display engine did understand the text is invisible and refrained
from displaying it.  Which means it skipped it, as it does with any
invisible text.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-16 12:42                                                                                                             ` Gregory Heytings
@ 2022-08-16 12:51                                                                                                               ` Eli Zaretskii
  0 siblings, 0 replies; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-16 12:51 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, monnier, dgutov

> Date: Tue, 16 Aug 2022 12:42:04 +0000
> From: Gregory Heytings <gregory@heytings.org>
> cc: 56682@debbugs.gnu.org, monnier@iro.umontreal.ca, dgutov@yandex.ru
> 
> 
> >>>> Adding such a variable only two weeks after locked narrowing has been 
> >>>> introduced means that modes will have little incentive to adapt to 
> >>>> that stronger constraint, if they can "fix" whatever problems that 
> >>>> constraint might cause by setting that variable to nil in their 
> >>>> initialization hooks.
> >>>
> >>> Modes can do that already by changing long-line-threshold to nil, 
> >>> don't they?
> >>
> >> They can indeed, but that variable is documented as "for debugging 
> >> purposes" only.
> >
> > That never stopped anyone, IME.
> >
> 
> At least they cannot tell the haven't been warned...
> 
> Can this change at least wait a few days?

It will wait regardless, because I still have too many things on my
plate that are more important.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-16  8:26                                                                                                         ` Gregory Heytings
  2022-08-16 11:34                                                                                                           ` Eli Zaretskii
@ 2022-08-16 13:07                                                                                                           ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-08-16 13:09                                                                                                             ` Eli Zaretskii
  1 sibling, 1 reply; 685+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2022-08-16 13:07 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, Eli Zaretskii, dgutov

> The way I see this is that Emacs is doing efforts to solve editing slowdowns
> as best as possible, but that there is a "last mile" that cannot be solved
> without the collaboration from major and minor modes.

The locked narrowing prevents that "last mile", sadly.


        Stefan






^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-16 13:07                                                                                                           ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2022-08-16 13:09                                                                                                             ` Eli Zaretskii
  2022-08-16 13:58                                                                                                               ` Dmitry Gutov
  0 siblings, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-16 13:09 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: 56682, gregory, dgutov

> From: Stefan Monnier <monnier@iro.umontreal.ca>
> Cc: Eli Zaretskii <eliz@gnu.org>,  56682@debbugs.gnu.org,  dgutov@yandex.ru
> Date: Tue, 16 Aug 2022 09:07:59 -0400
> 
> > The way I see this is that Emacs is doing efforts to solve editing slowdowns
> > as best as possible, but that there is a "last mile" that cannot be solved
> > without the collaboration from major and minor modes.
> 
> The locked narrowing prevents that "last mile", sadly.

Nonsense, it doesn't prevent any such things.

Let's not exaggerate when we try to make a point, okay?





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-16  4:31                                                                                                                           ` Ihor Radchenko
  2022-08-16 10:26                                                                                                                             ` Gregory Heytings
@ 2022-08-16 13:20                                                                                                                             ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-08-16 13:29                                                                                                                               ` Ihor Radchenko
  1 sibling, 1 reply; 685+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2022-08-16 13:20 UTC (permalink / raw)
  To: Ihor Radchenko; +Cc: 56682, Gregory Heytings, Eli Zaretskii, Dmitry Gutov

> I agree that major-mode doing (widen) may be problematic. However, at
> least Org mode does need to do it in order to parse the buffer.

There's no doubt that a major mode may need to override a user's
narrowing in order to work correctly.  That doesn't mean that it
absolutely always needs to have access to the whole buffer.

>>> There are valid cases when a major mode needs to examine
>>> the whole buffer.
>> Not if the whole buffer contains text which the major mode can't
>> understand.  There are valid cases where a major mode needs to widen,
>> indeed, but not when called from font-lock or from
>> `indent-line-function`.
> `org-indent-line' (the value of `indent-line-function' in Org mode) does
> require invoking parser in order to determine the syntactic object at
> point, which, in turn, needs to consider the full buffer contents.

*All* indentation code needs to look at the context.  For that reason
`indent-according-to-mode` already widens as appropriate before calling
`indent-line-function`.  For that reason the function placed on
`indent-line-function` *never* needs to widen (and should never widen).


        Stefan






^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-16 11:30                                                                                                                       ` Ihor Radchenko
  2022-08-16 12:10                                                                                                                         ` Eli Zaretskii
@ 2022-08-16 13:26                                                                                                                         ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  1 sibling, 0 replies; 685+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2022-08-16 13:26 UTC (permalink / raw)
  To: Ihor Radchenko; +Cc: 56682, Eli Zaretskii, gregory, dgutov

> Also, regarding most of the lines being invisible. Unless I miss
> something, jit-lock actually tries to trigger fontification in the
> invisible lines when we have something like:
> -- <window top>
> * headline
> <Mbs of invisible text hidden using 'invisible text property>
> * another headline
> -- <window bottom>

Normally, jit-lock does not fontify invisible text except as a side
effect of fontifying visible text (because the fontification is made in
chunks of about 1kB, plus rounding up to wholelines and such).

So it's normal that it fontifies a couple kB of that MB of invisible
text, but if it fontifies all those MBs I'd consider it as a bug.


        Stefan






^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-16 13:20                                                                                                                             ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2022-08-16 13:29                                                                                                                               ` Ihor Radchenko
  0 siblings, 0 replies; 685+ messages in thread
From: Ihor Radchenko @ 2022-08-16 13:29 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: 56682, Gregory Heytings, Eli Zaretskii, Dmitry Gutov

Stefan Monnier <monnier@iro.umontreal.ca> writes:

>>>> There are valid cases when a major mode needs to examine
>>>> the whole buffer.
>>> Not if the whole buffer contains text which the major mode can't
>>> understand.  There are valid cases where a major mode needs to widen,
>>> indeed, but not when called from font-lock or from
>>> `indent-line-function`.
>> `org-indent-line' (the value of `indent-line-function' in Org mode) does
>> require invoking parser in order to determine the syntactic object at
>> point, which, in turn, needs to consider the full buffer contents.
>
> *All* indentation code needs to look at the context.  For that reason
> `indent-according-to-mode` already widens as appropriate before calling
> `indent-line-function`.  For that reason the function placed on
> `indent-line-function` *never* needs to widen (and should never widen).

Then, can Emacs throw an error if widen must not be allowed in certain
scenarios? In complex codebase like Org, we cannot guarantee that some
user-customized function does not widen. Or spurious advice. Debugging
absence of widening somewhere inside deep function calls will be a
nightmare.

-- 
Ihor Radchenko,
Org mode contributor,
Learn more about Org mode at https://orgmode.org/.
Support Org development at https://liberapay.com/org-mode,
or support my work at https://liberapay.com/yantar92





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-16  8:12                                                                                                                       ` Gregory Heytings
  2022-08-16  8:21                                                                                                                         ` Gregory Heytings
@ 2022-08-16 13:39                                                                                                                         ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-08-16 14:02                                                                                                                           ` Gregory Heytings
  1 sibling, 1 reply; 685+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2022-08-16 13:39 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, Eli Zaretskii, Dmitry Gutov

>>>>> There have been many more complaints about being unable to edit a file
>>>>> with a 5000+ line comfortably, than about editing 100+ MB files.
>>>> Also because we have things like so-long to handle the large file case.
>>> These things are expedients for want of anything better, aren't they?
>> Yes, just like the narrowing your use in your long lines patch.
> That's... unfair.

I disagree.  And I don't think it's something you should be ashamed of:
it's standard practice to use expedient solutions for want of anything
better.  It's how we make progress.

Those expedient solutions (i.e. those cheap solutions that still cover
most cases tolerably) might be "not ideal" but finding them is usually
not easy, so pride would be more appropriate.

>> They're slightly different in that they don't try to prevent replacing
>> those solutions with something better (or worse), tho.
> When one looks at things from far enough, everything is indeed "slightly
> different" from everything else.  For example, the Statue of Liberty is
> "slightly different" from Empire State Building.

I agree with you that "slightly different" is a euphemism when
describing whether an expedient solution can be overridden or not.
:-)


        Stefan






^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-16  8:21                                                                                                                         ` Gregory Heytings
@ 2022-08-16 13:43                                                                                                                           ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-08-16 13:53                                                                                                                             ` Eli Zaretskii
  2022-08-16 14:03                                                                                                                             ` Gregory Heytings
  0 siblings, 2 replies; 685+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2022-08-16 13:43 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, Eli Zaretskii, Dmitry Gutov

>>>>>> There have been many more complaints about being unable to edit a file
>>>>>> with a 5000+ line comfortably, than about editing 100+ MB files.
>>>>> Also because we have things like so-long to handle the large file case.
>>>> These things are expedients for want of anything better, aren't they?
>>> Yes, just like the narrowing your use in your long lines patch.
>> That's... unfair.  These things turn off everything (in particular, the
>> major mode and font locking) and provide a bare-bones editing
>> experience. What we'd like now is to provide Emacs users a near-complete
>> editing experience in all buffers.
> And, by the way, what could be a better solution?

A solution that is humble enough to leave an open door for ad-hoc
case-specific handling of the problem.

> Without assuming that computers have infinitely fast CPUs, that is?

If the font-lock rules to use in the buffer depend on whether the first
line of the buffer starts with #! or not, then your narrowing will break
them even tho they could work perfectly fine in a 1TB buffer without
requiring an infinitely fast CPU (since they don't need to scan the
whole buffer: just the region of interest plus the first 2 chars).


        Stefan






^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-16 13:43                                                                                                                           ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2022-08-16 13:53                                                                                                                             ` Eli Zaretskii
  2022-08-16 14:03                                                                                                                             ` Gregory Heytings
  1 sibling, 0 replies; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-16 13:53 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: 56682, gregory, dgutov

> From: Stefan Monnier <monnier@iro.umontreal.ca>
> Cc: 56682@debbugs.gnu.org,  Eli Zaretskii <eliz@gnu.org>,  Dmitry Gutov
>  <dgutov@yandex.ru>
> Date: Tue, 16 Aug 2022 09:43:56 -0400
> 
> > And, by the way, what could be a better solution?
> 
> A solution that is humble enough to leave an open door for ad-hoc
> case-specific handling of the problem.

I don't get it: a way to provide such an open door was described here
many days ago.  It's not like you, Stefan, lack write access to the
repository.  What am I missing?





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-16 13:09                                                                                                             ` Eli Zaretskii
@ 2022-08-16 13:58                                                                                                               ` Dmitry Gutov
  2022-08-16 14:07                                                                                                                 ` Eli Zaretskii
  0 siblings, 1 reply; 685+ messages in thread
From: Dmitry Gutov @ 2022-08-16 13:58 UTC (permalink / raw)
  To: Eli Zaretskii, Stefan Monnier; +Cc: 56682, gregory

On 16.08.2022 16:09, Eli Zaretskii wrote:
>> From: Stefan Monnier<monnier@iro.umontreal.ca>
>> Cc: Eli Zaretskii<eliz@gnu.org>,56682@debbugs.gnu.org,dgutov@yandex.ru
>> Date: Tue, 16 Aug 2022 09:07:59 -0400
>>
>>> The way I see this is that Emacs is doing efforts to solve editing slowdowns
>>> as best as possible, but that there is a "last mile" that cannot be solved
>>> without the collaboration from major and minor modes.
>> The locked narrowing prevents that "last mile", sadly.
> Nonsense, it doesn't prevent any such things.
> 
> Let's not exaggerate when we try to make a point, okay?

Why nonsense?

I've made the same point a bunch of times: arbitrary narrowing without 
regard for context stops any potential major-mode specific code from 
looking for a "safe position" which might be outside of that narrowing.

The new variable (which will let us increase the font-lock narrowing 
radius) should get us 95% there, though.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-16  2:33                                                                                                                           ` Eli Zaretskii
@ 2022-08-16 14:00                                                                                                                             ` Dmitry Gutov
  2022-08-16 14:10                                                                                                                               ` Eli Zaretskii
  0 siblings, 1 reply; 685+ messages in thread
From: Dmitry Gutov @ 2022-08-16 14:00 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, gregory, monnier

On 16.08.2022 05:33, Eli Zaretskii wrote:
>> Date: Mon, 15 Aug 2022 22:51:16 +0300
>> Cc: 56682@debbugs.gnu.org, gregory@heytings.org, monnier@iro.umontreal.ca
>> From: Dmitry Gutov <dgutov@yandex.ru>
>>
>> On 15.08.2022 19:58, Eli Zaretskii wrote:
>>>> Date: Mon, 15 Aug 2022 19:44:07 +0300
>>>> Cc: 56682@debbugs.gnu.org, gregory@heytings.org, monnier@iro.umontreal.ca
>>>> From: Dmitry Gutov <dgutov@yandex.ru>
>>>>
>>>>>> Here's the profiler output anyway:
>>>>>>
>>>>>>             1067  85% - command-execute
>>>>>>             1067  85%  - call-interactively
>>>>>>             1023  82%   - funcall-interactively
>>>>>>             1012  81%    - end-of-buffer
>>>>>>             1008  81%     - recenter
>>>>>>             1008  81%      - jit-lock-function
>>>>> When did you last resync from Git?  'recenter' got "optimized"
>>>>> yesterday for buffers with long lines.
>>>>
>>>> Just today.
>>>>
>>>> In any case, it doesn't look like recenter's problem, since the output
>>>> says all (or vast majority) of its time is spent in jit-lock-function.
>>>
>>> AFAIU 'recenter' shouldn't at all call jit-lock-function in a buffer
>>> with long lines.  Is this "emacs -Q" without any changes from
>>> defaults?
>>
>> It's a buffer without long lines. Simply a large file.
> 
> ??? Are we talking about long-line.xml, or are we talking about
> some other file?  We did nothing to change the behavior in large files
> without long lines.

I'm talking about a 20 MB file I created manually with some simple 
contents. Just no long lines.

long-line.xml is only 300 KB, but if you query-replace '</' with '^J</' 
(to break up long lines) and then copy its contents 100 times, and save, 
then kill and reopen and pres M->, you should see the same delay that 
I'm talking about, on master.

The conditions seem to be: no long lines, file size > 20MB.

The profiler output looks the same.

> If you are saying that 'recenter' takes too long in some file, and
> therefore delays M-> for too long, it is probably a separate issue, so
> please report that as a separate bug, preferably with the file that
> causes it.

It seems pertinent to me since ultimately the decision to narrow in 
handle_fontified_prop is driven by the idea that font-lock in large 
files ends up being a problem anyway. And here we have a large file 
where this doesn't help.

But I can file it separately, of course.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-16 13:39                                                                                                                         ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2022-08-16 14:02                                                                                                                           ` Gregory Heytings
  2022-08-16 14:15                                                                                                                             ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  0 siblings, 1 reply; 685+ messages in thread
From: Gregory Heytings @ 2022-08-16 14:02 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: 56682, Eli Zaretskii, Dmitry Gutov

[-- Attachment #1: Type: text/plain, Size: 721 bytes --]


>
> And I don't think it's something you should be ashamed of: it's standard 
> practice to use expedient solutions for want of anything better.  It's 
> how we make progress.
>
> Those expedient solutions (i.e. those cheap solutions that still cover 
> most cases tolerably) might be "not ideal" but finding them is usually 
> not easy, so pride would be more appropriate.
>

I'm neither ashamed nor proud, I'm not Kim Kardashian 😉  I just try to 
have fun, for the programmer-specific value of "fun".  Still, I cannot see 
how an editor could provide a complete editing experience in all buffers 
without limiting in one way or another what is done, and what can be done, 
after each editing command.

^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-16 13:43                                                                                                                           ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-08-16 13:53                                                                                                                             ` Eli Zaretskii
@ 2022-08-16 14:03                                                                                                                             ` Gregory Heytings
  2022-08-16 14:22                                                                                                                               ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  1 sibling, 1 reply; 685+ messages in thread
From: Gregory Heytings @ 2022-08-16 14:03 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: 56682, Eli Zaretskii, Dmitry Gutov


>> Without assuming that computers have infinitely fast CPUs, that is?
>
> If the font-lock rules to use in the buffer depend on whether the first 
> line of the buffer starts with #! or not, then your narrowing will break 
> them even tho they could work perfectly fine in a 1TB buffer without 
> requiring an infinitely fast CPU (since they don't need to scan the 
> whole buffer: just the region of interest plus the first 2 chars).
>

Why on earth should a font-lock rule check, inside each redisplay cycle, 
whether the first line of the buffer starts with #! or not?  Isn't that an 
information that can, and in fact should, be cached?





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-16 13:58                                                                                                               ` Dmitry Gutov
@ 2022-08-16 14:07                                                                                                                 ` Eli Zaretskii
  2022-08-16 14:11                                                                                                                   ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  0 siblings, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-16 14:07 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: 56682, gregory, monnier

> Date: Tue, 16 Aug 2022 16:58:15 +0300
> Cc: 56682@debbugs.gnu.org, gregory@heytings.org
> From: Dmitry Gutov <dgutov@yandex.ru>
> 
> On 16.08.2022 16:09, Eli Zaretskii wrote:
> >> From: Stefan Monnier<monnier@iro.umontreal.ca>
> >> Cc: Eli Zaretskii<eliz@gnu.org>,56682@debbugs.gnu.org,dgutov@yandex.ru
> >> Date: Tue, 16 Aug 2022 09:07:59 -0400
> >>
> >>> The way I see this is that Emacs is doing efforts to solve editing slowdowns
> >>> as best as possible, but that there is a "last mile" that cannot be solved
> >>> without the collaboration from major and minor modes.
> >> The locked narrowing prevents that "last mile", sadly.
> > Nonsense, it doesn't prevent any such things.
> > 
> > Let's not exaggerate when we try to make a point, okay?
> 
> Why nonsense?

Because it takes no effort to override it and then try changes in any
major mode.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-16 14:00                                                                                                                             ` Dmitry Gutov
@ 2022-08-16 14:10                                                                                                                               ` Eli Zaretskii
  2022-08-16 14:39                                                                                                                                 ` Dmitry Gutov
  0 siblings, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-16 14:10 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: 56682, gregory, monnier

> Date: Tue, 16 Aug 2022 17:00:18 +0300
> Cc: 56682@debbugs.gnu.org, gregory@heytings.org, monnier@iro.umontreal.ca
> From: Dmitry Gutov <dgutov@yandex.ru>
> 
> >> It's a buffer without long lines. Simply a large file.
> > 
> > ??? Are we talking about long-line.xml, or are we talking about
> > some other file?  We did nothing to change the behavior in large files
> > without long lines.
> 
> I'm talking about a 20 MB file I created manually with some simple 
> contents. Just no long lines.

That's a different problem, one we didn't try to fix yet.

> > If you are saying that 'recenter' takes too long in some file, and
> > therefore delays M-> for too long, it is probably a separate issue, so
> > please report that as a separate bug, preferably with the file that
> > causes it.
> 
> It seems pertinent to me since ultimately the decision to narrow in 
> handle_fontified_prop is driven by the idea that font-lock in large 
> files ends up being a problem anyway. And here we have a large file 
> where this doesn't help.

Because it's a different problem, with likely a different solution.

> But I can file it separately, of course.

Yes, please.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-16 14:07                                                                                                                 ` Eli Zaretskii
@ 2022-08-16 14:11                                                                                                                   ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-08-16 14:14                                                                                                                     ` Eli Zaretskii
  0 siblings, 1 reply; 685+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2022-08-16 14:11 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, gregory, Dmitry Gutov

Eli Zaretskii [2022-08-16 17:07:46] wrote:
>> >> The locked narrowing prevents that "last mile", sadly.
>> > Nonsense, it doesn't prevent any such things.
>> > Let's not exaggerate when we try to make a point, okay?
>> Why nonsense?
> Because it takes no effort to override it and then try changes in any
> major mode.

AFAIK it requires recompiling Emacs, which in practice means nobody will
be motivated to try it out since they can't really share the result with
anyone else.


        Stefan






^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-16 14:11                                                                                                                   ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2022-08-16 14:14                                                                                                                     ` Eli Zaretskii
  2022-08-16 14:31                                                                                                                       ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  0 siblings, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-16 14:14 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: 56682, gregory, dgutov

> From: Stefan Monnier <monnier@iro.umontreal.ca>
> Cc: Dmitry Gutov <dgutov@yandex.ru>,  56682@debbugs.gnu.org,
>   gregory@heytings.org
> Date: Tue, 16 Aug 2022 10:11:57 -0400
> 
> Eli Zaretskii [2022-08-16 17:07:46] wrote:
> >> >> The locked narrowing prevents that "last mile", sadly.
> >> > Nonsense, it doesn't prevent any such things.
> >> > Let's not exaggerate when we try to make a point, okay?
> >> Why nonsense?
> > Because it takes no effort to override it and then try changes in any
> > major mode.
> 
> AFAIK it requires recompiling Emacs

No, it doesn't.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-16 14:02                                                                                                                           ` Gregory Heytings
@ 2022-08-16 14:15                                                                                                                             ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-08-16 14:21                                                                                                                               ` Gregory Heytings
  0 siblings, 1 reply; 685+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2022-08-16 14:15 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, Eli Zaretskii, Dmitry Gutov

> I'm neither ashamed nor proud, I'm not Kim Kardashian 😉  I just try to have
> fun, for the programmer-specific value of "fun".  Still, I cannot see how an
> editor could provide a complete editing experience in all buffers without
> limiting in one way or another what is done, and what can be done, after
> each editing command.

That's way too general a statement to be useful in deciding whether
un-overridable locked narrowing is appropriate, IMO.


        Stefan






^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-16 14:15                                                                                                                             ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2022-08-16 14:21                                                                                                                               ` Gregory Heytings
  2022-08-16 14:32                                                                                                                                 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  0 siblings, 1 reply; 685+ messages in thread
From: Gregory Heytings @ 2022-08-16 14:21 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: 56682, Eli Zaretskii, Dmitry Gutov


>> Still, I cannot see how an editor could provide a complete editing 
>> experience in all buffers without limiting in one way or another what 
>> is done, and what can be done, after each editing command.
>
> That's way too general a statement to be useful in deciding whether 
> un-overridable locked narrowing is appropriate, IMO.
>

That wasn't a statement about "un-overridable locked narrowing".  Anyway, 
as I said to Eli an hour ago, you'll have what you want (a way to override 
locked narrowing) in a few days.  Don't panic.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-16 14:03                                                                                                                             ` Gregory Heytings
@ 2022-08-16 14:22                                                                                                                               ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  0 siblings, 0 replies; 685+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2022-08-16 14:22 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, Eli Zaretskii, Dmitry Gutov

Gregory Heytings [2022-08-16 14:03:16] wrote:
>>> Without assuming that computers have infinitely fast CPUs, that is?
>> If the font-lock rules to use in the buffer depend on whether the first
>> line of the buffer starts with #! or not, then your narrowing will break
>> them even tho they could work perfectly fine in a 1TB buffer without
>> requiring an infinitely fast CPU (since they don't need to scan the whole
>> buffer: just the region of interest plus the first 2 chars).
> Why on earth should a font-lock rule check, inside each redisplay cycle,
> whether the first line of the buffer starts with #! or not?

[ Nitpick: font-lock is not triggered "inside each redisplay cycle".  ]
Because it's simple and efficient.

> Isn't that an information that can, and in fact should, be cached?

"Can" maybe, "should" probably not since managing the cache will be
more trouble than it's worth.

Also, in your case you'd need that info to always be up-to-date, in
which case it's not really a "cache" (since that word usually refers to
something that may be available but isn't guaranteed to be so, and is
re-filled lazily), but a redundant representation of the data (which is
usually more costly to manage).


        Stefan






^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-16 14:14                                                                                                                     ` Eli Zaretskii
@ 2022-08-16 14:31                                                                                                                       ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-08-16 15:51                                                                                                                         ` Eli Zaretskii
  0 siblings, 1 reply; 685+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2022-08-16 14:31 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, gregory, dgutov

Eli Zaretskii [2022-08-16 17:14:35] wrote:
>> >> >> The locked narrowing prevents that "last mile", sadly.
>> >> > Nonsense, it doesn't prevent any such things.
>> >> > Let's not exaggerate when we try to make a point, okay?
>> >> Why nonsense?
>> > Because it takes no effort to override it and then try changes in any
>> > major mode.
>> AFAIK it requires recompiling Emacs
> No, it doesn't.

I missed it then: you're saying that I can make nlinum-mode override the
locked narrowing to find the real current line number without having to
recompile Emacs?


        Stefan






^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-16 14:21                                                                                                                               ` Gregory Heytings
@ 2022-08-16 14:32                                                                                                                                 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  0 siblings, 0 replies; 685+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2022-08-16 14:32 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, Eli Zaretskii, Dmitry Gutov

Gregory Heytings [2022-08-16 14:21:26] wrote:
> That wasn't a statement about "un-overridable locked narrowing".  Anyway, as
> I said to Eli an hour ago, you'll have what you want (a way to override
> locked narrowing) in a few days.

Thanks.


        Stefan






^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-16 14:10                                                                                                                               ` Eli Zaretskii
@ 2022-08-16 14:39                                                                                                                                 ` Dmitry Gutov
  0 siblings, 0 replies; 685+ messages in thread
From: Dmitry Gutov @ 2022-08-16 14:39 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, gregory, monnier

On 16.08.2022 17:10, Eli Zaretskii wrote:
>> Date: Tue, 16 Aug 2022 17:00:18 +0300
>> Cc: 56682@debbugs.gnu.org, gregory@heytings.org, monnier@iro.umontreal.ca
>> From: Dmitry Gutov <dgutov@yandex.ru>
>>
>>>> It's a buffer without long lines. Simply a large file.
>>>
>>> ??? Are we talking about long-line.xml, or are we talking about
>>> some other file?  We did nothing to change the behavior in large files
>>> without long lines.
>>
>> I'm talking about a 20 MB file I created manually with some simple
>> contents. Just no long lines.
> 
> That's a different problem, one we didn't try to fix yet.
> 
>>> If you are saying that 'recenter' takes too long in some file, and
>>> therefore delays M-> for too long, it is probably a separate issue, so
>>> please report that as a separate bug, preferably with the file that
>>> causes it.
>>
>> It seems pertinent to me since ultimately the decision to narrow in
>> handle_fontified_prop is driven by the idea that font-lock in large
>> files ends up being a problem anyway. And here we have a large file
>> where this doesn't help.
> 
> Because it's a different problem, with likely a different solution.
> 
>> But I can file it separately, of course.
> 
> Yes, please.

Bug#57245. Thanks.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-16 14:31                                                                                                                       ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2022-08-16 15:51                                                                                                                         ` Eli Zaretskii
  2022-08-16 17:15                                                                                                                           ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  0 siblings, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-16 15:51 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: 56682, gregory, dgutov

> From: Stefan Monnier <monnier@iro.umontreal.ca>
> Cc: dgutov@yandex.ru,  56682@debbugs.gnu.org,  gregory@heytings.org
> Date: Tue, 16 Aug 2022 10:31:54 -0400
> 
> Eli Zaretskii [2022-08-16 17:14:35] wrote:
> >> >> >> The locked narrowing prevents that "last mile", sadly.
> >> >> > Nonsense, it doesn't prevent any such things.
> >> >> > Let's not exaggerate when we try to make a point, okay?
> >> >> Why nonsense?
> >> > Because it takes no effort to override it and then try changes in any
> >> > major mode.
> >> AFAIK it requires recompiling Emacs
> > No, it doesn't.
> 
> I missed it then: you're saying that I can make nlinum-mode override the
> locked narrowing to find the real current line number without having to
> recompile Emacs?

No, I'm saying that you can test improvements in nlinum-mode that
would make it work better with long lines without recompiling.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-16 15:51                                                                                                                         ` Eli Zaretskii
@ 2022-08-16 17:15                                                                                                                           ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-08-16 17:26                                                                                                                             ` Eli Zaretskii
  0 siblings, 1 reply; 685+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2022-08-16 17:15 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, gregory, dgutov

Eli Zaretskii [2022-08-16 18:51:41] wrote:
>> I missed it then: you're saying that I can make nlinum-mode override the
>> locked narrowing to find the real current line number without having to
>> recompile Emacs?
>
> No, I'm saying that you can test improvements in nlinum-mode that
> would make it work better with long lines without recompiling.

How?


        Stefan






^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: Fix the long lines font locking related slowdowns
  2022-08-16 17:15                                                                                                                           ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2022-08-16 17:26                                                                                                                             ` Eli Zaretskii
  2022-08-16 19:18                                                                                                                               ` bug#56682: locked narrowing (was: bug#56682: Fix the long lines font locking related slowdowns) Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  0 siblings, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-16 17:26 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: 56682, gregory, dgutov

> From: Stefan Monnier <monnier@iro.umontreal.ca>
> Cc: dgutov@yandex.ru,  56682@debbugs.gnu.org,  gregory@heytings.org
> Date: Tue, 16 Aug 2022 13:15:04 -0400
> 
> Eli Zaretskii [2022-08-16 18:51:41] wrote:
> >> I missed it then: you're saying that I can make nlinum-mode override the
> >> locked narrowing to find the real current line number without having to
> >> recompile Emacs?
> >
> > No, I'm saying that you can test improvements in nlinum-mode that
> > would make it work better with long lines without recompiling.
> 
> How?

I'm sure you can figure it out if you just think for a few seconds.

But if you want me to do it for you, then please tell which changes do
you want to try and in what situations, because the technique depends
on that.

(Not that I understand where are you going with this.  Especially
since a feature to unlock the narrowing is just one simple commit
away.)





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: locked narrowing (was: bug#56682: Fix the long lines font locking related slowdowns)
  2022-08-16 17:26                                                                                                                             ` Eli Zaretskii
@ 2022-08-16 19:18                                                                                                                               ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-08-16 19:33                                                                                                                                 ` bug#56682: locked narrowing dick
                                                                                                                                                   ` (3 more replies)
  0 siblings, 4 replies; 685+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2022-08-16 19:18 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, gregory, dgutov

Eli Zaretskii [2022-08-16 20:26:23] wrote:
>> From: Stefan Monnier <monnier@iro.umontreal.ca>
>> Cc: dgutov@yandex.ru,  56682@debbugs.gnu.org,  gregory@heytings.org
>> Date: Tue, 16 Aug 2022 13:15:04 -0400
>> Eli Zaretskii [2022-08-16 18:51:41] wrote:
>> >> I missed it then: you're saying that I can make nlinum-mode override the
>> >> locked narrowing to find the real current line number without having to
>> >> recompile Emacs?
>> > No, I'm saying that you can test improvements in nlinum-mode that
>> > would make it work better with long lines without recompiling.
>> How?
> I'm sure you can figure it out if you just think for a few seconds.

I have no idea where to start because I can't see any way to circumvent
the locked narrowing.

> But if you want me to do it for you, then please tell which changes do
> you want to try and in what situations, because the technique depends
> on that.

I'd start with the patch below.

> (Not that I understand where are you going with this.  Especially
> since a feature to unlock the narrowing is just one simple commit
> away.)

I really appreciate Gregory's (and your) work to improve the handling of
long lines.  This was way overdue.  *BUT* the code for the locked
narrowing just .... sucks rocks.
[ Sorry, Gregory.  But see below for more concrete/constructive criticism.  ]

So, given that you (Eli) accepted it into `master` and have not voiced
concerns over it even after Dmitry's and my complaints, I feel that you
do support it enough that I'm not in a position to just install
"one simple commit".

The most glaring problems I see with it (beside the impossibility to
override the locking, obviously):

- `widen` will silently fail.  Maybe this is the right thing to do,
  maybe not, but it's definitely not clear (e.g. it leads to inf-loops
  in CC-mode, which doesn't seem much better than the excruciating
  slowdowns that locked narrowing is intended to fix).  It *should* be
  (or have been) discussed.
- Not only you can't `widen` but you can't narrow either
  (`narrow-to-region` just does nothing when the restriction is locked,
  regardless if the call tries to grow or shrink the restriction).
  AFAIK this is a plain bug, but given the fundamental disagreement
  about what is "right" in this discussion, I can't be sure.
- The locking is global: any `widen` or `narrow-to-region` will fail
  when a locked narrowing is in effect, even when it's applied to
  an unrelated buffer.  Again, it looks like a plain bug, but...
- ...the plural in the name "restrictions-locked" suggests that the global
  effect is on purpose, tho I can't see any justification for it.
- The doc for `restrictions-locked` says:

      This happens when `narrow-to-region', which see, is called from Lisp
      with an optional argument LOCK non-nil.

  but the `narrow-to-region` function doesn't have any such LOCK argument.
- The `narrow_to_region_internal` function, when called with `lock=true`
  oddly includes the functionality of save-restriction to restore the
  restriction and point but not to restore the `restrictions-locked` state.
- In that same function the two branches of the `if (lock)` have a lot
  of obvious redundancy.

So, yes, I could go and write a patch which I think fixes those
problems, but I don't understand how this code made it to `master` in
the first place, so I feel like I'm missing something and can't be sure
what is considered a bug and what is considered a feature.


        Stefan


diff --git a/nlinum.el b/nlinum.el
index 4f0e02fef1..3feaaca5c3 100644
--- a/nlinum.el
+++ b/nlinum.el
@@ -312,7 +312,7 @@ Only works right if point is at BOL."
   (if nlinum-widen
       (save-excursion
         (save-restriction
-          (widen)
+          (REALLY-widen)
           (forward-line 0)              ;In case (point-min) was not at BOL.
           (let ((nlinum-widen nil))
             (nlinum--line-number-at-pos))))






^ permalink raw reply related	[flat|nested] 685+ messages in thread

* bug#56682: locked narrowing
  2022-08-16 19:18                                                                                                                               ` bug#56682: locked narrowing (was: bug#56682: Fix the long lines font locking related slowdowns) Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2022-08-16 19:33                                                                                                                                 ` dick
  2022-08-16 19:39                                                                                                                                 ` bug#56682: locked narrowing (was: bug#56682: Fix the long lines font locking related slowdowns) Gregory Heytings
                                                                                                                                                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 685+ messages in thread
From: dick @ 2022-08-16 19:33 UTC (permalink / raw)
  To: 56682; +Cc: eliz, gregory, monnier, dgutov

SM> the code for the locked narrowing just .... sucks rocks.

To the extent, however oblique, my foray into long lines
(https://youtu.be/5C3wB3xiMmU) instigated this rift, I am contented.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: locked narrowing (was: bug#56682: Fix the long lines font locking related slowdowns)
  2022-08-16 19:18                                                                                                                               ` bug#56682: locked narrowing (was: bug#56682: Fix the long lines font locking related slowdowns) Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-08-16 19:33                                                                                                                                 ` bug#56682: locked narrowing dick
@ 2022-08-16 19:39                                                                                                                                 ` Gregory Heytings
  2022-08-16 20:57                                                                                                                                   ` bug#56682: locked narrowing Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-08-16 20:23                                                                                                                                 ` bug#56682: locked narrowing (was: bug#56682: Fix the long lines font locking related slowdowns) Gregory Heytings
  2022-08-17 11:28                                                                                                                                 ` bug#56682: locked narrowing (was: bug#56682: Fix the long lines font locking related slowdowns) Eli Zaretskii
  3 siblings, 1 reply; 685+ messages in thread
From: Gregory Heytings @ 2022-08-16 19:39 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: 56682, Eli Zaretskii, dgutov


>
> [ Sorry, Gregory.  But see below for more concrete/constructive 
> criticism. ]
>

There's no need to be sorry.  This is WIP, any (constructive) criticism is 
welcome.  And I do not understand why you did not raise some of the points 
below earlier.  Perhaps I misuderstood or overlooked something in what you 
said earlier, but to me your objection to that part of the code until now 
was mainly/purely "philosophical".

>
> - Not only you can't `widen` but you can't narrow either 
> (`narrow-to-region` just does nothing when the restriction is locked, 
> regardless if the call tries to grow or shrink the restriction). AFAIK 
> this is a plain bug, but given the fundamental disagreement about what 
> is "right" in this discussion, I can't be sure.
>

This (allowing narrow-to-region and widen to work within the bounds of the 
locked narrowing) is currently being implemented, after an off-list 
discussion with Alan.

>
> - The locking is global: any `widen` or `narrow-to-region` will fail 
> when a locked narrowing is in effect, even when it's applied to an 
> unrelated buffer.  Again, it looks like a plain bug, but...
>

It's not global, given that it is controlled by symbol that is bound 
within a function called inside a specific buffer.  But indeed, if inside 
that function we use narrow-to-region/widen in another buffer, that would 
fail.  It seems easy to correct that bug, though: if 
(current_buffer->long_line_optimizations_p && ! NILP 
(Vrestrictions_locked)) ...

>
> - The doc for `restrictions-locked` says:
>
>  This happens when `narrow-to-region', which see, is called from Lisp
>  with an optional argument LOCK non-nil.
>
>  but the `narrow-to-region` function doesn't have any such LOCK 
> argument.
>

That should have been removed, indeed.  In a previous iteration of the 
code a LOCK argument was added to that function, and later removed.

>
> - The `narrow_to_region_internal` function, when called with `lock=true` 
> oddly includes the functionality of save-restriction to restore the 
> restriction and point but not to restore the `restrictions-locked` 
> state.
>

This I do not understand.  The comment above that function explains that 
it should be followed by "specbind (Qrestrictions_locked, Qt)".  There is 
no need to restore the restrictions-locked state, or am I misunderstanding 
something?

>
> - In that same function the two branches of the `if (lock)` have a lot 
> of obvious redundancy.
>

Not "a lot", but indeed there's some redundancy there that could have been 
avoided.

I'll fix those problems soon.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: locked narrowing (was: bug#56682: Fix the long lines font locking related slowdowns)
  2022-08-16 19:18                                                                                                                               ` bug#56682: locked narrowing (was: bug#56682: Fix the long lines font locking related slowdowns) Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-08-16 19:33                                                                                                                                 ` bug#56682: locked narrowing dick
  2022-08-16 19:39                                                                                                                                 ` bug#56682: locked narrowing (was: bug#56682: Fix the long lines font locking related slowdowns) Gregory Heytings
@ 2022-08-16 20:23                                                                                                                                 ` Gregory Heytings
  2022-08-16 21:42                                                                                                                                   ` bug#56682: locked narrowing Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-08-17 11:28                                                                                                                                 ` bug#56682: locked narrowing (was: bug#56682: Fix the long lines font locking related slowdowns) Eli Zaretskii
  3 siblings, 1 reply; 685+ messages in thread
From: Gregory Heytings @ 2022-08-16 20:23 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: 56682, Eli Zaretskii, dgutov


Another comment:

>
> diff --git a/nlinum.el b/nlinum.el
> index 4f0e02fef1..3feaaca5c3 100644
> --- a/nlinum.el
> +++ b/nlinum.el
> @@ -312,7 +312,7 @@ Only works right if point is at BOL."
>   (if nlinum-widen
>       (save-excursion
>         (save-restriction
> -          (widen)
> +          (REALLY-widen)
>           (forward-line 0)              ;In case (point-min) was not at BOL.
>           (let ((nlinum-widen nil))
>             (nlinum--line-number-at-pos))))
>

FWIW, that's not a good example, because it's a bad idea to calculate line 
numbers in buffers with long lines or with too many lines: it takes too 
much time.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: locked narrowing
  2022-08-16 19:39                                                                                                                                 ` bug#56682: locked narrowing (was: bug#56682: Fix the long lines font locking related slowdowns) Gregory Heytings
@ 2022-08-16 20:57                                                                                                                                   ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-08-16 21:18                                                                                                                                     ` Gregory Heytings
  0 siblings, 1 reply; 685+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2022-08-16 20:57 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, Eli Zaretskii, dgutov

Gregory Heytings [2022-08-16 19:39:21] wrote:
>> [ Sorry, Gregory.  But see below for more concrete/constructive
>>   criticism. ]
> Perhaps I misuderstood or overlooked something in what you said
> earlier, but to me your objection to that part of the code until now
> was mainly/purely "philosophical".

My *main* objection is in the not-overridable part of the design, yes
(i.e. philosophical).  The rest is just a minor question of coding.

>> - The locking is global: any `widen` or `narrow-to-region` will fail when
>> a locked narrowing is in effect, even when it's applied to an unrelated
>> buffer.  Again, it looks like a plain bug, but...
> It's not global, given that it is controlled by symbol that is bound within
> a function called inside a specific buffer.

Which buffer is current when the let-binding is installed has no
influence on the behavior because the variable is not buffer-local
(i.e. it's global, which is why the effect is global).
The dynamic scope means that the effect is limited *in time* (and only
applies to the current thread, admittedly), but it's still global in the
sense that it affects all the code that is run during this time, no
matter where it is executed (or were it was written).

But, yes, dynamically scoped variables are often described as being
"locally bound", even though the effect of that binding is global in the
sense that it applies everywhere while active, so there's plenty of
opportunities for confusion with this terminology :-(

> But indeed, if inside that
> function we use narrow-to-region/widen in another buffer, that would fail.
> It seems easy to correct that bug, though: if
> (current_buffer->long_line_optimizations_p && ! NILP (Vrestrictions_locked))

If `current_buffer` is not the one that's currently being narrowed by
redisplay, then `->long_line_optimizations_p` doesn't say that
`current_buffer` has been narrowed by "us", so such a fix might work but
I think a better fix is to `Fmake_local_variable` before calling
`specbind` so that it really states clearly that this lock applies only
to the narrowing installed in this particular buffer.

>> - The doc for `restrictions-locked` says:
>>
>>  This happens when `narrow-to-region', which see, is called from Lisp
>>  with an optional argument LOCK non-nil.
>>
>>  but the `narrow-to-region` function doesn't have any such LOCK argument.
>
> That should have been removed, indeed.  In a previous iteration of the code
> a LOCK argument was added to that function, and later removed.

Adding such a LOCK argument might be a good idea, actually, since ELisp
packages may also want to impose restrictions on widening (see my recent
message to `emacs-devel` about ELisp support for locked narrowing).

>> - The `narrow_to_region_internal` function, when called with `lock=true`
>> oddly includes the functionality of save-restriction to restore the
>> restriction and point but not to restore the `restrictions-locked` state.
>
> This I do not understand.  The comment above that function explains that it
> should be followed by "specbind (Qrestrictions_locked, Qt)".  There is no
> need to restore the restrictions-locked state, or am
> I misunderstanding something?

Why leave the `specbind (Qrestrictions_locked, Qt)` out of the function
when you've already included the 3 calls to `record_unwind_protect`?
The 4 share the same requirements (because `specbind` pushes on the
`specpdl`, just like `record_unwind_protect`).  They naturally
belong together.

Also, a function that sometimes pushes to `specpdl` (and hence requires
the caller to do the `SPECPDL_INDEX + unbind_to` dance) and sometimes
not, depending on some value of its argument is a bit unnatural (it
complicates the reasoning when we try and convince ourselves that the
stack discipline of the specpdl is obeyed).  So I'd recommend you split
the function into two: a first one that only does the narrowing itself
and a second one which calls the first plus unconditionally does the
`specbind+record_unwind_protect`.

>> - In that same function the two branches of the `if (lock)` have a lot of
>> obvious redundancy.
> Not "a lot", but indeed there's some redundancy there that could have
> been avoided.

AFAICT it's more than half of the code of each branch.


        Stefan






^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: locked narrowing
  2022-08-16 20:57                                                                                                                                   ` bug#56682: locked narrowing Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2022-08-16 21:18                                                                                                                                     ` Gregory Heytings
  0 siblings, 0 replies; 685+ messages in thread
From: Gregory Heytings @ 2022-08-16 21:18 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: 56682, Eli Zaretskii, dgutov


>
> Adding such a LOCK argument might be a good idea, actually, since ELisp 
> packages may also want to impose restrictions on widening (see my recent 
> message to `emacs-devel` about ELisp support for locked narrowing).
>

It might be a good idea indeed.  I did not have an immediate need for it, 
and did not see how to do it (because of the unbalanced specbind).

>
> Why leave the `specbind (Qrestrictions_locked, Qt)` out of the function 
> when you've already included the 3 calls to `record_unwind_protect`? The 
> 4 share the same requirements (because `specbind` pushes on the 
> `specpdl`, just like `record_unwind_protect`).  They naturally belong 
> together.
>

They do indeed, and that's actually what the original code did, but I was 
told that it was better to not do that.

>
> Also, a function that sometimes pushes to `specpdl` (and hence requires 
> the caller to do the `SPECPDL_INDEX + unbind_to` dance) and sometimes 
> not, depending on some value of its argument is a bit unnatural (it 
> complicates the reasoning when we try and convince ourselves that the 
> stack discipline of the specpdl is obeyed).  So I'd recommend you split 
> the function into two: a first one that only does the narrowing itself 
> and a second one which calls the first plus unconditionally does the 
> `specbind+record_unwind_protect`.
>

Okay, thanks.  That's probably another way to do it, indeed.

>> Not "a lot", but indeed there's some redundancy there that could have 
>> been avoided.
>
> AFAICT it's more than half of the code of each branch.
>

That's still not "a lot", there are 12 statements in total in the two 
branches.  And they have 3 statements in common...





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: locked narrowing
  2022-08-16 20:23                                                                                                                                 ` bug#56682: locked narrowing (was: bug#56682: Fix the long lines font locking related slowdowns) Gregory Heytings
@ 2022-08-16 21:42                                                                                                                                   ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-08-16 21:50                                                                                                                                     ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  0 siblings, 1 reply; 685+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2022-08-16 21:42 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, Eli Zaretskii, dgutov

Gregory Heytings [2022-08-16 20:23:46] wrote:
> Another comment:
>> diff --git a/nlinum.el b/nlinum.el
>> index 4f0e02fef1..3feaaca5c3 100644
>> --- a/nlinum.el
>> +++ b/nlinum.el
>> @@ -312,7 +312,7 @@ Only works right if point is at BOL."
>>   (if nlinum-widen
>>       (save-excursion
>>         (save-restriction
>> -          (widen)
>> +          (REALLY-widen)
>>           (forward-line 0)              ;In case (point-min) was not at BOL.
>>           (let ((nlinum-widen nil))
>>             (nlinum--line-number-at-pos))))
> FWIW, that's not a good example, because it's a bad idea to calculate line
> numbers in buffers with long lines or with too many lines: it takes too
> much time.

In my tests, it works fast enough for pretty large buffers and pretty
long lines, so while the above might be too crude, the limits we should
use for it should be much lower than `syntax-wholeline-max` and even
probably larger than `large-file-warning-threshold`.


        Stefan






^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: locked narrowing
  2022-08-16 21:42                                                                                                                                   ` bug#56682: locked narrowing Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2022-08-16 21:50                                                                                                                                     ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  0 siblings, 0 replies; 685+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2022-08-16 21:50 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, Eli Zaretskii, dgutov

Stefan Monnier [2022-08-16 17:42:45] wrote:
> Gregory Heytings [2022-08-16 20:23:46] wrote:
>> Another comment:
>>> diff --git a/nlinum.el b/nlinum.el
>>> index 4f0e02fef1..3feaaca5c3 100644
>>> --- a/nlinum.el
>>> +++ b/nlinum.el
>>> @@ -312,7 +312,7 @@ Only works right if point is at BOL."
>>>   (if nlinum-widen
>>>       (save-excursion
>>>         (save-restriction
>>> -          (widen)
>>> +          (REALLY-widen)
>>>           (forward-line 0)              ;In case (point-min) was not at BOL.
>>>           (let ((nlinum-widen nil))
>>>             (nlinum--line-number-at-pos))))
>> FWIW, that's not a good example, because it's a bad idea to calculate line
>> numbers in buffers with long lines or with too many lines: it takes too
>> much time.
> In my tests, it works fast enough for pretty large buffers and pretty
> long lines,

And actually, it doesn't seem to be slowed by long lines, only by the
buffer size.  So its `widen` should definitely override the
line-length-induced narrowing (tho maybe not the buffer-size-induced
narrowing if/when we add such a thing).


        Stefan






^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: locked narrowing (was: bug#56682: Fix the long lines font locking related slowdowns)
  2022-08-16 19:18                                                                                                                               ` bug#56682: locked narrowing (was: bug#56682: Fix the long lines font locking related slowdowns) Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
                                                                                                                                                   ` (2 preceding siblings ...)
  2022-08-16 20:23                                                                                                                                 ` bug#56682: locked narrowing (was: bug#56682: Fix the long lines font locking related slowdowns) Gregory Heytings
@ 2022-08-17 11:28                                                                                                                                 ` Eli Zaretskii
  2022-08-17 13:06                                                                                                                                   ` bug#56682: locked narrowing Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  3 siblings, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-17 11:28 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: 56682, gregory, dgutov

> From: Stefan Monnier <monnier@iro.umontreal.ca>
> Cc: dgutov@yandex.ru, 56682@debbugs.gnu.org, gregory@heytings.org
> Date: Tue, 16 Aug 2022 15:18:23 -0400
> 
> diff --git a/nlinum.el b/nlinum.el
> index 4f0e02fef1..3feaaca5c3 100644
> --- a/nlinum.el
> +++ b/nlinum.el
> @@ -312,7 +312,7 @@ Only works right if point is at BOL."
>    (if nlinum-widen
>        (save-excursion
>          (save-restriction
> -          (widen)
> +          (REALLY-widen)
>            (forward-line 0)              ;In case (point-min) was not at BOL.
>            (let ((nlinum-widen nil))
>              (nlinum--line-number-at-pos))))

If a package wants to count lines in a function registered with
jit-lock, I think it makes no sense for it to do that in Lisp.  It
would be much better to let such packages use the built-in
capabilities that we use all the time, both on the mode line and under
display-line-numbers mode.  There are at least two advantages to that:
(1) it will be at least slightly faster, sometimes more than slightly
(due to caching); and (2) the problem of narrowing would be seamlessly
resolved.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: locked narrowing
  2022-08-17 11:28                                                                                                                                 ` bug#56682: locked narrowing (was: bug#56682: Fix the long lines font locking related slowdowns) Eli Zaretskii
@ 2022-08-17 13:06                                                                                                                                   ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-08-17 13:30                                                                                                                                     ` Eli Zaretskii
  0 siblings, 1 reply; 685+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2022-08-17 13:06 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, gregory, dgutov

> If a package wants to count lines in a function registered with
> jit-lock, I think it makes no sense for it to do that in Lisp.  It
> would be much better to let such packages use the built-in
> capabilities that we use all the time, both on the mode line and under
> display-line-numbers mode.  There are at least two advantages to that:
> (1) it will be at least slightly faster, sometimes more than slightly
> (due to caching); and (2) the problem of narrowing would be seamlessly
> resolved.

FWIW, I agree.  I don't think this information is cleanly&reliably
exposed to ELisp, tho, which is why nlinum-mode does it "by hand" (with
its own caching).


        Stefan






^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: locked narrowing
  2022-08-17 13:06                                                                                                                                   ` bug#56682: locked narrowing Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2022-08-17 13:30                                                                                                                                     ` Eli Zaretskii
  2022-08-17 13:50                                                                                                                                       ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  0 siblings, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-17 13:30 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: 56682, gregory, dgutov

> From: Stefan Monnier <monnier@iro.umontreal.ca>
> Cc: dgutov@yandex.ru,  56682@debbugs.gnu.org,  gregory@heytings.org
> Date: Wed, 17 Aug 2022 09:06:21 -0400
> 
> > If a package wants to count lines in a function registered with
> > jit-lock, I think it makes no sense for it to do that in Lisp.  It
> > would be much better to let such packages use the built-in
> > capabilities that we use all the time, both on the mode line and under
> > display-line-numbers mode.  There are at least two advantages to that:
> > (1) it will be at least slightly faster, sometimes more than slightly
> > (due to caching); and (2) the problem of narrowing would be seamlessly
> > resolved.
> 
> FWIW, I agree.  I don't think this information is cleanly&reliably
> exposed to ELisp

It isn't currently.  I was suggesting to do so.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: locked narrowing
  2022-08-17 13:30                                                                                                                                     ` Eli Zaretskii
@ 2022-08-17 13:50                                                                                                                                       ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-08-17 13:59                                                                                                                                         ` Eli Zaretskii
  0 siblings, 1 reply; 685+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2022-08-17 13:50 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, gregory, dgutov

>> FWIW, I agree.  I don't think this information is cleanly&reliably
>> exposed to ELisp
>
> It isn't currently.  I was suggesting to do so.

Last time I looked at it, I couldn't quite understand how the cache
works there, so I wasn't sure how to make sure it returns valid
information even if called outside of redisplay.


        Stefan






^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: locked narrowing
  2022-08-17 13:50                                                                                                                                       ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2022-08-17 13:59                                                                                                                                         ` Eli Zaretskii
  2022-08-17 14:11                                                                                                                                           ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  0 siblings, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-17 13:59 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: 56682, gregory, dgutov

> From: Stefan Monnier <monnier@iro.umontreal.ca>
> Cc: dgutov@yandex.ru,  56682@debbugs.gnu.org,  gregory@heytings.org
> Date: Wed, 17 Aug 2022 09:50:59 -0400
> 
> >> FWIW, I agree.  I don't think this information is cleanly&reliably
> >> exposed to ELisp
> >
> > It isn't currently.  I was suggesting to do so.
> 
> Last time I looked at it, I couldn't quite understand how the cache
> works there, so I wasn't sure how to make sure it returns valid
> information even if called outside of redisplay.

Looking at what maybe_produce_line_number does doesn't help?





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: locked narrowing
  2022-08-17 13:59                                                                                                                                         ` Eli Zaretskii
@ 2022-08-17 14:11                                                                                                                                           ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-08-17 14:25                                                                                                                                             ` Eli Zaretskii
  0 siblings, 1 reply; 685+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2022-08-17 14:11 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, gregory, dgutov

>> Last time I looked at it, I couldn't quite understand how the cache
>> works there, so I wasn't sure how to make sure it returns valid
>> information even if called outside of redisplay.
> Looking at what maybe_produce_line_number does doesn't help?

I see two problems:

- The problem I already mentioned: the cache seems to be
  maintained/flushed by the redisplay code, so when the function is
  called outside of redisplay I don't know if `w->base_line_number/pos`
  is still valid.
- The fact that this uses line numbers counted from BEGV whereas nlinum
  counts from BEG.


        Stefan






^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: locked narrowing
  2022-08-17 14:11                                                                                                                                           ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2022-08-17 14:25                                                                                                                                             ` Eli Zaretskii
  2022-08-17 15:58                                                                                                                                               ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  0 siblings, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-17 14:25 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: 56682, gregory, dgutov

> From: Stefan Monnier <monnier@iro.umontreal.ca>
> Cc: dgutov@yandex.ru,  56682@debbugs.gnu.org,  gregory@heytings.org
> Date: Wed, 17 Aug 2022 10:11:28 -0400
> 
> >> Last time I looked at it, I couldn't quite understand how the cache
> >> works there, so I wasn't sure how to make sure it returns valid
> >> information even if called outside of redisplay.
> > Looking at what maybe_produce_line_number does doesn't help?
> 
> I see two problems:
> 
> - The problem I already mentioned: the cache seems to be
>   maintained/flushed by the redisplay code, so when the function is
>   called outside of redisplay I don't know if `w->base_line_number/pos`
>   is still valid.

So you are saying that any command which uses vertical-motion or more
generally any of the move_it_* functions will work incorrectly when
line numbers are on display?  I'm not aware of any such problems.

> - The fact that this uses line numbers counted from BEGV whereas nlinum
>   counts from BEG.

I think you missed the display-line-numbers-widen variable and its
effect.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: locked narrowing
  2022-08-17 14:25                                                                                                                                             ` Eli Zaretskii
@ 2022-08-17 15:58                                                                                                                                               ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-08-17 16:52                                                                                                                                                 ` Eli Zaretskii
  0 siblings, 1 reply; 685+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2022-08-17 15:58 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, gregory, dgutov

>> >> Last time I looked at it, I couldn't quite understand how the cache
>> >> works there, so I wasn't sure how to make sure it returns valid
>> >> information even if called outside of redisplay.
>> > Looking at what maybe_produce_line_number does doesn't help?
>> 
>> I see two problems:
>> 
>> - The problem I already mentioned: the cache seems to be
>>   maintained/flushed by the redisplay code, so when the function is
>>   called outside of redisplay I don't know if `w->base_line_number/pos`
>>   is still valid.
>
> So you are saying that any command which uses vertical-motion or more
> generally any of the move_it_* functions will work incorrectly when
> line numbers are on display?  I'm not aware of any such problems.

No, I'm sure the existing code somehow handles it right.  I just don't
know how.  I can't see anything in the code of `insert` (say) which
flushes `w->base_line_number` when needed, so there needs to be code
somewhere which flushes it more lazily before using that value.  I just
don't know where that code is and which data it uses to flush it.
For this reason I don't know under which condition I can make use of
`w->base_line_number`.

>> - The fact that this uses line numbers counted from BEGV whereas nlinum
>>   counts from BEG.
>
> I think you missed the display-line-numbers-widen variable and its
> effect.

Ah, indeed, thanks, that helps.
[ BTW, another hurdle if that the existing cache is linked to windows,
  whereas the actual info requested doesn't care about windows (as long
  as we count logical lines rather than screen lines) and would also
  make sense in a buffer that's not displayed at all.  This should
  usually not be a problem for nlinum-mode, tho it could happen
  when called from `font-lock-ensure`.  ]


        Stefan






^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: locked narrowing
  2022-08-17 15:58                                                                                                                                               ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2022-08-17 16:52                                                                                                                                                 ` Eli Zaretskii
  2022-08-17 17:09                                                                                                                                                   ` Eli Zaretskii
  2022-08-17 17:58                                                                                                                                                   ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  0 siblings, 2 replies; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-17 16:52 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: 56682, gregory, dgutov

> From: Stefan Monnier <monnier@iro.umontreal.ca>
> Cc: dgutov@yandex.ru,  56682@debbugs.gnu.org,  gregory@heytings.org
> Date: Wed, 17 Aug 2022 11:58:32 -0400
> 
> >> - The problem I already mentioned: the cache seems to be
> >>   maintained/flushed by the redisplay code, so when the function is
> >>   called outside of redisplay I don't know if `w->base_line_number/pos`
> >>   is still valid.
> >
> > So you are saying that any command which uses vertical-motion or more
> > generally any of the move_it_* functions will work incorrectly when
> > line numbers are on display?  I'm not aware of any such problems.
> 
> No, I'm sure the existing code somehow handles it right.  I just don't
> know how.  I can't see anything in the code of `insert` (say) which
> flushes `w->base_line_number` when needed, so there needs to be code
> somewhere which flushes it more lazily before using that value.  I just
> don't know where that code is and which data it uses to flush it.
> For this reason I don't know under which condition I can make use of
> `w->base_line_number`.

Why can't you simply use the same code maybe_produce_line_number uses
for that?

> [ BTW, another hurdle if that the existing cache is linked to windows,
>   whereas the actual info requested doesn't care about windows (as long
>   as we count logical lines rather than screen lines) and would also
>   make sense in a buffer that's not displayed at all.  This should
>   usually not be a problem for nlinum-mode, tho it could happen
>   when called from `font-lock-ensure`.  ]

Why does it matter which line numbers you compute if they are never
displayed?





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: locked narrowing
  2022-08-17 16:52                                                                                                                                                 ` Eli Zaretskii
@ 2022-08-17 17:09                                                                                                                                                   ` Eli Zaretskii
  2022-08-17 19:38                                                                                                                                                     ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-08-17 17:58                                                                                                                                                   ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  1 sibling, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-17 17:09 UTC (permalink / raw)
  To: monnier; +Cc: 56682, gregory, dgutov

> Cc: 56682@debbugs.gnu.org, gregory@heytings.org, dgutov@yandex.ru
> Date: Wed, 17 Aug 2022 19:52:54 +0300
> From: Eli Zaretskii <eliz@gnu.org>
> 
> > > So you are saying that any command which uses vertical-motion or more
> > > generally any of the move_it_* functions will work incorrectly when
> > > line numbers are on display?  I'm not aware of any such problems.
> > 
> > No, I'm sure the existing code somehow handles it right.  I just don't
> > know how.  I can't see anything in the code of `insert` (say) which
> > flushes `w->base_line_number` when needed, so there needs to be code
> > somewhere which flushes it more lazily before using that value.  I just
> > don't know where that code is and which data it uses to flush it.
> > For this reason I don't know under which condition I can make use of
> > `w->base_line_number`.
> 
> Why can't you simply use the same code maybe_produce_line_number uses
> for that?

Or even just always use display_count_lines, if you don't trust the
cache.

And another thought: did you try using format-mode-line as the means
to get the line number from which you could start?





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: locked narrowing
  2022-08-17 16:52                                                                                                                                                 ` Eli Zaretskii
  2022-08-17 17:09                                                                                                                                                   ` Eli Zaretskii
@ 2022-08-17 17:58                                                                                                                                                   ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-08-17 18:29                                                                                                                                                     ` Eli Zaretskii
  2022-08-17 18:33                                                                                                                                                     ` Eli Zaretskii
  1 sibling, 2 replies; 685+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2022-08-17 17:58 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, gregory, dgutov

>> >> - The problem I already mentioned: the cache seems to be
>> >>   maintained/flushed by the redisplay code, so when the function is
>> >>   called outside of redisplay I don't know if `w->base_line_number/pos`
>> >>   is still valid.
>> >
>> > So you are saying that any command which uses vertical-motion or more
>> > generally any of the move_it_* functions will work incorrectly when
>> > line numbers are on display?  I'm not aware of any such problems.
>> 
>> No, I'm sure the existing code somehow handles it right.  I just don't
>> know how.  I can't see anything in the code of `insert` (say) which
>> flushes `w->base_line_number` when needed, so there needs to be code
>> somewhere which flushes it more lazily before using that value.  I just
>> don't know where that code is and which data it uses to flush it.
>> For this reason I don't know under which condition I can make use of
>> `w->base_line_number`.
>
> Why can't you simply use the same code maybe_produce_line_number uses
> for that?

Because I can't find that code.  Apparently `maybe_produce_line_number`
just uses `w->base_line_number` whenever it's not 0, so apparently it's
set to 0 elsewhere.

[ BTW, apparently when `display_line_numbers_widen` is in use and the
  buffer is narrowed, we don't use that cache at all for
  `maybe_produce_line_number` (according to xdisp.c:24217).  IOW that
  cache always counts from BEGV, so we also need to check that BEGV is
  still the same as when the cache was filled.  I also can't see in
  `decode_mode_spec` where we check that the narrowing has changed
  before using the cached value.  All in all, I just don't understand
  how that cache is maintained.  ]

>> [ BTW, another hurdle if that the existing cache is linked to windows,
>>   whereas the actual info requested doesn't care about windows (as long
>>   as we count logical lines rather than screen lines) and would also
>>   make sense in a buffer that's not displayed at all.  This should
>>   usually not be a problem for nlinum-mode, tho it could happen
>>   when called from `font-lock-ensure`.  ]
> Why does it matter which line numbers you compute if they are never
> displayed?

They may be displayed at some other time: nlinum-mode won't be invoked
if that same portion of the buffer becomes visible later on (it's just
like font-lock: the highlighting applied stays until something like the
after-change-function causes it to be refreshed).


        Stefan






^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: locked narrowing
  2022-08-17 17:58                                                                                                                                                   ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2022-08-17 18:29                                                                                                                                                     ` Eli Zaretskii
  2022-08-17 19:09                                                                                                                                                       ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-08-17 18:33                                                                                                                                                     ` Eli Zaretskii
  1 sibling, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-17 18:29 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: 56682, gregory, dgutov

> From: Stefan Monnier <monnier@iro.umontreal.ca>
> Cc: dgutov@yandex.ru,  56682@debbugs.gnu.org,  gregory@heytings.org
> Date: Wed, 17 Aug 2022 13:58:21 -0400
> 
> > Why can't you simply use the same code maybe_produce_line_number uses
> > for that?
> 
> Because I can't find that code.

What do you mean? it's in maybe_produce_line_number, obviously...

> Apparently `maybe_produce_line_number`
> just uses `w->base_line_number` whenever it's not 0, so apparently it's
> set to 0 elsewhere.

It's set to zero in several places in xdisp.c.

But again, if you don't want to trust the cached values, just use
display_count_lines starting from BOB.

> > Why does it matter which line numbers you compute if they are never
> > displayed?
> 
> They may be displayed at some other time: nlinum-mode won't be invoked
> if that same portion of the buffer becomes visible later on (it's just
> like font-lock: the highlighting applied stays until something like the
> after-change-function causes it to be refreshed).

Then invalidate the information on that portion when the buffer
becomes displayed, and let the code count again.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: locked narrowing
  2022-08-17 17:58                                                                                                                                                   ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-08-17 18:29                                                                                                                                                     ` Eli Zaretskii
@ 2022-08-17 18:33                                                                                                                                                     ` Eli Zaretskii
  2022-08-17 19:18                                                                                                                                                       ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  1 sibling, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-17 18:33 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: 56682, gregory, dgutov

> From: Stefan Monnier <monnier@iro.umontreal.ca>
> Cc: dgutov@yandex.ru,  56682@debbugs.gnu.org,  gregory@heytings.org
> Date: Wed, 17 Aug 2022 13:58:21 -0400
> 
> [ BTW, apparently when `display_line_numbers_widen` is in use and the
>   buffer is narrowed, we don't use that cache at all for
>   `maybe_produce_line_number` (according to xdisp.c:24217).  IOW that
>   cache always counts from BEGV, so we also need to check that BEGV is
>   still the same as when the cache was filled.  I also can't see in
>   `decode_mode_spec` where we check that the narrowing has changed
>   before using the cached value.  All in all, I just don't understand
>   how that cache is maintained.  ]

Search in xdisp.c for "->base_line_number = 0", and you will see that
we invalidate the cache when the narrowing changes or when other
similar calamities happen.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: locked narrowing
  2022-08-17 18:29                                                                                                                                                     ` Eli Zaretskii
@ 2022-08-17 19:09                                                                                                                                                       ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-08-17 19:19                                                                                                                                                         ` Eli Zaretskii
  0 siblings, 1 reply; 685+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2022-08-17 19:09 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, gregory, dgutov

>> Because I can't find that code.
> What do you mean? it's in maybe_produce_line_number, obviously...

My intuition tells me it should be there, but I can't find it.

>> Apparently `maybe_produce_line_number`
>> just uses `w->base_line_number` whenever it's not 0, so apparently it's
>> set to 0 elsewhere.
> It's set to zero in several places in xdisp.c.

I can't seem to find even one of them related to the fact that the
buffer was modified.

When I test the code, I can see that it works correctly, but I can't see
in the code how the cache gets flushed/ignored/refreshed when the
buffer's contents is modified (e.g. by inserting a newline at BOB).

> But again, if you don't want to trust the cached values, just use
> display_count_lines starting from BOB.

That's already what nlinum does (via `line-number-at-pos`).


        Stefan






^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: locked narrowing
  2022-08-17 18:33                                                                                                                                                     ` Eli Zaretskii
@ 2022-08-17 19:18                                                                                                                                                       ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-08-17 19:24                                                                                                                                                         ` Eli Zaretskii
  0 siblings, 1 reply; 685+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2022-08-17 19:18 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, gregory, dgutov

> Search in xdisp.c for "->base_line_number = 0", and you will see that
> we invalidate the cache when the narrowing changes or when other
> similar calamities happen.

OK, after another search I found (in `redisplay_window` and
`try_scrolling`) that we do:

	  if (!just_this_one_p
	      || current_buffer->clip_changed
	      || BEG_UNCHANGED < CHARPOS (startp))
	    /* Forget any recorded base line for line number display.  */
	    w->base_line_number = 0;

So IIUC `w->base_line_number` can be used if:

          w->base_line_number != 0
          && !current_buffer->clip_changed
          && BEG_UNCHANGED < w->base_line_pos

?

Why do we flush the cache when `just_this_one_p` is false?


        Stefan






^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: locked narrowing
  2022-08-17 19:09                                                                                                                                                       ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2022-08-17 19:19                                                                                                                                                         ` Eli Zaretskii
  2022-08-17 20:04                                                                                                                                                           ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  0 siblings, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-17 19:19 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: 56682, gregory, dgutov

> From: Stefan Monnier <monnier@iro.umontreal.ca>
> Cc: dgutov@yandex.ru,  56682@debbugs.gnu.org,  gregory@heytings.org
> Date: Wed, 17 Aug 2022 15:09:22 -0400
> 
> >> Because I can't find that code.
> > What do you mean? it's in maybe_produce_line_number, obviously...
> 
> My intuition tells me it should be there, but I can't find it.

Really?  I meant this:

      if (!last_line)
	{
	  /* If possible, reuse data cached by line-number-mode.  */
	  if (it->w->base_line_number > 0
	      && it->w->base_line_pos > 0
	      && it->w->base_line_pos <= IT_CHARPOS (*it)
	      /* line-number-mode always displays narrowed line
		 numbers, so we cannot use its data if the user wants
		 line numbers that disregard narrowing, or if the
		 buffer's narrowing has just changed.  */
	      && !(line_numbers_wide
		   && (BEG_BYTE != BEGV_BYTE || Z_BYTE != ZV_BYTE))
	      && !current_buffer->clip_changed)
	    {
	      start_from = CHAR_TO_BYTE (it->w->base_line_pos);
	      last_line = it->w->base_line_number - 1;
	    }
	  else
	    start_from = beg_byte;
	  if (!it->lnum_bytepos)
	    first_time = true;
	}
      else
	start_from = it->lnum_bytepos;

      /* Paranoia: what if someone changes the narrowing since the
	 last time display_line was called?  Shouldn't really happen,
	 but who knows what some crazy Lisp invoked by :eval could do?  */
      if (!(beg_byte <= start_from && start_from <= z_byte))
	{
	  last_line = 0;
	  start_from = beg_byte;
	}

      this_line =
	last_line + display_count_lines_logically (start_from,
						   IT_BYTEPOS (*it),
						   IT_CHARPOS (*it), &bytepos);

> >> Apparently `maybe_produce_line_number`
> >> just uses `w->base_line_number` whenever it's not 0, so apparently it's
> >> set to 0 elsewhere.
> > It's set to zero in several places in xdisp.c.
> 
> I can't seem to find even one of them related to the fact that the
> buffer was modified.

This:

	  if (!just_this_one_p
	      || current_buffer->clip_changed
	      || BEG_UNCHANGED < CHARPOS (startp))
	    /* Forget any recorded base line for line number display.  */
	    w->base_line_number = 0;

And this:

  /* Forget any previously recorded base line for line number display.  */
  if (!buffer_unchanged_p)
    w->base_line_number = 0;

> When I test the code, I can see that it works correctly, but I can't see
> in the code how the cache gets flushed/ignored/refreshed when the
> buffer's contents is modified (e.g. by inserting a newline at BOB).

Of course, this works: it's about the oldest code in the display
engine.

> > But again, if you don't want to trust the cached values, just use
> > display_count_lines starting from BOB.
> 
> That's already what nlinum does (via `line-number-at-pos`).

Then maybe all this discussion is just a waste of breath.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: locked narrowing
  2022-08-17 19:18                                                                                                                                                       ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2022-08-17 19:24                                                                                                                                                         ` Eli Zaretskii
  2022-08-17 20:09                                                                                                                                                           ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  0 siblings, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-17 19:24 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: 56682, gregory, dgutov

> From: Stefan Monnier <monnier@iro.umontreal.ca>
> Cc: dgutov@yandex.ru,  56682@debbugs.gnu.org,  gregory@heytings.org
> Date: Wed, 17 Aug 2022 15:18:57 -0400
> 
> Why do we flush the cache when `just_this_one_p` is false?

Because it means many things could have changed, and we aren't sure we
can trust the cache.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: locked narrowing
  2022-08-17 17:09                                                                                                                                                   ` Eli Zaretskii
@ 2022-08-17 19:38                                                                                                                                                     ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  0 siblings, 0 replies; 685+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2022-08-17 19:38 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, gregory, dgutov

> And another thought: did you try using format-mode-line as the means
> to get the line number from which you could start?

Yes, but in my tests, it wasn't any faster.

BTW, while I have now found which code flushes the base_line cache
during redisplay (there are a few different places, in
`redisplay_window` and `try_scrolling` (not sure why it needs to be
done at more than one place, tho)),
I still haven't found where that cache gets flushed or ignored for
the case where it's used for `format-mode-line`.  That code doesn't
seem to pay attention to BEG_UNCHANGED nor even to the changes
in narrowing.

Oh... wait... aha!  I still don't know how it handles buffer
modifications, but I now know that it just fails to pay attention to
changes to the narrowing: so, it's no surprised that I couldn't find the
corresponding flushing code, it's just missing:

    emacs -Q lisp/subr.el
    M->
    M-: (list (format-mode-line "%l")
              (save-restriction (narrow-to-region (+ (point-min) 4000) (point-max))
                                (format-mode-line "%l")))

returns twice the same line number.


        Stefan






^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: locked narrowing
  2022-08-17 19:19                                                                                                                                                         ` Eli Zaretskii
@ 2022-08-17 20:04                                                                                                                                                           ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  0 siblings, 0 replies; 685+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2022-08-17 20:04 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, gregory, dgutov

>> >> Because I can't find that code.
>> > What do you mean? it's in maybe_produce_line_number, obviously...
>> My intuition tells me it should be there, but I can't find it.
>
> Really?  I meant this:
>
>       if (!last_line)
> 	{
> 	  /* If possible, reuse data cached by line-number-mode.  */
> 	  if (it->w->base_line_number > 0
> 	      && it->w->base_line_pos > 0
> 	      && it->w->base_line_pos <= IT_CHARPOS (*it)
> 	      /* line-number-mode always displays narrowed line
> 		 numbers, so we cannot use its data if the user wants
> 		 line numbers that disregard narrowing, or if the
> 		 buffer's narrowing has just changed.  */
> 	      && !(line_numbers_wide
> 		   && (BEG_BYTE != BEGV_BYTE || Z_BYTE != ZV_BYTE))
> 	      && !current_buffer->clip_changed)
> 	    {
> 	      start_from = CHAR_TO_BYTE (it->w->base_line_pos);
> 	      last_line = it->w->base_line_number - 1;
> 	    }
> 	  else
> 	    start_from = beg_byte;
> 	  if (!it->lnum_bytepos)
> 	    first_time = true;
> 	}
>       else
> 	start_from = it->lnum_bytepos;
>
>       /* Paranoia: what if someone changes the narrowing since the
> 	 last time display_line was called?  Shouldn't really happen,
> 	 but who knows what some crazy Lisp invoked by :eval could do?  */
>       if (!(beg_byte <= start_from && start_from <= z_byte))
> 	{
> 	  last_line = 0;
> 	  start_from = beg_byte;
> 	}
>
>       this_line =
> 	last_line + display_count_lines_logically (start_from,
> 						   IT_BYTEPOS (*it),
> 						   IT_CHARPOS (*it), &bytepos);

This checks for changes in narrowing (via !current_buffer->clip_changed),
but not for changes in the buffer contents (these are apparently
checked in `redisplay_window` and `try_scrolling` instead).

>> >> Apparently `maybe_produce_line_number`
>> >> just uses `w->base_line_number` whenever it's not 0, so apparently it's
>> >> set to 0 elsewhere.
>> > It's set to zero in several places in xdisp.c.
>> I can't seem to find even one of them related to the fact that the
>> buffer was modified.
>
> This:
>
> 	  if (!just_this_one_p
> 	      || current_buffer->clip_changed
> 	      || BEG_UNCHANGED < CHARPOS (startp))
> 	    /* Forget any recorded base line for line number display.  */
> 	    w->base_line_number = 0;
>
> And this:
>
>   /* Forget any previously recorded base line for line number display.  */
>   if (!buffer_unchanged_p)
>     w->base_line_number = 0;

Right, I did find them in the end.
Note that these are in code which is not used for `format-mode-line`.

>> > But again, if you don't want to trust the cached values, just use
>> > display_count_lines starting from BOB.
>>
>> That's already what nlinum does (via `line-number-at-pos`).
>
> Then maybe all this discussion is just a waste of breath.

It'll help me improve the code's doc, tho.


        Stefan






^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: locked narrowing
  2022-08-17 19:24                                                                                                                                                         ` Eli Zaretskii
@ 2022-08-17 20:09                                                                                                                                                           ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-08-18  5:19                                                                                                                                                             ` Eli Zaretskii
  0 siblings, 1 reply; 685+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2022-08-17 20:09 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, gregory, dgutov

>> Why do we flush the cache when `just_this_one_p` is false?
> Because it means many things could have changed,

I can't see which ones that could be.

> and we aren't sure we can trust the cache.

:-(


        Stefan






^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: locked narrowing
  2022-08-17 20:09                                                                                                                                                           ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2022-08-18  5:19                                                                                                                                                             ` Eli Zaretskii
  2022-08-20 16:20                                                                                                                                                               ` Gregory Heytings
  0 siblings, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-18  5:19 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: 56682, gregory, dgutov

> From: Stefan Monnier <monnier@iro.umontreal.ca>
> Cc: dgutov@yandex.ru,  56682@debbugs.gnu.org,  gregory@heytings.org
> Date: Wed, 17 Aug 2022 16:09:09 -0400
> 
> >> Why do we flush the cache when `just_this_one_p` is false?
> > Because it means many things could have changed,
> 
> I can't see which ones that could be.

just_this_one_p is true when we are only redisplaying the selected
window.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: locked narrowing
  2022-08-18  5:19                                                                                                                                                             ` Eli Zaretskii
@ 2022-08-20 16:20                                                                                                                                                               ` Gregory Heytings
  2022-08-20 17:12                                                                                                                                                                 ` Eli Zaretskii
                                                                                                                                                                                   ` (4 more replies)
  0 siblings, 5 replies; 685+ messages in thread
From: Gregory Heytings @ 2022-08-20 16:20 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, Stefan Monnier, dgutov


I pushed a (hopefully) improved version of the the locked narrowing 
feature in the feature/improved-locked-narrowing branch.  It is now 
possible:

1. to unlock a locked narrowing,

2. to use narrow-to-region and widen within the bounds of a locked 
narrowing,

3. to enter and leave a locked narrowing within a locked narrowing, and

4. to use that feature in Lisp code (either directly or with a helper 
macro).

As far as I understand, given that it is possible to unlock a locked 
narrowing, adding the possibility to choose how the bounds of the locked 
narrowings are computed has become unnecessary.

Comments/feedback welcome.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: locked narrowing
  2022-08-20 16:20                                                                                                                                                               ` Gregory Heytings
@ 2022-08-20 17:12                                                                                                                                                                 ` Eli Zaretskii
  2022-08-20 17:21                                                                                                                                                                 ` Eli Zaretskii
                                                                                                                                                                                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-20 17:12 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, monnier, dgutov

> Date: Sat, 20 Aug 2022 16:20:57 +0000
> From: Gregory Heytings <gregory@heytings.org>
> cc: Stefan Monnier <monnier@iro.umontreal.ca>, 56682@debbugs.gnu.org, 
>     dgutov@yandex.ru
> 
> 
> I pushed a (hopefully) improved version of the the locked narrowing 
> feature in the feature/improved-locked-narrowing branch.  It is now 
> possible:
> 
> 1. to unlock a locked narrowing,
> 
> 2. to use narrow-to-region and widen within the bounds of a locked 
> narrowing,
> 
> 3. to enter and leave a locked narrowing within a locked narrowing, and
> 
> 4. to use that feature in Lisp code (either directly or with a helper 
> macro).
> 
> As far as I understand, given that it is possible to unlock a locked 
> narrowing, adding the possibility to choose how the bounds of the locked 
> narrowings are computed has become unnecessary.
> 
> Comments/feedback welcome.

Thanks.

The problem with narrowing around the calls to pre- and post-command
hooks (see https://debbugs.gnu.org/cgi/bugreport.cgi?bug=57207#107)
still exists, AFAICT, and needs to be resolved.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: locked narrowing
  2022-08-20 16:20                                                                                                                                                               ` Gregory Heytings
  2022-08-20 17:12                                                                                                                                                                 ` Eli Zaretskii
@ 2022-08-20 17:21                                                                                                                                                                 ` Eli Zaretskii
  2022-08-20 17:44                                                                                                                                                                   ` Gregory Heytings
  2022-10-18 16:30                                                                                                                                                                 ` Dmitry Gutov
                                                                                                                                                                                   ` (2 subsequent siblings)
  4 siblings, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-08-20 17:21 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, monnier, dgutov

Hmm, and I also don't see the change you promised in

  https://debbugs.gnu.org/cgi/bugreport.cgi?bug=57207#89





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: locked narrowing
  2022-08-20 17:21                                                                                                                                                                 ` Eli Zaretskii
@ 2022-08-20 17:44                                                                                                                                                                   ` Gregory Heytings
  0 siblings, 0 replies; 685+ messages in thread
From: Gregory Heytings @ 2022-08-20 17:44 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, monnier, dgutov

[-- Attachment #1: Type: text/plain, Size: 261 bytes --]


>
> Hmm, and I also don't see the change you promised in
>
>  https://debbugs.gnu.org/cgi/bugreport.cgi?bug=57207#89
>

Yes, this changes is focused on the "locked narrowing" issue only, which 
is complex enough.  I'll keep my promise, don't worry 😉

^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: locked narrowing
  2022-08-20 16:20                                                                                                                                                               ` Gregory Heytings
  2022-08-20 17:12                                                                                                                                                                 ` Eli Zaretskii
  2022-08-20 17:21                                                                                                                                                                 ` Eli Zaretskii
@ 2022-10-18 16:30                                                                                                                                                                 ` Dmitry Gutov
  2022-11-26 14:14                                                                                                                                                                   ` Gregory Heytings
       [not found]                                                                                                                                                                 ` <5faa8871-e809-8750-325a-991a71e76639@yandex.ru>
       [not found]                                                                                                                                                                 ` <f3c1c37c495f2b2af64f@heytings.org>
  4 siblings, 1 reply; 685+ messages in thread
From: Dmitry Gutov @ 2022-10-18 16:30 UTC (permalink / raw)
  To: Gregory Heytings, Eli Zaretskii; +Cc: 56682, Stefan Monnier

(Sorry, resending after unarchiving the bug)

Hi Gregory,

I don't mean to hurry you up, but:

On 20.08.2022 19:20, Gregory Heytings wrote:
> 
> I pushed a (hopefully) improved version of the the locked narrowing 
> feature in the feature/improved-locked-narrowing branch.  It is now 
> possible:
> 
> 1. to unlock a locked narrowing,
> 
> 2. to use narrow-to-region and widen within the bounds of a locked 
> narrowing,
> 
> 3. to enter and leave a locked narrowing within a locked narrowing, and
> 
> 4. to use that feature in Lisp code (either directly or with a helper 
> macro).
> 
> As far as I understand, given that it is possible to unlock a locked 
> narrowing, adding the possibility to choose how the bounds of the locked 
> narrowings are computed has become unnecessary.

Does that mean that you concluded that font-lock will be able (and 
should) unlock the narrowing before doing its thing?

Which will be equivalent to not applying the narrowing in 
handle_fontified_prop to begin with.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: locked narrowing
       [not found]                                                                                                                                                                 ` <5faa8871-e809-8750-325a-991a71e76639@yandex.ru>
@ 2022-10-19 17:49                                                                                                                                                                   ` Gregory Heytings
  0 siblings, 0 replies; 685+ messages in thread
From: Gregory Heytings @ 2022-10-19 17:49 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: 56682, Eli Zaretskii, Stefan Monnier


>
> Does that mean that you concluded that font-lock will be able (and 
> should) unlock the narrowing before doing its thing?
>

No, obviously that's not what it means.  It only means that font locking 
routines have the possibility to unlock the narrowing.

I'll be back on track on this topic next week.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: locked narrowing
       [not found]                                                                                                                                                                 ` <f3c1c37c495f2b2af64f@heytings.org>
@ 2022-11-26  2:53                                                                                                                                                                   ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-11-26 10:08                                                                                                                                                                   ` Eli Zaretskii
  1 sibling, 0 replies; 685+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2022-11-26  2:53 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, Eli Zaretskii, dgutov

> I finally found the time to work on this again.  I pushed a number of
> further improvements in the feature/improved-locked-narrowing branch.

Thanks.  I'll take a look ASAP.


        Stefan






^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: locked narrowing
       [not found]                                                                                                                                                                 ` <f3c1c37c495f2b2af64f@heytings.org>
  2022-11-26  2:53                                                                                                                                                                   ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2022-11-26 10:08                                                                                                                                                                   ` Eli Zaretskii
  2022-11-26 16:15                                                                                                                                                                     ` Gregory Heytings
  1 sibling, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-11-26 10:08 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, monnier, dgutov

> Date: Sat, 26 Nov 2022 00:30:53 +0000
> From: Gregory Heytings <gregory@heytings.org>
> cc: 56682@debbugs.gnu.org, dgutov@yandex.ru
> 
> 
> Hi Eli & Stefan,
> 
> I finally found the time to work on this again.  I pushed a number of 
> further improvements in the feature/improved-locked-narrowing branch.
> 
> In particular, Stefan, I used the suggestions you made in 
> jwvtu623mi9.fsf-monnier+emacs@gnu.org on August 23rd (I can't believe so 
> much time has passed!), and added comments to make the code (hopefully) 
> easier to read.
> 
> Comments and feedback welcome.

Below:

> +(defun with-narrowing-1 (start end tag body)
> +  "Helper function for `with-narrowing', which see."
> +  (save-restriction
> +    (progn
> +      (narrow-to-region start end)
> +      (narrowing-lock tag)
> +      (funcall body))))
> +
> +(defun with-narrowing-2 (start end body)
> +  "Helper function for `with-narrowing', which see."
> +  (save-restriction
> +    (progn
> +      (narrow-to-region start end)
> +      (funcall body))))
> +

Should these two helpers be internal functions?

> +/* Retrieve one of the BEGV/ZV bounds of a narrowing in BUF from the
> +   narrowing_locks alist.  When OUTERMOST is true, the bounds that
> +   were set by the user and that are visible on display are returned.
> +   Otherwise the innermost locked narrowing bounds are returned.  */
> +static ptrdiff_t
> +narrowing_lock_get_bound (Lisp_Object buf, bool begv, bool outermost)
> +{
> +  if (NILP (Fbuffer_live_p (buf)))
> +    return 0;

Zero is a strange value to return from a function the is documented to
return buffer positions.  It is also not documented in the commentary.

Also, I'm not sure I understand why we need the buffer-live-p test here.
This is an internal C subroutine, so it's up to the callers to make sure BUF
is a live buffer.

> +  buffer_locks = Fcar (Fcdr (buffer_locks));

Please avoid calling Fcar and Fcdr from C -- that just burns up CPU cycles
for no good reason.  Use CAR and CDR instead.

In general, if some Lisp primitive has a subroutine that is specifically for
calls from C, always prefer to use the subroutine, since that's why those
subroutines are there in the first place.  They typically avoid some
safeguards and checks that are necessary when calling from Lisp, but not
when calling from C.

> +  Lisp_Object marker = begv ? Fcar (bounds) : Fcar (Fcdr (bounds));
> +  eassert (MARKERP (marker));
> +  Lisp_Object pos = Fmarker_position (marker);
> +  eassert (! NILP (pos));

Why isn't there an assertion that the marker belongs to the buffer BUF?  I
think this is a more probable problem than position being nil.

> +/* Remove the innermost lock in BUF from the narrowing_lock alist.  */
>  static void
> -unwind_locked_zv (Lisp_Object point_max)
> +narrowing_lock_pop (Lisp_Object buf)
>  {
> -  SET_BUF_ZV (current_buffer, XFIXNUM (point_max));
> +  Lisp_Object buffer_locks = assq_no_quit (buf, narrowing_locks);
> +  eassert (! NILP (buffer_locks));

Why this assertion?  There's no similar assertions in other functions that
deal with narrowing_locks.

> +  if (EQ (narrowing_lock_peek_tag (buf), Qoutermost_narrowing))
> +    narrowing_locks = Fdelq (Fassoc (buf, narrowing_locks, Qnil),
> +			     narrowing_locks);
> +  else
> +    Fsetcdr (buffer_locks, list1 (Fcdr (Fcar (Fcdr (buffer_locks)))));

Please use XSETCDR instead of Fsetcdr.

> +  begv = narrowing_lock_get_bound (buf, true, false);
> +  zv = narrowing_lock_get_bound (buf, false, false);
> +  if (begv && zv)

This goes back to the question about returning zero for buffer positions:
zero is an unusual value, I'd prefer to use -1 instead.

>      {
> -      EMACS_INT tem = s; s = e; e = tem;
> +      SET_BUF_BEGV (XBUFFER (buf), begv);
> +      SET_BUF_ZV (XBUFFER (buf), zv);

The values you keep in narrowing_locks are markers, so they include the byte
position.  By returning only the character position, you've lost that useful
information, and thus SET_BUF_BEGV/SET_BUF_ZV will have to recompute it.  I
think it's better to return the marker there, and then you can use the byte
positions here and call SET_BUF_BEGV_BOTH and SET_BUF_ZV_BOTH.

> +/* When redisplay is called in a function executed while a locked
> +   narrowing is in effect, restore the narrowing bounds that were set
> +   by the user, and restore the bounds of the locked narrowing when
> +   returning from redisplay.  */
> +void
> +reset_outermost_narrowings (void)

This function doesn't care about redisplay, it will do its job for any
caller.  So the commentary should describe what it does regardless of
redisplay, and then say that it is called from redisplay when so-and-so.

> +  for (val = narrowing_locks; CONSP (val); val = XCDR (val))
>      {
> -      if (!(BEGV <= s && s <= e && e <= ZV))
> -	args_out_of_range (start, end);
> +      buf = Fcar (Fcar (val));
> +      eassert (BUFFERP (buf));
> +      ptrdiff_t begv = narrowing_lock_get_bound (buf, true, true);
> +      ptrdiff_t zv = narrowing_lock_get_bound (buf, false, true);
> +      SET_BUF_BEGV (XBUFFER (buf), begv);
> +      SET_BUF_ZV (XBUFFER (buf), zv);

No checking of values of begv and zv?

> +      record_unwind_protect (unwind_reset_outermost_narrowing, buf);
> +    }
> +}
>  
> -      if (BEGV != s || ZV != e)
> -	current_buffer->clip_changed = 1;
> +/* Helper functions to save and restore the narrowing locks of the
> +   current buffer in save-restriction.  */
> +static Lisp_Object
> +narrowing_locks_save (void)
> +{
> +  Lisp_Object buf = Fcurrent_buffer ();
> +  Lisp_Object locks = assq_no_quit (buf, narrowing_locks);
> +  if (NILP (locks))
> +    return Qnil;
> +  locks = Fcar (Fcdr (locks));
> +  return Fcons (buf, Fcopy_sequence (locks));
> +}
> +
> +static void
> +narrowing_locks_restore (Lisp_Object buf_and_saved_locks)
> +{
> +  if (NILP (buf_and_saved_locks))
> +    return;
> +  Lisp_Object buf = Fcar (buf_and_saved_locks);
> +  eassert (BUFFERP (buf));
> +  Lisp_Object saved_locks = Fcdr (buf_and_saved_locks);
> +  eassert (! NILP (saved_locks));

Again, I don't understand the need for an assertion here.  Just return if
saved_locks is nil.

What about some tests?

Thanks.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: locked narrowing
  2022-10-18 16:30                                                                                                                                                                 ` Dmitry Gutov
@ 2022-11-26 14:14                                                                                                                                                                   ` Gregory Heytings
  2022-11-29  3:20                                                                                                                                                                     ` Dmitry Gutov
  2022-11-30 16:34                                                                                                                                                                     ` Juri Linkov
  0 siblings, 2 replies; 685+ messages in thread
From: Gregory Heytings @ 2022-11-26 14:14 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: 56682, Eli Zaretskii, Stefan Monnier


Hi Dmitry,

I pushed another change to the feature/improved-locked-narrowing branch, 
which makes the locked narrowing around low-level hooks (and therefore 
around fontification-functions) configurable.  I hope that addresses your 
concerns.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: locked narrowing
  2022-11-26 10:08                                                                                                                                                                   ` Eli Zaretskii
@ 2022-11-26 16:15                                                                                                                                                                     ` Gregory Heytings
  2022-11-26 16:51                                                                                                                                                                       ` Eli Zaretskii
  0 siblings, 1 reply; 685+ messages in thread
From: Gregory Heytings @ 2022-11-26 16:15 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, monnier, dgutov


Thanks for your detailed review, and for the useful suggestions!

A few comments/questions below:

>> +(defun with-narrowing-1 (start end tag body)
>> +(defun with-narrowing-2 (start end body)
>
> Should these two helpers be internal functions?
>

You mean, they should be called with-narrowing--{1,2} (or perhaps 
with--narrowing-{1,2})?

>> +/* Remove the innermost lock in BUF from the narrowing_lock alist.  */
>>  static void
>> -unwind_locked_zv (Lisp_Object point_max)
>> +narrowing_lock_pop (Lisp_Object buf)
>>  {
>> -  SET_BUF_ZV (current_buffer, XFIXNUM (point_max));
>> +  Lisp_Object buffer_locks = assq_no_quit (buf, narrowing_locks);
>> +  eassert (! NILP (buffer_locks));
>
> Why this assertion?  There's no similar assertions in other functions 
> that deal with narrowing_locks.
>

Because 'pop' on an empty stack is an error, and (more importantly) it 
would mean that the narrowing_locks alist is corrupted.  The cdr's in that 
alist should never be nil.

>> +static void
>> +narrowing_locks_restore (Lisp_Object buf_and_saved_locks)
>> +{
>> +  if (NILP (buf_and_saved_locks))
>> +    return;
>> +  Lisp_Object buf = Fcar (buf_and_saved_locks);
>> +  eassert (BUFFERP (buf));
>> +  Lisp_Object saved_locks = Fcdr (buf_and_saved_locks);
>> +  eassert (! NILP (saved_locks));
>
> Again, I don't understand the need for an assertion here.  Just return 
> if saved_locks is nil.
>

Strictly speaking there is no need for an assertion, but again it would 
mean that something that isn't supposed to happen happened.  In this case 
it would mean that narrowing_locks_restore is called with a list of length 
1, containing only a buffer, whereas it is supposed to be called with the 
return value of narrowing_locks_save, which is either nil or a list of 
length >= 2.

>
> The values you keep in narrowing_locks are markers, so they include the 
> byte position.  By returning only the character position, you've lost 
> that useful information, and thus SET_BUF_BEGV/SET_BUF_ZV will have to 
> recompute it.  I think it's better to return the marker there, and then 
> you can use the byte positions here and call SET_BUF_BEGV_BOTH and 
> SET_BUF_ZV_BOTH.
>

Thanks, I didn't think of that possibility, it seems better indeed.

>
> What about some tests?
>

I'd have to add some tests, indeed.  Not sure I'll have time to do that 
today.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: locked narrowing
  2022-11-26 16:15                                                                                                                                                                     ` Gregory Heytings
@ 2022-11-26 16:51                                                                                                                                                                       ` Eli Zaretskii
  2022-11-26 17:44                                                                                                                                                                         ` Eli Zaretskii
  2022-11-26 22:42                                                                                                                                                                         ` Gregory Heytings
  0 siblings, 2 replies; 685+ messages in thread
From: Eli Zaretskii @ 2022-11-26 16:51 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, monnier, dgutov

> Date: Sat, 26 Nov 2022 16:15:34 +0000
> From: Gregory Heytings <gregory@heytings.org>
> cc: monnier@iro.umontreal.ca, 56682@debbugs.gnu.org, dgutov@yandex.ru
> 
> >> +(defun with-narrowing-1 (start end tag body)
> >> +(defun with-narrowing-2 (start end body)
> >
> > Should these two helpers be internal functions?
> >
> 
> You mean, they should be called with-narrowing--{1,2} (or perhaps 
> with--narrowing-{1,2})?

I actually think these should not be called with-SOMETHING, since they
aren't macros.  And yes, the function names should include "--".

> >> +/* Remove the innermost lock in BUF from the narrowing_lock alist.  */
> >>  static void
> >> -unwind_locked_zv (Lisp_Object point_max)
> >> +narrowing_lock_pop (Lisp_Object buf)
> >>  {
> >> -  SET_BUF_ZV (current_buffer, XFIXNUM (point_max));
> >> +  Lisp_Object buffer_locks = assq_no_quit (buf, narrowing_locks);
> >> +  eassert (! NILP (buffer_locks));
> >
> > Why this assertion?  There's no similar assertions in other functions 
> > that deal with narrowing_locks.
> >
> 
> Because 'pop' on an empty stack is an error

You don't need to pop, just return without doing anything.

> and (more importantly) it would mean that the narrowing_locks alist is
> corrupted.  The cdr's in that alist should never be nil.

A comment to that effect should be in order, then.

> >> +static void
> >> +narrowing_locks_restore (Lisp_Object buf_and_saved_locks)
> >> +{
> >> +  if (NILP (buf_and_saved_locks))
> >> +    return;
> >> +  Lisp_Object buf = Fcar (buf_and_saved_locks);
> >> +  eassert (BUFFERP (buf));
> >> +  Lisp_Object saved_locks = Fcdr (buf_and_saved_locks);
> >> +  eassert (! NILP (saved_locks));
> >
> > Again, I don't understand the need for an assertion here.  Just return 
> > if saved_locks is nil.
> >
> 
> Strictly speaking there is no need for an assertion, but again it would 
> mean that something that isn't supposed to happen happened.  In this case 
> it would mean that narrowing_locks_restore is called with a list of length 
> 1, containing only a buffer, whereas it is supposed to be called with the 
> return value of narrowing_locks_save, which is either nil or a list of 
> length >= 2.

I don't think I understand (you avoid the assertion in other cases which
look similar to me), but if there are good reasons, please add comments
there explaining the rationale.

> > What about some tests?
> 
> I'd have to add some tests, indeed.  Not sure I'll have time to do that 
> today.

We can add the tests after the branch is cut, I just wanted to be sure we
will have them eventually.

Thanks.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: locked narrowing
  2022-11-26 16:51                                                                                                                                                                       ` Eli Zaretskii
@ 2022-11-26 17:44                                                                                                                                                                         ` Eli Zaretskii
  2022-11-26 22:42                                                                                                                                                                         ` Gregory Heytings
  1 sibling, 0 replies; 685+ messages in thread
From: Eli Zaretskii @ 2022-11-26 17:44 UTC (permalink / raw)
  To: gregory; +Cc: 56682, monnier, dgutov

> Cc: 56682@debbugs.gnu.org, monnier@iro.umontreal.ca, dgutov@yandex.ru
> Date: Sat, 26 Nov 2022 18:51:37 +0200
> From: Eli Zaretskii <eliz@gnu.org>
> 
> We can add the tests after the branch is cut, I just wanted to be sure we
> will have them eventually.

Btw, one more general comment: we will need to tell in NEWS what we expect
from developers of modes to do to comply with these protocols, when they
adapt to Emacs 29 their code related to font-lock and anything else that can
run from redisplay.  The actual text for NEWS can be added later, after the
branch is cut, but maybe thinking about that aspect will affect your code
and/or the doc strings.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: locked narrowing
  2022-11-26 16:51                                                                                                                                                                       ` Eli Zaretskii
  2022-11-26 17:44                                                                                                                                                                         ` Eli Zaretskii
@ 2022-11-26 22:42                                                                                                                                                                         ` Gregory Heytings
  2022-11-27  1:10                                                                                                                                                                           ` Gregory Heytings
  1 sibling, 1 reply; 685+ messages in thread
From: Gregory Heytings @ 2022-11-26 22:42 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, monnier, dgutov


>
> I actually think these should not be called with-SOMETHING, since they 
> aren't macros.  And yes, the function names should include "--".
>

Done, I went for internal--with-narrowing.

>> Because 'pop' on an empty stack is an error
>
> You don't need to pop, just return without doing anything.
>
>> and (more importantly) it would mean that the narrowing_locks alist is 
>> corrupted.  The cdr's in that alist should never be nil.
>
> A comment to that effect should be in order, then.
>

Sorry, I was confused, in fact just return'ing in that case is fine.

>> Strictly speaking there is no need for an assertion, but again it would 
>> mean that something that isn't supposed to happen happened.  In this 
>> case it would mean that narrowing_locks_restore is called with a list 
>> of length 1, containing only a buffer, whereas it is supposed to be 
>> called with the return value of narrowing_locks_save, which is either 
>> nil or a list of length >= 2.
>
> I don't think I understand (you avoid the assertion in other cases which 
> look similar to me), but if there are good reasons, please add comments 
> there explaining the rationale.
>

I'm just being extra cautious here.  I added a comment to explain that 
assertion (and the previous one).

>
> We can add the tests after the branch is cut, I just wanted to be sure 
> we will have them eventually.
>

I'll do that.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: locked narrowing
  2022-11-26 22:42                                                                                                                                                                         ` Gregory Heytings
@ 2022-11-27  1:10                                                                                                                                                                           ` Gregory Heytings
  0 siblings, 0 replies; 685+ messages in thread
From: Gregory Heytings @ 2022-11-27  1:10 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, monnier, dgutov


>> I don't think I understand (you avoid the assertion in other cases 
>> which look similar to me), but if there are good reasons, please add 
>> comments there explaining the rationale.
>
> I'm just being extra cautious here.  I added a comment to explain that 
> assertion (and the previous one).
>

In the end, I removed that assertion, there are indeed no "good reasons" 
to keep it.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: locked narrowing
  2022-11-26 14:14                                                                                                                                                                   ` Gregory Heytings
@ 2022-11-29  3:20                                                                                                                                                                     ` Dmitry Gutov
  2022-11-29 12:47                                                                                                                                                                       ` Eli Zaretskii
  2022-11-29 17:10                                                                                                                                                                       ` Gregory Heytings
  2022-11-30 16:34                                                                                                                                                                     ` Juri Linkov
  1 sibling, 2 replies; 685+ messages in thread
From: Dmitry Gutov @ 2022-11-29  3:20 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, Eli Zaretskii, Stefan Monnier

Hi Gregory,

On 26/11/2022 16:14, Gregory Heytings wrote:

> I pushed another change to the feature/improved-locked-narrowing branch, 
> which makes the locked narrowing around low-level hooks (and therefore 
> around fontification-functions) configurable.  I hope that addresses 
> your concerns.

Thank you, this looks like a step in the right direction.

But I tried to see the effects of this new variable 
(long-line-locked-narrowing-region-size), and it was a little puzzling.

With the default value (500000) I open dictionary.json and start hitting 
PgDn a lot. Syntax highlighting starts to look broken at the buffer 
position that's around half that: at my last attempt it was at point 259999.

Looking at the code, there is indeed some halving going on, so maybe it 
would be more easier to understand if the variable was called 
locked-narrowing-radius, and used as such -- without division.

Either way, though, if I set the var to a very large value, the syntax 
highlighting looks okay.

Another thing that bothered me when testing: going from eob to bob in 
dictionary.json took ~4 seconds every time, independent of buffer being 
edited or not. And that delay didn't show up anywhere in the profiler. 
(setq bidi-inhibit-bpa nil) didn't help at all, but (setq 
bidi-display-reordering nil) eliminated that delay. So I'm still kind of 
puzzled why we bother to restrict font-lock, but didn't do that with 
this significantly more costly computation. The value of 
long-line-locked-narrowing-region-size (big or small) has no effect on it.

Going back higher level, I wanted to repeat that don't understand why we 
apply narrowing around font-lock in buffers with long lines, but not in 
large buffers without long lines. Or vice versa.

And we'll probably come back to this question sometime later, but here's 
something that looks like a regression. Editing dictionary.json is 
snappier than dictionary-pp.json (same file but pretty-printed so 
without long lines).

Even with with common setup (and emacs -Q):

1. (setq long-line-locked-narrowing-region-size 50000)
2. (setq bidi-display-reordering nil)
3. Toggle show-paren-mode off, just in case.
4. electric-pair-mode off, same.

typing in the latter file exhibits random pauses in redisplay up to 0.5s 
(and sometimes 1s+). I haven't managed to catch the exact source of 
those pauses (and they're longer with my personal config), but even 
regular editing is slower: evaluating

   (benchmark 1 '(progn (insert " ") (redisplay t)))

in dictionary.json reports something like 0.038906s, but in 
dictionary-pp.json it prints ~0.136387s.

Commit 89a10ffc (before the last merge) behaves the same, but going 
further back, this commit from July behaves differently: b283e36cf19.

Emacs built from that version reports ~0.033022s in dictionary-pp.json 
and 0.114781s at bob in dictionary.json (scrolling to the end 
predictably freezes that Emacs build).





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: locked narrowing
  2022-11-29  3:20                                                                                                                                                                     ` Dmitry Gutov
@ 2022-11-29 12:47                                                                                                                                                                       ` Eli Zaretskii
  2022-11-29 13:21                                                                                                                                                                         ` Dmitry Gutov
  2022-11-29 17:10                                                                                                                                                                       ` Gregory Heytings
  1 sibling, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-11-29 12:47 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: 56682, gregory, monnier

> Date: Tue, 29 Nov 2022 05:20:30 +0200
> Cc: Eli Zaretskii <eliz@gnu.org>, Stefan Monnier <monnier@iro.umontreal.ca>,
>  56682@debbugs.gnu.org
> From: Dmitry Gutov <dgutov@yandex.ru>
> 
> Another thing that bothered me when testing: going from eob to bob in 
> dictionary.json took ~4 seconds every time, independent of buffer being 
> edited or not. And that delay didn't show up anywhere in the profiler. 
> (setq bidi-inhibit-bpa nil) didn't help at all, but (setq 
> bidi-display-reordering nil) eliminated that delay. So I'm still kind of 
> puzzled why we bother to restrict font-lock, but didn't do that with 
> this significantly more costly computation.

Why do you think we didn't restrict them?  Limitations on costly
bidi-related stuff is in Emacs since the very beginning, in v24, AFAIR.  And
no code in bidi.c or xdisp.c ever goes outside the current narrowing.

> Even with with common setup (and emacs -Q):
> 
> 1. (setq long-line-locked-narrowing-region-size 50000)
> 2. (setq bidi-display-reordering nil)
> 3. Toggle show-paren-mode off, just in case.
> 4. electric-pair-mode off, same.
> 
> typing in the latter file exhibits random pauses in redisplay up to 0.5s 
> (and sometimes 1s+). I haven't managed to catch the exact source of 
> those pauses (and they're longer with my personal config), but even 
> regular editing is slower: evaluating
> 
>    (benchmark 1 '(progn (insert " ") (redisplay t)))
> 
> in dictionary.json reports something like 0.038906s, but in 
> dictionary-pp.json it prints ~0.136387s.

It is wrong to discuss here issues that are evidently unrelated to long
lines and the measures to make Emacs more efficient with long lines.  Please
file a separate bug report about the delays you see, and please post there
the file dictionary-pp.json you used in these tests.  Bonus points for
including in the report buffer positions where "typing exhibits random
pauses in redisplay", to make search for those more efficient.

Last, but not least: the "optimizations" (I prefer to call them "shortcuts")
which we installed for making Emacs more responsive with long lines are just
that: shortcuts.  They deliberately ignore certain possible complications in
buffer text and properties/overlays, and bypass the potentially costly code
which handles them, in order to make the display code significantly faster,
at a price of being less accurate and correct.  So I'm not surprised that
you sometimes see faster redisplay with long lines: it could well be due to
these simplifications -- and the price is that in some situations the
display will be incorrect.  So it could turn out that there's nothing wrong
with the "unoptimized" redisplay: it simply sometimes takes time to do all
that it has to do to produce correct display on the screen.  The resulting
loss of accuracy and/or correctness is IMO justified when lines are so long
as to make Emacs unusable without these shortcuts, but not when Emacs can
cope with the complete and accurate display perfectly well, albeit somewhat
slower.  So you might be basically comparing apples with oranges here.

But that is theory: we need specific recipes to investigate the causes for
the delay.  

> Commit 89a10ffc (before the last merge) behaves the same, but going 
> further back, this commit from July behaves differently: b283e36cf19.
> 
> Emacs built from that version reports ~0.033022s in dictionary-pp.json 
> and 0.114781s at bob in dictionary.json (scrolling to the end 
> predictably freezes that Emacs build).

I don't understand what exactly you timed here (since it cannot be scrolling
to eob).  Is it the "insert one SPC" or is it something else?

In any case, 0.114781s just 19% (and 22 msec) slower than 0.136387s, so is
this something serious to talk about?  There could be any number of reasons
for this, including some changes to the JSON mode, perhaps?





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: locked narrowing
  2022-11-29 12:47                                                                                                                                                                       ` Eli Zaretskii
@ 2022-11-29 13:21                                                                                                                                                                         ` Dmitry Gutov
  2022-11-29 14:25                                                                                                                                                                           ` Eli Zaretskii
  0 siblings, 1 reply; 685+ messages in thread
From: Dmitry Gutov @ 2022-11-29 13:21 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, gregory, monnier

On 29/11/2022 14:47, Eli Zaretskii wrote:
>> Date: Tue, 29 Nov 2022 05:20:30 +0200
>> Cc: Eli Zaretskii <eliz@gnu.org>, Stefan Monnier <monnier@iro.umontreal.ca>,
>>   56682@debbugs.gnu.org
>> From: Dmitry Gutov <dgutov@yandex.ru>
>>
>> Another thing that bothered me when testing: going from eob to bob in
>> dictionary.json took ~4 seconds every time, independent of buffer being
>> edited or not. And that delay didn't show up anywhere in the profiler.
>> (setq bidi-inhibit-bpa nil) didn't help at all, but (setq
>> bidi-display-reordering nil) eliminated that delay. So I'm still kind of
>> puzzled why we bother to restrict font-lock, but didn't do that with
>> this significantly more costly computation.
> 
> Why do you think we didn't restrict them?  Limitations on costly
> bidi-related stuff is in Emacs since the very beginning, in v24, AFAIR.  And
> no code in bidi.c or xdisp.c ever goes outside the current narrowing.

Just because it was really slow. Apologies, I seem to be unable to 
reproduce this effect now. I'll get back to this if I see it again.

>> Even with with common setup (and emacs -Q):
>>
>> 1. (setq long-line-locked-narrowing-region-size 50000)
>> 2. (setq bidi-display-reordering nil)
>> 3. Toggle show-paren-mode off, just in case.
>> 4. electric-pair-mode off, same.
>>
>> typing in the latter file exhibits random pauses in redisplay up to 0.5s
>> (and sometimes 1s+). I haven't managed to catch the exact source of
>> those pauses (and they're longer with my personal config), but even
>> regular editing is slower: evaluating
>>
>>     (benchmark 1 '(progn (insert " ") (redisplay t)))
>>
>> in dictionary.json reports something like 0.038906s, but in
>> dictionary-pp.json it prints ~0.136387s.
> 
> It is wrong to discuss here issues that are evidently unrelated to long
> lines and the measures to make Emacs more efficient with long lines.  Please
> file a separate bug report about the delays you see, and please post there
> the file dictionary-pp.json you used in these tests.  Bonus points for
> including in the report buffer positions where "typing exhibits random
> pauses in redisplay", to make search for those more efficient.

My theory was that it's likely related, since there haven't been any 
other major changes to the display engine later. Of course I could be 
mistaken.

If you don't see the problem right away, sure I can file this separately.

dictionary-pp.json is produced from dictionary.json using 'M-x 
json-pretty-print-buffer'. It's 27 MB long, do you want me to upload it 
to some file sharing platform?

Positions: any near bob.

The profiler output looks like this:

          526  87% - command-execute
          516  85%  - call-interactively
          378  62%   - funcall-interactively
          370  61%    - eval-expression
          370  61%     - eval
          370  61%      - benchmark
          370  61%       - benchmark-call
          194  32%        - #<lambda 0x91bc787b0d851>
          194  32%         - progn
          194  32%            redisplay
          160  26%        - #<lambda 0x91bc787b0d851>
          160  26%         - progn
          160  26%            redisplay
           16   2%        - #<lambda 0x91bc787b0d851>
           16   2%         - progn
           16   2%            redisplay

> Last, but not least: the "optimizations" (I prefer to call them "shortcuts")
> which we installed for making Emacs more responsive with long lines are just
> that: shortcuts.  They deliberately ignore certain possible complications in
> buffer text and properties/overlays, and bypass the potentially costly code
> which handles them, in order to make the display code significantly faster,
> at a price of being less accurate and correct.  So I'm not surprised that
> you sometimes see faster redisplay with long lines: it could well be due to
> these simplifications -- and the price is that in some situations the
> display will be incorrect.  So it could turn out that there's nothing wrong
> with the "unoptimized" redisplay: it simply sometimes takes time to do all
> that it has to do to produce correct display on the screen.  The resulting
> loss of accuracy and/or correctness is IMO justified when lines are so long
> as to make Emacs unusable without these shortcuts, but not when Emacs can
> cope with the complete and accurate display perfectly well, albeit somewhat
> slower.  So you might be basically comparing apples with oranges here.
> 
> But that is theory: we need specific recipes to investigate the causes for
> the delay.
> 
>> Commit 89a10ffc (before the last merge) behaves the same, but going
>> further back, this commit from July behaves differently: b283e36cf19.
>>
>> Emacs built from that version reports ~0.033022s in dictionary-pp.json
>> and 0.114781s at bob in dictionary.json (scrolling to the end
>> predictably freezes that Emacs build).
> 
> I don't understand what exactly you timed here (since it cannot be scrolling
> to eob).  Is it the "insert one SPC" or is it something else?

"insert one SPC and redisplay".

The 'insert' call by itself is very fast.

> In any case, 0.114781s just 19% (and 22 msec) slower than 0.136387s, so is
> this something serious to talk about?  There could be any number of reasons
> for this, including some changes to the JSON mode, perhaps?

It's 0.114 vs 0.033 (in dictionary-pp.json, file without long lines).





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: locked narrowing
  2022-11-29 13:21                                                                                                                                                                         ` Dmitry Gutov
@ 2022-11-29 14:25                                                                                                                                                                           ` Eli Zaretskii
       [not found]                                                                                                                                                                             ` <444288a4-b51a-9544-2e60-d28b0aa2bb75@yandex.ru>
  0 siblings, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-11-29 14:25 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: 56682, gregory, monnier

> Date: Tue, 29 Nov 2022 15:21:12 +0200
> Cc: 56682@debbugs.gnu.org, gregory@heytings.org, monnier@iro.umontreal.ca
> From: Dmitry Gutov <dgutov@yandex.ru>
> 
> > Why do you think we didn't restrict them?  Limitations on costly
> > bidi-related stuff is in Emacs since the very beginning, in v24, AFAIR.  And
> > no code in bidi.c or xdisp.c ever goes outside the current narrowing.
> 
> Just because it was really slow. Apologies, I seem to be unable to 
> reproduce this effect now. I'll get back to this if I see it again.

What is not reproducible? the 0.5sec delays or something else?

Is it still worth our while to look at the dictionary-pp.json file and the
slow redisplay with it?

> dictionary-pp.json is produced from dictionary.json using 'M-x 
> json-pretty-print-buffer'. It's 27 MB long, do you want me to upload it 
> to some file sharing platform?

If you compress it with xz, doesn't become small enough to post here?

If not, please upload somewhere and tell where.

> The profiler output looks like this:
> 
>           526  87% - command-execute
>           516  85%  - call-interactively
>           378  62%   - funcall-interactively
>           370  61%    - eval-expression
>           370  61%     - eval
>           370  61%      - benchmark
>           370  61%       - benchmark-call
>           194  32%        - #<lambda 0x91bc787b0d851>
>           194  32%         - progn
>           194  32%            redisplay
>           160  26%        - #<lambda 0x91bc787b0d851>
>           160  26%         - progn
>           160  26%            redisplay
>            16   2%        - #<lambda 0x91bc787b0d851>
>            16   2%         - progn
>            16   2%            redisplay

This seems to say redisplay takes about 1/3rd of the time?

> > In any case, 0.114781s just 19% (and 22 msec) slower than 0.136387s, so is
> > this something serious to talk about?  There could be any number of reasons
> > for this, including some changes to the JSON mode, perhaps?
> 
> It's 0.114 vs 0.033 (in dictionary-pp.json, file without long lines).

I thought you were saying that Emacs at commit 89a10ffc and at current HEAD
took 0.136387 sec, which is slower than 0.114 sec at commit b283e36cf19
(from July)?  The 0.033 figure is with long-line optimizations, no?  So it's
a very different buffer text and different code paths.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: locked narrowing
       [not found]                                                                                                                                                                             ` <444288a4-b51a-9544-2e60-d28b0aa2bb75@yandex.ru>
@ 2022-11-29 15:47                                                                                                                                                                               ` Eli Zaretskii
  0 siblings, 0 replies; 685+ messages in thread
From: Eli Zaretskii @ 2022-11-29 15:47 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: 56682, gregory, monnier

> Date: Tue, 29 Nov 2022 17:26:46 +0200
> Cc: 56682@debbugs.gnu.org, gregory@heytings.org, monnier@iro.umontreal.ca
> From: Dmitry Gutov <dgutov@yandex.ru>
> 
> It's 3 MB compressed. Let's see if it's small enough as an attachment.

Thanks, got it.

> The figure of 0.114 sec is for dictionary.json (in July Emacs). Which is 
> the same file but with all contents on one line.

Ah, yes.  Too many dictionaries and too little coffee.

Thanks, will look at this soon.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: locked narrowing
  2022-11-29  3:20                                                                                                                                                                     ` Dmitry Gutov
  2022-11-29 12:47                                                                                                                                                                       ` Eli Zaretskii
@ 2022-11-29 17:10                                                                                                                                                                       ` Gregory Heytings
  2022-11-29 17:56                                                                                                                                                                         ` Dmitry Gutov
  2022-11-29 18:16                                                                                                                                                                         ` Eli Zaretskii
  1 sibling, 2 replies; 685+ messages in thread
From: Gregory Heytings @ 2022-11-29 17:10 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: 56682, Eli Zaretskii, Stefan Monnier


>
> But I tried to see the effects of this new variable 
> (long-line-locked-narrowing-region-size), and it was a little puzzling.
>
> With the default value (500000) I open dictionary.json and start hitting 
> PgDn a lot. Syntax highlighting starts to look broken at the buffer 
> position that's around half that: at my last attempt it was at point 
> 259999.
>
> Looking at the code, there is indeed some halving going on, so maybe it 
> would be more easier to understand if the variable was called 
> locked-narrowing-radius, and used as such -- without division.
>

I considered naming it with "radius", but decided not to do it.  This is 
an implementation detail.  And the docstring says "region around point", 
from which an attentive reader can infer that half of the region will be 
before and half of it will be after point.  It does not seem worth the 
price to introduce separate cases for point at or near BOB and point at or 
near EOB.

>
> Another thing that bothered me when testing: going from eob to bob in 
> dictionary.json took ~4 seconds every time, independent of buffer being 
> edited or not. And that delay didn't show up anywhere in the profiler. 
> (setq bidi-inhibit-bpa nil) didn't help at all, but (setq 
> bidi-display-reordering nil) eliminated that delay.
>

Your analysis is not correct: the delay you see is due to show-paren-mode. 
Turn it off, and you'll see that going from EOB to BOB is instantaneous.

>
> And we'll probably come back to this question sometime later, but here's 
> something that looks like a regression. Editing dictionary.json is 
> snappier than dictionary-pp.json (same file but pretty-printed so 
> without long lines).
>

Unless I misunderstand what you mean, this cannot be a regression: editing 
dictionary.json was not possible with Emacs 28, editing dictionary-pp.json 
was.  Even if the former were now snappier than the latter, that would not 
be a problem in itself.

>
> Even with with common setup (and emacs -Q):
>
> 1. (setq long-line-locked-narrowing-region-size 50000)
> 2. (setq bidi-display-reordering nil)
> 3. Toggle show-paren-mode off, just in case.
> 4. electric-pair-mode off, same.
>
> typing in the latter file exhibits random pauses in redisplay up to 0.5s 
> (and sometimes 1s+). I haven't managed to catch the exact source of 
> those pauses (and they're longer with my personal config), but even 
> regular editing is slower: evaluating
>
> (benchmark 1 '(progn (insert " ") (redisplay t)))
>
> in dictionary.json reports something like 0.038906s, but in 
> dictionary-pp.json it prints ~0.136387s.
>

I cannot reproduce that.  With emacs -Q, with dictionary-pp.json and with 
show-paren-mode disabled, type C-s aan zich RET.  Now type some text: in 
both cases the effect is near instantaneous here, and I do not see any 
random pauses.

With your benchmark and with dictionary-pp.json:

- on current master, after C-s eman RET, I see ~100 ms, and after C-s aan 
zich RET, I see ~100 ms

- at ff57f30bee (30 July), after C-s eman RET, I see ~20 ms, and after C-s 
aan zich RET, I see ~2700 (!) ms

- at c59b8dfefa (30 Jun), after C-s eman RET, I see ~20 ms, and after C-s 
aan zich RET, I see ~2700 (!) ms

- with Emacs 28, after C-s eman RET, I see ~20 ms, and after C-s aan zich 
RET, I see ~3000 (!) ms

With your benchmark and with dictionary.json:

- with current master, after C-s eman RET, I see ~70 ms, and after C-s aan 
zich RET, I see ~70 ms

So there is no regression as far as I can see.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: locked narrowing
  2022-11-29 17:10                                                                                                                                                                       ` Gregory Heytings
@ 2022-11-29 17:56                                                                                                                                                                         ` Dmitry Gutov
  2022-11-29 18:19                                                                                                                                                                           ` Eli Zaretskii
  2022-11-29 20:11                                                                                                                                                                           ` Gregory Heytings
  2022-11-29 18:16                                                                                                                                                                         ` Eli Zaretskii
  1 sibling, 2 replies; 685+ messages in thread
From: Dmitry Gutov @ 2022-11-29 17:56 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, Eli Zaretskii, Stefan Monnier

On 29/11/2022 19:10, Gregory Heytings wrote:

>> Looking at the code, there is indeed some halving going on, so maybe 
>> it would be more easier to understand if the variable was called 
>> locked-narrowing-radius, and used as such -- without division.
>>
> 
> I considered naming it with "radius", but decided not to do it.  This is 
> an implementation detail.  And the docstring says "region around point", 
> from which an attentive reader can infer that half of the region will be 
> before and half of it will be after point.  It does not seem worth the 
> price to introduce separate cases for point at or near BOB and point at 
> or near EOB.

All right. It would have been easier for me to understand, but it's 
nothing critical.

>> Another thing that bothered me when testing: going from eob to bob in 
>> dictionary.json took ~4 seconds every time, independent of buffer 
>> being edited or not. And that delay didn't show up anywhere in the 
>> profiler. (setq bidi-inhibit-bpa nil) didn't help at all, but (setq 
>> bidi-display-reordering nil) eliminated that delay.
>>
> 
> Your analysis is not correct: the delay you see is due to 
> show-paren-mode. Turn it off, and you'll see that going from EOB to BOB 
> is instantaneous.

show-paren-mode does seem to have a tiny effect here, but nothing 
comparable. And when it's on, it seems to blink red (the "mismatch" 
face), indicating that its scan probably stops earlier before it reaches 
the EOB.

Anyway, I'll let you know with more details when I see this again. 
Previously, I would see this effect (multi-second delays) every time I 
test the feature, now it is just gone. Maybe 'make bootstrap' helped.

>> And we'll probably come back to this question sometime later, but 
>> here's something that looks like a regression. Editing dictionary.json 
>> is snappier than dictionary-pp.json (same file but pretty-printed so 
>> without long lines).
>>
> 
> Unless I misunderstand what you mean, this cannot be a regression: 
> editing dictionary.json was not possible with Emacs 28, editing 
> dictionary-pp.json was.  Even if the former were now snappier than the 
> latter, that would not be a problem in itself.

I'm mostly talking about how editing dictionary-pp.json became slower.

The fact that editing dictionary.json is now faster than that is, while 
counter-intuitive, definitely not something to complain about by itself.

>> Even with with common setup (and emacs -Q):
>>
>> 1. (setq long-line-locked-narrowing-region-size 50000)
>> 2. (setq bidi-display-reordering nil)
>> 3. Toggle show-paren-mode off, just in case.
>> 4. electric-pair-mode off, same.
>>
>> typing in the latter file exhibits random pauses in redisplay up to 
>> 0.5s (and sometimes 1s+). I haven't managed to catch the exact source 
>> of those pauses (and they're longer with my personal config), but even 
>> regular editing is slower: evaluating
>>
>> (benchmark 1 '(progn (insert " ") (redisplay t)))
>>
>> in dictionary.json reports something like 0.038906s, but in 
>> dictionary-pp.json it prints ~0.136387s.
>>
> 
> I cannot reproduce that.  With emacs -Q, with dictionary-pp.json and 
> with show-paren-mode disabled, type C-s aan zich RET.  Now type some 
> text: in both cases the effect is near instantaneous here, and I do not 
> see any random pauses.

Right. "aan zich" is not far from EOB.

My scenarios are all near BOB.

> With your benchmark and with dictionary-pp.json:
> 
> - on current master, after C-s eman RET, I see ~100 ms, and after C-s 

Note the 100 ms.

> aan zich RET, I see ~100 ms

"eman" is near BOB for you as well, right?

> - at ff57f30bee (30 July), after C-s eman RET, I see ~20 ms, and after 
> C-s aan zich RET, I see ~2700 (!) ms
> 
> - at c59b8dfefa (30 Jun), after C-s eman RET, I see ~20 ms, and after 
> C-s aan zich RET, I see ~2700 (!) ms

Note the 20 ms.

> - with Emacs 28, after C-s eman RET, I see ~20 ms, and after C-s aan 
> zich RET, I see ~3000 (!) ms

Yup, the long delays near EOB are expected, I fixed them in js.el not 
too long ago (one in font-lock rules, and anothing by creating 
js-json-mode).

> With your benchmark and with dictionary.json:
> 
> - with current master, after C-s eman RET, I see ~70 ms, and after C-s 
> aan zich RET, I see ~70 ms
> 
> So there is no regression as far as I can see.

Your observations seem to match mine.

Look at the timings for dictionary-pp.json. After C-s eman:

master: ~100 ms
ff57f30bee, or c59b8dfefa, or Emacs 28: ~20 ms

That's the regression.

But like Eli said, it might be unrelated your code, it just seems to 
belong to the same general area. If my guess was wrong, I apologize.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: locked narrowing
  2022-11-29 17:10                                                                                                                                                                       ` Gregory Heytings
  2022-11-29 17:56                                                                                                                                                                         ` Dmitry Gutov
@ 2022-11-29 18:16                                                                                                                                                                         ` Eli Zaretskii
  1 sibling, 0 replies; 685+ messages in thread
From: Eli Zaretskii @ 2022-11-29 18:16 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, monnier, dgutov

> Date: Tue, 29 Nov 2022 17:10:27 +0000
> From: Gregory Heytings <gregory@heytings.org>
> cc: Eli Zaretskii <eliz@gnu.org>, Stefan Monnier <monnier@iro.umontreal.ca>, 
>     56682@debbugs.gnu.org
> 
> > Looking at the code, there is indeed some halving going on, so maybe it 
> > would be more easier to understand if the variable was called 
> > locked-narrowing-radius, and used as such -- without division.
> 
> I considered naming it with "radius", but decided not to do it.  This is 
> an implementation detail.

Maybe long-line-locked-narrowing-half-size?





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: locked narrowing
  2022-11-29 17:56                                                                                                                                                                         ` Dmitry Gutov
@ 2022-11-29 18:19                                                                                                                                                                           ` Eli Zaretskii
  2022-11-29 19:29                                                                                                                                                                             ` Dmitry Gutov
  2022-11-29 20:11                                                                                                                                                                           ` Gregory Heytings
  1 sibling, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-11-29 18:19 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: 56682, gregory, monnier

> Date: Tue, 29 Nov 2022 19:56:30 +0200
> Cc: 56682@debbugs.gnu.org, Eli Zaretskii <eliz@gnu.org>,
>  Stefan Monnier <monnier@iro.umontreal.ca>
> From: Dmitry Gutov <dgutov@yandex.ru>
> 
> Look at the timings for dictionary-pp.json. After C-s eman:
> 
> master: ~100 ms
> ff57f30bee, or c59b8dfefa, or Emacs 28: ~20 ms
> 
> That's the regression.

The faster ones use a different major-mode, btw.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: locked narrowing
  2022-11-29 18:19                                                                                                                                                                           ` Eli Zaretskii
@ 2022-11-29 19:29                                                                                                                                                                             ` Dmitry Gutov
  2022-11-29 19:51                                                                                                                                                                               ` Eli Zaretskii
  0 siblings, 1 reply; 685+ messages in thread
From: Dmitry Gutov @ 2022-11-29 19:29 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, gregory, monnier

On 29/11/2022 20:19, Eli Zaretskii wrote:
>> Date: Tue, 29 Nov 2022 19:56:30 +0200
>> Cc:56682@debbugs.gnu.org, Eli Zaretskii<eliz@gnu.org>,
>>   Stefan Monnier<monnier@iro.umontreal.ca>
>> From: Dmitry Gutov<dgutov@yandex.ru>
>>
>> Look at the timings for dictionary-pp.json. After C-s eman:
>>
>> master: ~100 ms
>> ff57f30bee, or c59b8dfefa, or Emacs 28: ~20 ms
>>
>> That's the regression.
> The faster ones use a different major-mode, btw.

The old (faster) revision uses js-mode, the new one -- the optimized 
js-json-mode. I'm sure I could have made a mistake doing that 
optimization, but the behavior doesn't indicate that: the delays are 
higher near BOB and seem absent near EOB (in master/emacs-29), and they 
don't show up in the profiler in separate leaf nodes (the previous ones 
-- which I worked on optimizing -- did).

You can also copy the definition of js-json-mode to a file and evaluate 
it in the July Emacs, and use it with that file. Or enable js-mode 
instead in the emacs-29 Emacs. The measurements do not change here.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: locked narrowing
  2022-11-29 19:29                                                                                                                                                                             ` Dmitry Gutov
@ 2022-11-29 19:51                                                                                                                                                                               ` Eli Zaretskii
  2022-11-29 20:36                                                                                                                                                                                 ` Dmitry Gutov
  0 siblings, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-11-29 19:51 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: 56682, gregory, monnier

> Date: Tue, 29 Nov 2022 21:29:59 +0200
> Cc: 56682@debbugs.gnu.org, gregory@heytings.org, monnier@iro.umontreal.ca
> From: Dmitry Gutov <dgutov@yandex.ru>
> 
> >> That's the regression.
> > The faster ones use a different major-mode, btw.
> 
> The old (faster) revision uses js-mode, the new one -- the optimized 
> js-json-mode. I'm sure I could have made a mistake doing that 
> optimization, but the behavior doesn't indicate that: the delays are 
> higher near BOB and seem absent near EOB (in master/emacs-29), and they 
> don't show up in the profiler in separate leaf nodes (the previous ones 
> -- which I worked on optimizing -- did).

I didn't say the new mode was the culprit (you could have assumed I tried
the old mode as soon as I discovered this change since July).  I just
mentioned this for completeness, so we are aware what we are comparing.

Anyway, do you see any effect if you set long-line-threshold to nil?  Here
it makes the redisplay after insertion instantaneous (and this is an
unoptimized build, where without setting that variable to nil each insertion
in dictionary-pp.json takes about half a second).





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: locked narrowing
  2022-11-29 17:56                                                                                                                                                                         ` Dmitry Gutov
  2022-11-29 18:19                                                                                                                                                                           ` Eli Zaretskii
@ 2022-11-29 20:11                                                                                                                                                                           ` Gregory Heytings
  2022-11-29 20:47                                                                                                                                                                             ` Dmitry Gutov
  1 sibling, 1 reply; 685+ messages in thread
From: Gregory Heytings @ 2022-11-29 20:11 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: 56682, Eli Zaretskii, Stefan Monnier


>> - on current master, after C-s eman RET, I see ~100 ms, and after C-s
>
> Note the 100 ms.
>
>> aan zich RET, I see ~100 ms
>
> "eman" is near BOB for you as well, right?
>

It's the same file, so yes.

>> - at ff57f30bee (30 July), after C-s eman RET, I see ~20 ms, and after 
>> C-s aan zich RET, I see ~2700 (!) ms
>> 
>> - at c59b8dfefa (30 Jun), after C-s eman RET, I see ~20 ms, and after 
>> C-s aan zich RET, I see ~2700 (!) ms
>
> Note the 20 ms.
>

I did.

>> - with Emacs 28, after C-s eman RET, I see ~20 ms, and after C-s aan 
>> zich RET, I see ~3000 (!) ms
>
> Yup, the long delays near EOB are expected, I fixed them in js.el not 
> too long ago (one in font-lock rules, and anothing by creating 
> js-json-mode).
>

So what?  We had in that file 20 ms at BOB and 3000 ms at EOB, which means 
an average of 1500 ms (in that file).  Now we have 100 ms at BOB and EOB, 
which means an average of 100 ms (in that file).  How can that be a 
regression?





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: locked narrowing
  2022-11-29 19:51                                                                                                                                                                               ` Eli Zaretskii
@ 2022-11-29 20:36                                                                                                                                                                                 ` Dmitry Gutov
  0 siblings, 0 replies; 685+ messages in thread
From: Dmitry Gutov @ 2022-11-29 20:36 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, gregory, monnier

On 29/11/2022 21:51, Eli Zaretskii wrote:
>> Date: Tue, 29 Nov 2022 21:29:59 +0200
>> Cc: 56682@debbugs.gnu.org, gregory@heytings.org, monnier@iro.umontreal.ca
>> From: Dmitry Gutov <dgutov@yandex.ru>
>>
>>>> That's the regression.
>>> The faster ones use a different major-mode, btw.
>>
>> The old (faster) revision uses js-mode, the new one -- the optimized
>> js-json-mode. I'm sure I could have made a mistake doing that
>> optimization, but the behavior doesn't indicate that: the delays are
>> higher near BOB and seem absent near EOB (in master/emacs-29), and they
>> don't show up in the profiler in separate leaf nodes (the previous ones
>> -- which I worked on optimizing -- did).
> 
> I didn't say the new mode was the culprit (you could have assumed I tried
> the old mode as soon as I discovered this change since July).  I just
> mentioned this for completeness, so we are aware what we are comparing.

For completeness we could also mention that js-mode also had one 
significant change in font-lock rules (also an optimization) which is 
not as easily transplantable.

> Anyway, do you see any effect if you set long-line-threshold to nil?  Here
> it makes the redisplay after insertion instantaneous (and this is an
> unoptimized build, where without setting that variable to nil each insertion
> in dictionary-pp.json takes about half a second).

Yep, that helps.

So the delay is due to it looking for long lines in the buffer, I guess?

Curious why it doesn't happen when near EOB. The benchmark reports a 
delay once, but if you run it multiple times, the timing go down to 
"instant".





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: locked narrowing
  2022-11-29 20:11                                                                                                                                                                           ` Gregory Heytings
@ 2022-11-29 20:47                                                                                                                                                                             ` Dmitry Gutov
  2022-11-29 20:59                                                                                                                                                                               ` Gregory Heytings
  0 siblings, 1 reply; 685+ messages in thread
From: Dmitry Gutov @ 2022-11-29 20:47 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, Eli Zaretskii, Stefan Monnier

On 29/11/2022 22:11, Gregory Heytings wrote:

>>> - with Emacs 28, after C-s eman RET, I see ~20 ms, and after C-s aan 
>>> zich RET, I see ~3000 (!) ms
>>
>> Yup, the long delays near EOB are expected, I fixed them in js.el not 
>> too long ago (one in font-lock rules, and anothing by creating 
>> js-json-mode).
>>
> 
> So what?  We had in that file 20 ms at BOB and 3000 ms at EOB, which 
> means an average of 1500 ms (in that file).  Now we have 100 ms at BOB 
> and EOB, which means an average of 100 ms (in that file).  How can that 
> be a regression?

But the improvement near EOB in this scenario down from 1500 ms is not 
necessarily from the long-lines feature.

Like Eli pointed out, try (setq long-line-threshold nil).

The result will be that the benchmark will report ~30ms both near BOB 
and near EOB. So the long-lines-threshold thingy adds a regression here.

Again, not trying to criticize or anything, but a 100ms is usually 
considered as something that brings an operation from appearing 
"instantaneous" down to "noticeable delay". Since we're trying to make 
editing large files easier and snappier, that seems worth fixing.

Not to mention that the user might have other features enabled that can 
add a multiplier on top of this delay -- which is apparently the case in 
my personal configuration.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: locked narrowing
  2022-11-29 20:47                                                                                                                                                                             ` Dmitry Gutov
@ 2022-11-29 20:59                                                                                                                                                                               ` Gregory Heytings
  2022-11-30  0:15                                                                                                                                                                                 ` Gregory Heytings
  0 siblings, 1 reply; 685+ messages in thread
From: Gregory Heytings @ 2022-11-29 20:59 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: 56682, Eli Zaretskii, Stefan Monnier


>
> The result will be that the benchmark will report ~30ms both near BOB 
> and near EOB. So the long-lines-threshold thingy adds a regression here.
>

It's not a regression, it's the price we agreed to pay to detect whether 
the buffer contains long lines.  That detection happens dynamically, to 
catch cases when long lines are inserted in a buffer.

>
> Again, not trying to criticize or anything, but a 100ms is usually 
> considered as something that brings an operation from appearing 
> "instantaneous" down to "noticeable delay".
>

I don't think your benchmark is representative.  While (benchmark-run 1 
(progn (insert "a") (redisplay t))) does take 100 ms, Emacs remains 
responsive when I type as fast as I can (which is faster than 10 
characters per second), and I do not see any delays.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: locked narrowing
  2022-11-29 20:59                                                                                                                                                                               ` Gregory Heytings
@ 2022-11-30  0:15                                                                                                                                                                                 ` Gregory Heytings
  2022-11-30  0:47                                                                                                                                                                                   ` Dmitry Gutov
                                                                                                                                                                                                     ` (2 more replies)
  0 siblings, 3 replies; 685+ messages in thread
From: Gregory Heytings @ 2022-11-30  0:15 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: 56682, Eli Zaretskii, Stefan Monnier


>> The result will be that the benchmark will report ~30ms both near BOB 
>> and near EOB. So the long-lines-threshold thingy adds a regression 
>> here.
>
> It's not a regression, it's the price we agreed to pay to detect whether 
> the buffer contains long lines.  That detection happens dynamically, to 
> catch cases when long lines are inserted in a buffer.
>

After looking at this closely, it turns out that the change in 1c837c42c2 
doesn't do what it was meant to do.  Sigh...  Dmitry, can you confirm that 
the following change fixes this?

diff --git a/src/xdisp.c b/src/xdisp.c
index b09aa6ec96..cdd6a7f5fe 100644
--- a/src/xdisp.c
+++ b/src/xdisp.c
@@ -19535,7 +19535,7 @@ redisplay_window (Lisp_Object window, bool just_this_one_p)
    /* Check whether the buffer to be displayed contains long lines.  */
    if (!NILP (Vlong_line_threshold)
        && !current_buffer->long_line_optimizations_p
-      && CHARS_MODIFF - CHARS_UNCHANGED_MODIFIED > 8)
+      && CHARS_MODIFF - UNCHANGED_MODIFIED > 8)
      {
        ptrdiff_t cur, next, found, max = 0, threshold;
        threshold = XFIXNUM (Vlong_line_threshold);





^ permalink raw reply related	[flat|nested] 685+ messages in thread

* bug#56682: locked narrowing
  2022-11-30  0:15                                                                                                                                                                                 ` Gregory Heytings
@ 2022-11-30  0:47                                                                                                                                                                                   ` Dmitry Gutov
  2022-11-30 10:00                                                                                                                                                                                     ` Gregory Heytings
  2022-11-30  3:42                                                                                                                                                                                   ` Eli Zaretskii
  2022-11-30 13:19                                                                                                                                                                                   ` Eli Zaretskii
  2 siblings, 1 reply; 685+ messages in thread
From: Dmitry Gutov @ 2022-11-30  0:47 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, Eli Zaretskii, Stefan Monnier

On 30/11/2022 02:15, Gregory Heytings wrote:
> 
>>> The result will be that the benchmark will report ~30ms both near BOB 
>>> and near EOB. So the long-lines-threshold thingy adds a regression here.
>>
>> It's not a regression, it's the price we agreed to pay to detect 
>> whether the buffer contains long lines.  That detection happens 
>> dynamically, to catch cases when long lines are inserted in a buffer.
>>
> 
> After looking at this closely, it turns out that the change in 
> 1c837c42c2 doesn't do what it was meant to do.  Sigh...  Dmitry, can you 
> confirm that the following change fixes this?
> 
> diff --git a/src/xdisp.c b/src/xdisp.c
> index b09aa6ec96..cdd6a7f5fe 100644
> --- a/src/xdisp.c
> +++ b/src/xdisp.c
> @@ -19535,7 +19535,7 @@ redisplay_window (Lisp_Object window, bool 
> just_this_one_p)
>     /* Check whether the buffer to be displayed contains long lines.  */
>     if (!NILP (Vlong_line_threshold)
>         && !current_buffer->long_line_optimizations_p
> -      && CHARS_MODIFF - CHARS_UNCHANGED_MODIFIED > 8)
> +      && CHARS_MODIFF - UNCHANGED_MODIFIED > 8)
>       {
>         ptrdiff_t cur, next, found, max = 0, threshold;
>         threshold = XFIXNUM (Vlong_line_threshold);
> 

Looking good. Thanks, Gregory!






^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: locked narrowing
  2022-11-30  0:15                                                                                                                                                                                 ` Gregory Heytings
  2022-11-30  0:47                                                                                                                                                                                   ` Dmitry Gutov
@ 2022-11-30  3:42                                                                                                                                                                                   ` Eli Zaretskii
  2022-11-30 10:11                                                                                                                                                                                     ` Gregory Heytings
  2022-11-30 13:19                                                                                                                                                                                   ` Eli Zaretskii
  2 siblings, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-11-30  3:42 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, monnier, dgutov

> Date: Wed, 30 Nov 2022 00:15:39 +0000
> From: Gregory Heytings <gregory@heytings.org>
> cc: 56682@debbugs.gnu.org, Eli Zaretskii <eliz@gnu.org>, 
>     Stefan Monnier <monnier@iro.umontreal.ca>
> 
> 
> >> The result will be that the benchmark will report ~30ms both near BOB 
> >> and near EOB. So the long-lines-threshold thingy adds a regression 
> >> here.
> >
> > It's not a regression, it's the price we agreed to pay to detect whether 
> > the buffer contains long lines.  That detection happens dynamically, to 
> > catch cases when long lines are inserted in a buffer.
> >
> 
> After looking at this closely, it turns out that the change in 1c837c42c2 
> doesn't do what it was meant to do.  Sigh...  Dmitry, can you confirm that 
> the following change fixes this?

I think this is just one aspect of the issue.  The loop under this condition
"punishes" large buffers with no long lines because we search the entire
buffer top to bottom.  To make this scale better, I think we should only
search in some predefined vicinity of the window, perhaps the same region to
which we narrow the buffer when we do detect long lines.  We can then repeat
the search if point moves far away from its last value.

There's no need to search the whole buffer, that will cause delays in very
large buffers for no good reason.

We've talked about this a few months ago, and you said fixing this was part
of your todo.  I think now is the time.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: locked narrowing
  2022-11-30  0:47                                                                                                                                                                                   ` Dmitry Gutov
@ 2022-11-30 10:00                                                                                                                                                                                     ` Gregory Heytings
  0 siblings, 0 replies; 685+ messages in thread
From: Gregory Heytings @ 2022-11-30 10:00 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: 56682, Eli Zaretskii, Stefan Monnier

[-- Attachment #1: Type: text/plain, Size: 100 bytes --]


>
> Looking good. Thanks, Gregory!
>

Thanks for checking!

Eli, is the attached okay for emacs-29?

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: Actually-improve-detection-of-long-lines.patch --]
[-- Type: text/x-diff; name=Actually-improve-detection-of-long-lines.patch, Size: 4237 bytes --]

From a900a41e10ca928ede13dab16e2b3c95e0e3d80c Mon Sep 17 00:00:00 2001
From: Gregory Heytings <gregory@heytings.org>
Date: Wed, 30 Nov 2022 09:58:44 +0000
Subject: [PATCH] Actually improve detection of long lines

* src/xdisp.c (redisplay_window): Update condition.

* src/xdisp.c (mark_window_display_accurate_1):
* src/pdumper.c (dump_buffer):
* src/buffer.h (BUF_CHARS_UNCHANGED_MODIFIED):
(struct buffer_text):
* src/buffer.c (Fget_buffer_create):
Revert 1c837c42c2, which was misguided.
---
 src/buffer.c  |  1 -
 src/buffer.h  | 11 -----------
 src/pdumper.c |  1 -
 src/xdisp.c   |  3 +--
 4 files changed, 1 insertion(+), 15 deletions(-)

diff --git a/src/buffer.c b/src/buffer.c
index 71be7ed9e1..69f27c9f47 100644
--- a/src/buffer.c
+++ b/src/buffer.c
@@ -604,7 +604,6 @@ DEFUN ("get-buffer-create", Fget_buffer_create, Sget_buffer_create, 1, 2, 0,
   set_buffer_intervals (b, NULL);
   BUF_UNCHANGED_MODIFIED (b) = 1;
   BUF_OVERLAY_UNCHANGED_MODIFIED (b) = 1;
-  BUF_CHARS_UNCHANGED_MODIFIED (b) = 1;
   BUF_END_UNCHANGED (b) = 0;
   BUF_BEG_UNCHANGED (b) = 0;
   *(BUF_GPT_ADDR (b)) = *(BUF_Z_ADDR (b)) = 0; /* Put an anchor '\0'.  */
diff --git a/src/buffer.h b/src/buffer.h
index dded0cd98c..80b3fd81e0 100644
--- a/src/buffer.h
+++ b/src/buffer.h
@@ -149,18 +149,12 @@ #define BUF_OVERLAY_UNCHANGED_MODIFIED(buf) \
 #define BUF_BEG_UNCHANGED(buf) ((buf)->text->beg_unchanged)
 #define BUF_END_UNCHANGED(buf) ((buf)->text->end_unchanged)
 
-#define BUF_CHARS_UNCHANGED_MODIFIED(buf) \
-  ((buf)->text->chars_unchanged_modified)
-
 #define UNCHANGED_MODIFIED \
   BUF_UNCHANGED_MODIFIED (current_buffer)
 #define OVERLAY_UNCHANGED_MODIFIED \
   BUF_OVERLAY_UNCHANGED_MODIFIED (current_buffer)
 #define BEG_UNCHANGED BUF_BEG_UNCHANGED (current_buffer)
 #define END_UNCHANGED BUF_END_UNCHANGED (current_buffer)
-
-#define CHARS_UNCHANGED_MODIFIED \
-  BUF_CHARS_UNCHANGED_MODIFIED (current_buffer)
 \f
 /* Functions to set PT in the current buffer, or another buffer.  */
 
@@ -274,11 +268,6 @@ #define FETCH_BYTE(n) *(BYTE_POS_ADDR ((n)))
        end_unchanged contain no useful information.  */
     modiff_count overlay_unchanged_modified;
 
-    /* CHARS_MODIFF as of last redisplay that finished.  It's used
-       when we only care about changes in actual buffer text, not in
-       any other kind of changes, like properties etc.  */
-    modiff_count chars_unchanged_modified;
-
     /* Properties of this buffer's text.  */
     INTERVAL intervals;
 
diff --git a/src/pdumper.c b/src/pdumper.c
index fedcd3e404..263343f60b 100644
--- a/src/pdumper.c
+++ b/src/pdumper.c
@@ -2811,7 +2811,6 @@ dump_buffer (struct dump_context *ctx, const struct buffer *in_buffer)
       DUMP_FIELD_COPY (out, buffer, own_text.end_unchanged);
       DUMP_FIELD_COPY (out, buffer, own_text.unchanged_modified);
       DUMP_FIELD_COPY (out, buffer, own_text.overlay_unchanged_modified);
-      DUMP_FIELD_COPY (out, buffer, own_text.chars_unchanged_modified);
       if (buffer->own_text.intervals)
         dump_field_fixup_later (ctx, out, buffer, &buffer->own_text.intervals);
       dump_field_lv_rawptr (ctx, out, buffer, &buffer->own_text.markers,
diff --git a/src/xdisp.c b/src/xdisp.c
index b09aa6ec96..67c07725c4 100644
--- a/src/xdisp.c
+++ b/src/xdisp.c
@@ -17264,7 +17264,6 @@ mark_window_display_accurate_1 (struct window *w, bool accurate_p)
 
       BUF_UNCHANGED_MODIFIED (b) = BUF_MODIFF (b);
       BUF_OVERLAY_UNCHANGED_MODIFIED (b) = BUF_OVERLAY_MODIFF (b);
-      BUF_CHARS_UNCHANGED_MODIFIED (b) = BUF_CHARS_MODIFF (b);
       BUF_BEG_UNCHANGED (b) = BUF_GPT (b) - BUF_BEG (b);
       BUF_END_UNCHANGED (b) = BUF_Z (b) - BUF_GPT (b);
 
@@ -19535,7 +19534,7 @@ redisplay_window (Lisp_Object window, bool just_this_one_p)
   /* Check whether the buffer to be displayed contains long lines.  */
   if (!NILP (Vlong_line_threshold)
       && !current_buffer->long_line_optimizations_p
-      && CHARS_MODIFF - CHARS_UNCHANGED_MODIFIED > 8)
+      && CHARS_MODIFF - UNCHANGED_MODIFIED > 8)
     {
       ptrdiff_t cur, next, found, max = 0, threshold;
       threshold = XFIXNUM (Vlong_line_threshold);
-- 
2.35.1


^ permalink raw reply related	[flat|nested] 685+ messages in thread

* bug#56682: locked narrowing
  2022-11-30  3:42                                                                                                                                                                                   ` Eli Zaretskii
@ 2022-11-30 10:11                                                                                                                                                                                     ` Gregory Heytings
  2022-11-30 14:04                                                                                                                                                                                       ` Eli Zaretskii
  2022-11-30 15:21                                                                                                                                                                                       ` Dmitry Gutov
  0 siblings, 2 replies; 685+ messages in thread
From: Gregory Heytings @ 2022-11-30 10:11 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, monnier, dgutov


>
> I think this is just one aspect of the issue.  The loop under this 
> condition "punishes" large buffers with no long lines because we search 
> the entire buffer top to bottom.  To make this scale better, I think we 
> should only search in some predefined vicinity of the window, perhaps 
> the same region to which we narrow the buffer when we do detect long 
> lines.  We can then repeat the search if point moves far away from its 
> last value.
>
> There's no need to search the whole buffer, that will cause delays in 
> very large buffers for no good reason.
>
> We've talked about this a few months ago, and you said fixing this was 
> part of your todo.  I think now is the time.
>

Yes, it was and still is part of my todo.  At that point of time I was not 
at all expecting that Emacs 29 would be released three months later. 
What I had and still have in mind is too large a change for Emacs 29, so 
at first glance I think for now we'll have to live with the current 
solution.

Note that, apart from Dmitry, nobody reported a problem with that 
detection mechanism, and Dmitry's recipe with which he spotted that 
problem does not reflect actual usage.  And note that with the patch I 
just sent even Dmitry's recipe is fixed.

I'll see if I can design something smaller which would be suitable for 
Emacs 29, however.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: locked narrowing
  2022-11-30  0:15                                                                                                                                                                                 ` Gregory Heytings
  2022-11-30  0:47                                                                                                                                                                                   ` Dmitry Gutov
  2022-11-30  3:42                                                                                                                                                                                   ` Eli Zaretskii
@ 2022-11-30 13:19                                                                                                                                                                                   ` Eli Zaretskii
  2022-11-30 13:52                                                                                                                                                                                     ` Gregory Heytings
  2 siblings, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-11-30 13:19 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, monnier, dgutov

> Date: Wed, 30 Nov 2022 00:15:39 +0000
> From: Gregory Heytings <gregory@heytings.org>
> cc: 56682@debbugs.gnu.org, Eli Zaretskii <eliz@gnu.org>, 
>     Stefan Monnier <monnier@iro.umontreal.ca>
> 
> After looking at this closely, it turns out that the change in 1c837c42c2 
> doesn't do what it was meant to do.  Sigh...  Dmitry, can you confirm that 
> the following change fixes this?

??? You are reverting what I believe was a fix for bug#57207, right?  I
don't think we want that problem back, do we?

How did you reach the conclusion that the change doesn't do what it was
supposed to? please tell more about what you saw and your conclusions.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: locked narrowing
  2022-11-30 13:19                                                                                                                                                                                   ` Eli Zaretskii
@ 2022-11-30 13:52                                                                                                                                                                                     ` Gregory Heytings
  2022-11-30 15:03                                                                                                                                                                                       ` Eli Zaretskii
  0 siblings, 1 reply; 685+ messages in thread
From: Gregory Heytings @ 2022-11-30 13:52 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, monnier, dgutov


>> After looking at this closely, it turns out that the change in 
>> 1c837c42c2 doesn't do what it was meant to do.  Sigh...  Dmitry, can 
>> you confirm that the following change fixes this?
>
> ??? You are reverting what I believe was a fix for bug#57207, right?
>

No, I'm not reverting, I'm fixing.  The condition before 1c837c42c2 was 
"MODIFF - UNCHANGED_MODIFIED > 8", with 1c837c42c2 it became "CHARS_MODIFF 
- CHARS_UNCHANGED_MODIFIED > 8", which appeared correct at that time but 
is not, with the patch it becomes "CHARS_MODIFF - UNCHANGED_MODIFIED > 8".

>
> How did you reach the conclusion that the change doesn't do what it was 
> supposed to? please tell more about what you saw and your conclusions.
>

The first condition triggered the long line detection too much: it was 
triggered when the the only changes in the buffer were fontification 
changes.  The second condition fixes that problem, but still triggers the 
long line detection too much: it is still triggered when the main (but not 
_only_) changes in the buffer are fontification changes, IOW, it is 
triggered even if a single character is inserted and "enough" 
fontification changes are made.  The condition in the patch is correct: 
the long line detection mechanism is triggered only when many characters 
are inserted.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: locked narrowing
  2022-11-30 10:11                                                                                                                                                                                     ` Gregory Heytings
@ 2022-11-30 14:04                                                                                                                                                                                       ` Eli Zaretskii
  2022-11-30 14:40                                                                                                                                                                                         ` Gregory Heytings
  2022-11-30 15:21                                                                                                                                                                                       ` Dmitry Gutov
  1 sibling, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-11-30 14:04 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, monnier, dgutov

> Date: Wed, 30 Nov 2022 10:11:17 +0000
> From: Gregory Heytings <gregory@heytings.org>
> cc: 56682@debbugs.gnu.org, monnier@iro.umontreal.ca, dgutov@yandex.ru
> 
> > There's no need to search the whole buffer, that will cause delays in 
> > very large buffers for no good reason.
> >
> > We've talked about this a few months ago, and you said fixing this was 
> > part of your todo.  I think now is the time.
> >
> 
> Yes, it was and still is part of my todo.  At that point of time I was not 
> at all expecting that Emacs 29 would be released three months later. 
> What I had and still have in mind is too large a change for Emacs 29, so 
> at first glance I think for now we'll have to live with the current 
> solution.

I don't think I understand why it should be problematic or unsafe to limit
the same loop we have to a smaller region of the buffer.

> Note that, apart from Dmitry, nobody reported a problem with that 
> detection mechanism, and Dmitry's recipe with which he spotted that 
> problem does not reflect actual usage.  And note that with the patch I 
> just sent even Dmitry's recipe is fixed.

It should be clear that triggering such long searches should not be too
hard.  The search itself should scale better, similar to the general idea of
narrowing the display code, whose scaling is excellent, precisely because
the region doesn't grow with the buffer size.

> I'll see if I can design something smaller which would be suitable for 
> Emacs 29, however.

Well, I think what I proposed is safe enough already.  But maybe I'm missing
something.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: locked narrowing
  2022-11-30 14:04                                                                                                                                                                                       ` Eli Zaretskii
@ 2022-11-30 14:40                                                                                                                                                                                         ` Gregory Heytings
  2022-11-30 15:31                                                                                                                                                                                           ` Eli Zaretskii
  0 siblings, 1 reply; 685+ messages in thread
From: Gregory Heytings @ 2022-11-30 14:40 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, monnier, dgutov


>
> I don't think I understand why it should be problematic or unsafe to 
> limit the same loop we have to a smaller region of the buffer.
>

I see that you already changed the loop to scan from BEG to Z to only scan 
from BEGV to ZV; somehow I missed that change.  I don't think even that is 
correct: a command could insert text in the buffer outside of BEGV/ZV. 
While limiting the loop to a smaller region of the buffer looks like a 
reasonable thing to do, the question is: how can we determine that region? 
And I don't see how this can be done, because the detection code is called 
only when a buffer is about to be displayed, and at that moment we cannot 
know where characters were inserted in the buffer.  What the code does now 
is "if enough characters have been inserted in the buffer since last 
redisplay, check again whether the buffer contains long lines".

>
> It should be clear that triggering such long searches should not be too 
> hard.
>

The search is not that long, and it is not triggered for regular editing 
commands, e.g. while typing or when killing / yanking a line in a buffer.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: locked narrowing
  2022-11-30 13:52                                                                                                                                                                                     ` Gregory Heytings
@ 2022-11-30 15:03                                                                                                                                                                                       ` Eli Zaretskii
  0 siblings, 0 replies; 685+ messages in thread
From: Eli Zaretskii @ 2022-11-30 15:03 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, monnier, dgutov

> Date: Wed, 30 Nov 2022 13:52:48 +0000
> From: Gregory Heytings <gregory@heytings.org>
> cc: 56682@debbugs.gnu.org, monnier@iro.umontreal.ca, dgutov@yandex.ru
> 
> No, I'm not reverting, I'm fixing.  The condition before 1c837c42c2 was 
> "MODIFF - UNCHANGED_MODIFIED > 8", with 1c837c42c2 it became "CHARS_MODIFF 
> - CHARS_UNCHANGED_MODIFIED > 8", which appeared correct at that time but 
> is not, with the patch it becomes "CHARS_MODIFF - UNCHANGED_MODIFIED > 8".
> 
> >
> > How did you reach the conclusion that the change doesn't do what it was 
> > supposed to? please tell more about what you saw and your conclusions.
> >
> 
> The first condition triggered the long line detection too much: it was 
> triggered when the the only changes in the buffer were fontification 
> changes.  The second condition fixes that problem, but still triggers the 
> long line detection too much: it is still triggered when the main (but not 
> _only_) changes in the buffer are fontification changes, IOW, it is 
> triggered even if a single character is inserted and "enough" 
> fontification changes are made.  The condition in the patch is correct: 
> the long line detection mechanism is triggered only when many characters 
> are inserted.

Ah, okay.  But let's take this opportunity to limit the search region as
well, OK?  I think it will be a better, more thorough fix, especially for
very large buffers without long lines.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: locked narrowing
  2022-11-30 10:11                                                                                                                                                                                     ` Gregory Heytings
  2022-11-30 14:04                                                                                                                                                                                       ` Eli Zaretskii
@ 2022-11-30 15:21                                                                                                                                                                                       ` Dmitry Gutov
  1 sibling, 0 replies; 685+ messages in thread
From: Dmitry Gutov @ 2022-11-30 15:21 UTC (permalink / raw)
  To: Gregory Heytings, Eli Zaretskii; +Cc: 56682, monnier

On 30/11/2022 12:11, Gregory Heytings wrote:
> Note that, apart from Dmitry, nobody reported a problem with that 
> detection mechanism, and Dmitry's recipe with which he spotted that 
> problem does not reflect actual usage.

FWIW, my recipe was a way to isolate a more pronounced issue that I have 
experienced in practice.

Even when editing with 'emacs -Q' I could notice an occasional stutter, 
but with https://github.com/kangjianbin/highlight-tail and/or 
https://github.com/Malabarba/smart-mode-line installed the problem got 
much more noticeable (apparently because both cause additional 
redisplays or whatever).





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: locked narrowing
  2022-11-30 14:40                                                                                                                                                                                         ` Gregory Heytings
@ 2022-11-30 15:31                                                                                                                                                                                           ` Eli Zaretskii
  2022-11-30 22:09                                                                                                                                                                                             ` Gregory Heytings
  0 siblings, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-11-30 15:31 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, monnier, dgutov

> Date: Wed, 30 Nov 2022 14:40:36 +0000
> From: Gregory Heytings <gregory@heytings.org>
> cc: 56682@debbugs.gnu.org, monnier@iro.umontreal.ca, dgutov@yandex.ru
> 
> > I don't think I understand why it should be problematic or unsafe to 
> > limit the same loop we have to a smaller region of the buffer.
> >
> 
> I see that you already changed the loop to scan from BEG to Z to only scan 
> from BEGV to ZV; somehow I missed that change.  I don't think even that is 
> correct: a command could insert text in the buffer outside of BEGV/ZV. 

It could (although that would be an unusual thing to do), but that's
immaterial: the display engine will never look outside of the restriction,
and so searching beyond that is not useful.  Moreover, safe code in Emacs
cannot look beyond BEGV..ZV without calling 'widen', because various
primitives and subroutines don't expect that and will barf sooner or later;
that's why I made that change in the loop.

> While limiting the loop to a smaller region of the buffer looks like a 
> reasonable thing to do, the question is: how can we determine that region? 
> And I don't see how this can be done, because the detection code is called 
> only when a buffer is about to be displayed, and at that moment we cannot 
> know where characters were inserted in the buffer.  What the code does now 
> is "if enough characters have been inserted in the buffer since last 
> redisplay, check again whether the buffer contains long lines".

If we are going to narrow the buffer to PT ± N characters, then searching
inside slightly more than this region (say, twice more or 5 times more)
should be enough, I think.  It might fail in some borderline cases, but most
files with very long lines have almost all of their lines long, so I see no
problem here.

OTOH, "punishing" large buffers that have no long lines at all doesn't
strike me as a good balance.  Your proposed patch will solve a particular
use case, but it cannot solve all of them.  When modiff becomes large
enough, we will search again, and the threshold of 8 is not so large to
prevent it from happening frequently enough to be an annoyance.  That
annoyance will be for no good reason in buffers that have no long lines.

If you are still unhappy with such a simple heuristics, we could go with
something slightly more complex, like change the threshold of modiff
dynamically based on the buffer size and perhaps the number of times we
already searched without finding long lines -- the larger these two are, the
higher we could bump the threshold.  But I wonder whether this is justified.
I'd say let's find a fixed value that works in all the examples we know
about (we have about a dozen, I think), and leave it at that until someone
reports a real-life problem with it.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: locked narrowing
  2022-11-26 14:14                                                                                                                                                                   ` Gregory Heytings
  2022-11-29  3:20                                                                                                                                                                     ` Dmitry Gutov
@ 2022-11-30 16:34                                                                                                                                                                     ` Juri Linkov
  2022-11-30 17:34                                                                                                                                                                       ` Eli Zaretskii
  2022-12-06 17:14                                                                                                                                                                       ` Juri Linkov
  1 sibling, 2 replies; 685+ messages in thread
From: Juri Linkov @ 2022-11-30 16:34 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, Eli Zaretskii, Stefan Monnier, Dmitry Gutov

To be able to fix bug#56815 I started to test the locked narrowing,
and everything works smoothly with:

  (setq treesit-max-buffer-size 1200000000)
  (push '(js-json-mode . json-ts-mode) major-mode-remap-alist)
  (add-hook 'find-file-hook 'toggle-truncate-lines)

Navigating 1 GB hugedictionary.json exhibits no delays
(the recipe uses treesit to get the correct highlighting).

However, 2 problems encountered:

1. after 'M-g TAB' (move-to-column) to 214748364 or more,
   the display is not updated anymore: moving point to the left
   from this position shows the cursor, moving point to the right
   has no visible effect.  Is it a hard limit in the display engine?
   Its hex value is #xccccccc.

2. after starting Isearch at a large column number,
   Emacs hangs up indefinitely, e.g. with
   'M-g TAB 10000000 RET C-s' then even C-g doesn't get out.
   Debugging shows that the problem is in 'isearch-update'
   where the call to 'pos-visible-in-window-group-p' doesn't return.
   When this call is removed, the search is instantaneous.
   (Optimizing lazy-highlight is a separate problem in bug#56815.)

PS: it seems these problems are not related to the locked narrowing,
rather the locked narrowing helped to expose them, so maybe they
should be reported in a new separate bug report?





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: locked narrowing
  2022-11-30 16:34                                                                                                                                                                     ` Juri Linkov
@ 2022-11-30 17:34                                                                                                                                                                       ` Eli Zaretskii
  2022-12-06 17:14                                                                                                                                                                       ` Juri Linkov
  1 sibling, 0 replies; 685+ messages in thread
From: Eli Zaretskii @ 2022-11-30 17:34 UTC (permalink / raw)
  To: Juri Linkov; +Cc: 56682, gregory, monnier, dgutov

> From: Juri Linkov <juri@linkov.net>
> Cc: Dmitry Gutov <dgutov@yandex.ru>,  56682@debbugs.gnu.org,  Eli Zaretskii
>  <eliz@gnu.org>,  Stefan Monnier <monnier@iro.umontreal.ca>
> Date: Wed, 30 Nov 2022 18:34:15 +0200
> 
> 1. after 'M-g TAB' (move-to-column) to 214748364 or more,
>    the display is not updated anymore: moving point to the left
>    from this position shows the cursor, moving point to the right
>    has no visible effect.  Is it a hard limit in the display engine?
>    Its hex value is #xccccccc.

Sounds like a possible bug.  Does point move?  What does "C-x =" say about
point if you move beyond column 214748364?

If you window is auto-hscrolled as result, then there is indeed hard limit:
the X coordinate of a screen line is an 'int', so MAX_INT divided by the
pixel-width of your default font is as far as we can go.

> 2. after starting Isearch at a large column number,
>    Emacs hangs up indefinitely, e.g. with
>    'M-g TAB 10000000 RET C-s' then even C-g doesn't get out.
>    Debugging shows that the problem is in 'isearch-update'
>    where the call to 'pos-visible-in-window-group-p' doesn't return.
>    When this call is removed, the search is instantaneous.
>    (Optimizing lazy-highlight is a separate problem in bug#56815.)

I thought we agreed that calling pos-visible-in-window-p is not a good idea
in this situation, since it will always think any position is visible?

> PS: it seems these problems are not related to the locked narrowing,
> rather the locked narrowing helped to expose them, so maybe they
> should be reported in a new separate bug report?

It is unrelated, because handling lines that are both very long and
truncated on display uses a separate set of display shortcuts, and locked
narrowing has almost no effect on that.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: locked narrowing
  2022-11-30 15:31                                                                                                                                                                                           ` Eli Zaretskii
@ 2022-11-30 22:09                                                                                                                                                                                             ` Gregory Heytings
  2022-12-01  7:05                                                                                                                                                                                               ` Eli Zaretskii
  0 siblings, 1 reply; 685+ messages in thread
From: Gregory Heytings @ 2022-11-30 22:09 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, monnier, dgutov

[-- Attachment #1: Type: text/plain, Size: 3673 bytes --]


>
> It could (although that would be an unusual thing to do), but that's 
> immaterial: the display engine will never look outside of the 
> restriction, and so searching beyond that is not useful.  Moreover, safe 
> code in Emacs cannot look beyond BEGV..ZV without calling 'widen', 
> because various primitives and subroutines don't expect that and will 
> barf sooner or later; that's why I made that change in the loop.
>

I had to refresh my memory about this, and I think there is a 
misunderstanding here: we check whether a buffer contains long lines only 
when it is about to be redisplayed and its contents have changed enough 
since the last time it was displayed.  What happened between these two 
redisplays can be anything, e.g. it could be a buffer that has not been on 
display during an hour and that has been filled by a process in the 
meantime.  Using BEGV/ZV is wrong, again because we don't know what 
happened between these two redisplays, it could have been filled by a 
process and narrowed, and if after switching to that buffer the user 
widens it, Emacs would become unresponsive.  Or it could be a buffer that 
has been emptied in the background by a command, filled with the contents 
of a file, and narrowed to some portion of that file (e.g. a single hunk 
of a diff file); again if the user widens it to look at the whole file, 
Emacs will hang.  The only safe way to be certain that a buffer does not 
contain long lines is to check the whole buffer.

>
> If we are going to narrow the buffer to PT ± N characters, then 
> searching inside slightly more than this region (say, twice more or 5 
> times more) should be enough, I think.  It might fail in some borderline 
> cases, but most files with very long lines have almost all of their 
> lines long, so I see no problem here.
>

The intention when this detection mechanism was designed was explicitly to 
also support non-file visiting buffers, e.g. a shell buffer in which a 
user cat's a file with long lines.

>
> OTOH, "punishing" large buffers that have no long lines at all doesn't 
> strike me as a good balance.  Your proposed patch will solve a 
> particular use case, but it cannot solve all of them.
>

Indeed, by definition no heuristic can solve all problems.

>
> When modiff becomes large enough, we will search again, and the 
> threshold of 8 is not so large to prevent it from happening frequently 
> enough to be an annoyance.
>

Please, let's not throw away something that was designed with care and 
about which literally no one complained since it was introduced, for the 
sole reason that an artificial benchmark shows a slowdown of ~80 
milliseconds in a 30 MB buffer.  And note that it's not "modiff becomes 
large enough", it is "modiff changed enough between two redisplays".

>
> That annoyance will be for no good reason in buffers that have no long 
> lines.
>

It's not "for no good reason", it's for an excellent reason: it's the 
price to pay to ensure that Emacs remains responsive in as many cases as 
possible.  And it's not an annoyance, for all basic editing commands the 
detection loop will not run.

>
> If you are still unhappy with such a simple heuristics, we could go with 
> something slightly more complex, like change the threshold of modiff 
> dynamically based on the buffer size and perhaps the number of times we 
> already searched without finding long lines -- the larger these two are, 
> the higher we could bump the threshold.
>

I don't see how such a heuristic could catch a case such as a user cat'ing 
a file with long lines in a shell buffer.

^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: locked narrowing
  2022-11-30 22:09                                                                                                                                                                                             ` Gregory Heytings
@ 2022-12-01  7:05                                                                                                                                                                                               ` Eli Zaretskii
  2022-12-01 20:49                                                                                                                                                                                                 ` Gregory Heytings
  0 siblings, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-12-01  7:05 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, monnier, dgutov

> Date: Wed, 30 Nov 2022 22:09:59 +0000
> From: Gregory Heytings <gregory@heytings.org>
> cc: 56682@debbugs.gnu.org, monnier@iro.umontreal.ca, dgutov@yandex.ru
> 
> I had to refresh my memory about this, and I think there is a 
> misunderstanding here: we check whether a buffer contains long lines only 
> when it is about to be redisplayed and its contents have changed enough 
> since the last time it was displayed.  What happened between these two 
> redisplays can be anything, e.g. it could be a buffer that has not been on 
> display during an hour and that has been filled by a process in the 
> meantime.  Using BEGV/ZV is wrong, again because we don't know what 
> happened between these two redisplays, it could have been filled by a 
> process and narrowed, and if after switching to that buffer the user 
> widens it, Emacs would become unresponsive.  Or it could be a buffer that 
> has been emptied in the background by a command, filled with the contents 
> of a file, and narrowed to some portion of that file (e.g. a single hunk 
> of a diff file); again if the user widens it to look at the whole file, 
> Emacs will hang.  The only safe way to be certain that a buffer does not 
> contain long lines is to check the whole buffer.

I still don't understand why we need to look beyond the current narrowing:
we will never display anything outside of that.  Why should we care about
what happens in parts of the buffer that we don't display, and thus cannot
affect redisplay performance?

And again, there are technical problems with doing that without a call to
'widen' -- this is why I made that change: it caused trouble in some
situation that I no longer recall.  If you want to argue for looking at the
entire buffer, you will have to insert a call to 'widen' there, otherwise
the code which does that will not be safe.

And in any case, the BEG vs BEGV issue is secondary here.  My main worry is
valid for buffers without any narrowing at all -- in fact, especially for
those.  So let's leave the BEGV issue alone, or discuss it separately.  here
it is just a tangent.

> > If we are going to narrow the buffer to PT ± N characters, then 
> > searching inside slightly more than this region (say, twice more or 5 
> > times more) should be enough, I think.  It might fail in some borderline 
> > cases, but most files with very long lines have almost all of their 
> > lines long, so I see no problem here.
> 
> The intention when this detection mechanism was designed was explicitly to 
> also support non-file visiting buffers, e.g. a shell buffer in which a 
> user cat's a file with long lines.

This takes a minor and insignificant aspect of the idea I presented and
ignores the main part.  Please respond to the main ideas, not to inaccurate
wording.

And most buffers with very long lines in real life do come from files, not
from shell commands.  So even here you take a relatively rare use case and
make it more significant than it is.

> > OTOH, "punishing" large buffers that have no long lines at all doesn't 
> > strike me as a good balance.  Your proposed patch will solve a 
> > particular use case, but it cannot solve all of them.
> 
> Indeed, by definition no heuristic can solve all problems.

I'm proposing what should be a better heuristic.

> > When modiff becomes large enough, we will search again, and the 
> > threshold of 8 is not so large to prevent it from happening frequently 
> > enough to be an annoyance.
> 
> Please, let's not throw away something that was designed with care and 
> about which literally no one complained since it was introduced, for the 
> sole reason that an artificial benchmark shows a slowdown of ~80 
> milliseconds in a 30 MB buffer.

That benchmark is an example of many use cases that can happen in real life,
in a large buffer with no long lines and a lot of editing activity.  I'm
surprised you don't see it.

> And note that it's not "modiff becomes large enough", it is "modiff
> changed enough between two redisplays".

Once again, a useless argument about a problem with inaccurate wording.  Do
you really think I don't understand how modiff works in this case?  Why
waste energy and bandwidth on such tangents?  Let's focus on the main issue
at hand.

The main issue at hand is how to avoid needless scanning of the entire
buffer for long lines, something which doesn't scale well with buffer size.
For very large buffers without any long lines, this is a regression in Emacs
29, because Emacs 28 didn't do that.  IOW, we make "good" buffers suffer
because of the (rare) danger presented by potentially "bad" buffers.  We
need to look for ways of making this degradation as small and as rare as
possible.

> > That annoyance will be for no good reason in buffers that have no long 
> > lines.
> 
> It's not "for no good reason", it's for an excellent reason: it's the 
> price to pay to ensure that Emacs remains responsive in as many cases as 
> possible.

It will be very hard to explain this "price" to users who never have to deal
with very long lines.  We must look for every way of making the price lower.

> And it's not an annoyance, for all basic editing commands the detection
> loop will not run.

It will run whenever redisplay discovers that a window needs an update on
display, and there was enough changes in buffer text since last redisplay.
It should be clear that with low enough threshold for text changes, this
could happen quite frequently.

> > If you are still unhappy with such a simple heuristics, we could go with 
> > something slightly more complex, like change the threshold of modiff 
> > dynamically based on the buffer size and perhaps the number of times we 
> > already searched without finding long lines -- the larger these two are, 
> > the higher we could bump the threshold.
> 
> I don't see how such a heuristic could catch a case such as a user cat'ing 
> a file with long lines in a shell buffer.

The modiff value will change by a large delta, because it basically counts
the number of characters inserted since last redisplay, right?  So the
difference

   CHARS_MODIFF - UNCHANGED_MODIFIED

will change by a large value, and will exceed even a higher threshold.
AFAIU, this should solve the case you present here.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: locked narrowing
  2022-12-01  7:05                                                                                                                                                                                               ` Eli Zaretskii
@ 2022-12-01 20:49                                                                                                                                                                                                 ` Gregory Heytings
  2022-12-01 20:52                                                                                                                                                                                                   ` Gregory Heytings
                                                                                                                                                                                                                     ` (2 more replies)
  0 siblings, 3 replies; 685+ messages in thread
From: Gregory Heytings @ 2022-12-01 20:49 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, monnier, dgutov

[-- Attachment #1: Type: text/plain, Size: 4761 bytes --]


>
> I still don't understand why we need to look beyond the current 
> narrowing: we will never display anything outside of that.  Why should 
> we care about what happens in parts of the buffer that we don't display, 
> and thus cannot affect redisplay performance?
>

My plain English explanation is apparently not clear enough, so here is a 
recipe:

1. M-: (let ((large-file-warning-threshold nil)) (find-file "dictionary.json") (narrow-to-region 4000000 4004000)) RET
2. C-x n w
3. Kaboom!

>>> If we are going to narrow the buffer to PT ± N characters, then 
>>> searching inside slightly more than this region (say, twice more or 5 
>>> times more) should be enough, I think.  It might fail in some 
>>> borderline cases, but most files with very long lines have almost all 
>>> of their lines long, so I see no problem here.
>>
>> The intention when this detection mechanism was designed was explicitly 
>> to also support non-file visiting buffers, e.g. a shell buffer in which 
>> a user cat's a file with long lines.
>
> This takes a minor and insignificant aspect of the idea I presented and 
> ignores the main part.  Please respond to the main ideas, not to 
> inaccurate wording.
>

I'm sorry to hear you read it that way.  It was not my intention, and it's 
not insignificant: the point I wanted to make is that it's important to 
catch cases in which long lines are added into buffers that do not yet 
contain long lines.  So it's important to keep in mind that we're not only 
discussing _files_ with long lines, which is a case that could have been 
easily caught by adding a check at the moment the file is read in.

>
> And most buffers with very long lines in real life do come from files, 
> not from shell commands.  So even here you take a relatively rare use 
> case and make it more significant than it is.
>

That was a case that was explicitly discussed three months ago.  We cannot 
suddenly decide that it's an insignificant one, or a not significant 
enough one.  And I do agree that it's less common in real life to have 
long lines in comint buffers than to open files with long lines.  Another 
example is an interpreter outputting a (large enough) bignum.

>>> OTOH, "punishing" large buffers that have no long lines at all doesn't 
>>> strike me as a good balance.  Your proposed patch will solve a 
>>> particular use case, but it cannot solve all of them.
>>
>> Indeed, by definition no heuristic can solve all problems.
>
> I'm proposing what should be a better heuristic.
>

As far as I can tell, there are two possible ways to catch such 
situations:

1. The first one is to _not_ use a heuristic, and to check in _each_ 
redisplay cycle whether a certain portion of the buffer around point 
contains long lines.  This adds a fixed cost to all calls to redisplay, 
which four months ago did not seem TRT to do.

2. The second one is to use a heuristic, which is what we do now, and to 
check from time to time, when the buffer contents have changed "enough", 
whether the buffer now contains long lines.  When the buffer is edited 
with small changes between each redisplay cycle, which is what happens in 
the vast majority of cases, using that heuristic adds _no_ cost whatsoever 
to calls to redisplay.  The cost is added to only a few calls to 
redisplay, and it is not fixed anymore, it is more important for a large 
buffer than for a small one.  Doing that seemed TRT four months ago.

>
> That benchmark is an example of many use cases that can happen in real 
> life, in a large buffer with no long lines and a lot of editing 
> activity.  I'm surprised you don't see it.
>

I don't see it, indeed.  And I'm surprised that nobody complained about it 
during the last four months.  Do you have a recipe with which I could see 
that effect?  I just tried to edit dictionary-pp.json "heavily" (large 
kills and yanks), and Emacs remained responsive, I did not experience any 
hiccups.  Neither with emacs -Q nor with my config.  (Of course, that was 
with the patch applied.)

>
> The main issue at hand is how to avoid needless scanning of the entire 
> buffer for long lines, something which doesn't scale well with buffer 
> size. For very large buffers without any long lines, this is a 
> regression in Emacs 29, because Emacs 28 didn't do that.  IOW, we make 
> "good" buffers suffer because of the (rare) danger presented by 
> potentially "bad" buffers.  We need to look for ways of making this 
> degradation as small and as rare as possible.
>

Yes, it's a compromise.  As I explained above, the only other possible 
compromise that is safe enough is to make _all_ buffers "suffer" (but 
suffer less).

^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: locked narrowing
  2022-12-01 20:49                                                                                                                                                                                                 ` Gregory Heytings
@ 2022-12-01 20:52                                                                                                                                                                                                   ` Gregory Heytings
  2022-12-01 21:14                                                                                                                                                                                                   ` Eli Zaretskii
  2022-12-01 21:15                                                                                                                                                                                                   ` Gregory Heytings
  2 siblings, 0 replies; 685+ messages in thread
From: Gregory Heytings @ 2022-12-01 20:52 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, monnier, dgutov


>
> And I do agree that it's less common in real life to have long lines in 
> comint buffers than to open files with long lines.
>

I meant: I do not agree.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: locked narrowing
  2022-12-01 20:49                                                                                                                                                                                                 ` Gregory Heytings
  2022-12-01 20:52                                                                                                                                                                                                   ` Gregory Heytings
@ 2022-12-01 21:14                                                                                                                                                                                                   ` Eli Zaretskii
  2022-12-01 21:36                                                                                                                                                                                                     ` Gregory Heytings
  2022-12-01 21:15                                                                                                                                                                                                   ` Gregory Heytings
  2 siblings, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-12-01 21:14 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, monnier, dgutov

> Date: Thu, 01 Dec 2022 20:49:18 +0000
> From: Gregory Heytings <gregory@heytings.org>
> cc: 56682@debbugs.gnu.org, monnier@iro.umontreal.ca, dgutov@yandex.ru
> 
> 1. M-: (let ((large-file-warning-threshold nil)) (find-file "dictionary.json") (narrow-to-region 4000000 4004000)) RET
> 2. C-x n w
> 3. Kaboom!

By "Kaboom!" you mean what? a crash?  Because it doesn't crash here.  This
is a build from the latest emacs-29 branch.

> As far as I can tell, there are two possible ways to catch such 
> situations:
> 
> 1. The first one is to _not_ use a heuristic, and to check in _each_ 
> redisplay cycle whether a certain portion of the buffer around point 
> contains long lines.  This adds a fixed cost to all calls to redisplay, 
> which four months ago did not seem TRT to do.
> 
> 2. The second one is to use a heuristic, which is what we do now, and to 
> check from time to time, when the buffer contents have changed "enough", 
> whether the buffer now contains long lines.  When the buffer is edited 
> with small changes between each redisplay cycle, which is what happens in 
> the vast majority of cases, using that heuristic adds _no_ cost whatsoever 
> to calls to redisplay.  The cost is added to only a few calls to 
> redisplay, and it is not fixed anymore, it is more important for a large 
> buffer than for a small one.  Doing that seemed TRT four months ago.

This is all beyond argument.  We do want the heuristic.  I just want it to
be cheaper than it is now, especially for buffers without any long lines,
where each time we run this loop we waste CPU cycles.  So I'm looking for
ways of wasting less of them.

> > That benchmark is an example of many use cases that can happen in real 
> > life, in a large buffer with no long lines and a lot of editing 
> > activity.  I'm surprised you don't see it.
> 
> I don't see it, indeed.  And I'm surprised that nobody complained about it 
> during the last four months.

Very large buffers are relatively rare, so I'm not surprised we didn't hear
about this until now.  But it is very easy to come up with a situation where
this happens, so we don't need to wait for complaints to know that they can
exist.

> Do you have a recipe with which I could see that effect?  I just tried to
> edit dictionary-pp.json "heavily" (large kills and yanks), and Emacs
> remained responsive, I did not experience any hiccups.

Edit large enough buffer, and the time it takes to run the loop which scans
the entire buffer will eventually cross the threshold of human perception.
dictionary-pp.json is just 28MB, which is not large enough.  Make a 500MB
file or even 2GB file, and I think you will see the effect.  Better yet,
time the loop for a large enough buffer, and we will be able to estimate the
time it takes for arbitrary buffer sizes with "reasonable" line length,
because that loop scales approximately linearly with the buffer size and the
number of newlines.

> > The main issue at hand is how to avoid needless scanning of the entire 
> > buffer for long lines, something which doesn't scale well with buffer 
> > size. For very large buffers without any long lines, this is a 
> > regression in Emacs 29, because Emacs 28 didn't do that.  IOW, we make 
> > "good" buffers suffer because of the (rare) danger presented by 
> > potentially "bad" buffers.  We need to look for ways of making this 
> > degradation as small and as rare as possible.
> 
> Yes, it's a compromise.  As I explained above, the only other possible 
> compromise that is safe enough is to make _all_ buffers "suffer" (but 
> suffer less).

I'm trying to find a better compromise, in the hope that one exists.  No
more, no less.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: locked narrowing
  2022-12-01 20:49                                                                                                                                                                                                 ` Gregory Heytings
  2022-12-01 20:52                                                                                                                                                                                                   ` Gregory Heytings
  2022-12-01 21:14                                                                                                                                                                                                   ` Eli Zaretskii
@ 2022-12-01 21:15                                                                                                                                                                                                   ` Gregory Heytings
  2 siblings, 0 replies; 685+ messages in thread
From: Gregory Heytings @ 2022-12-01 21:15 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, monnier, dgutov


>
> Yes, it's a compromise.  As I explained above, the only other possible 
> compromise that is safe enough is to make _all_ buffers "suffer" (but 
> suffer less).
>

That's perhaps not clear enough, it would be better phrased as follows: 
"the only other possible compromise that is safe enough is to make _all_ 
buffers "suffer" (suffer more often, but suffer less than large buffers 
suffer with the alternative)".





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: locked narrowing
  2022-12-01 21:14                                                                                                                                                                                                   ` Eli Zaretskii
@ 2022-12-01 21:36                                                                                                                                                                                                     ` Gregory Heytings
  2022-12-01 21:43                                                                                                                                                                                                       ` Eli Zaretskii
  0 siblings, 1 reply; 685+ messages in thread
From: Gregory Heytings @ 2022-12-01 21:36 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, monnier, dgutov


>> 1. M-: (let ((large-file-warning-threshold nil)) (find-file "dictionary.json") (narrow-to-region 4000000 4004000)) RET
>> 2. C-x n w
>> 3. Kaboom!
>
> By "Kaboom!" you mean what? a crash?  Because it doesn't crash here. 
> This is a build from the latest emacs-29 branch.
>

I mean that Emacs is trapped in the long line problem again, don't you see 
it?

>
> This is all beyond argument.  We do want the heuristic.  I just want it 
> to be cheaper than it is now, especially for buffers without any long 
> lines, where each time we run this loop we waste CPU cycles.  So I'm 
> looking for ways of wasting less of them.
>

There are none, or at least none that I can see.  Your proposed heuristic 
to limit the scan to some portion of the buffer around point cannot work, 
precisely because the loop is not called during each redisplay cycle, but 
only from time to time.  See the example above.  Again, we cannot know 
what happened in the buffer between these two moments, which could be far 
away in time. We can either use a heuristic on the whole buffer, or not 
use a heuristic and scan only a portion of the buffer.  We cannot combine 
both, and use a heuristic on a portion of the buffer.  It would simply be 
too unsafe.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: locked narrowing
  2022-12-01 21:36                                                                                                                                                                                                     ` Gregory Heytings
@ 2022-12-01 21:43                                                                                                                                                                                                       ` Eli Zaretskii
  2022-12-01 22:05                                                                                                                                                                                                         ` dick
  2022-12-01 22:23                                                                                                                                                                                                         ` Gregory Heytings
  0 siblings, 2 replies; 685+ messages in thread
From: Eli Zaretskii @ 2022-12-01 21:43 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, monnier, dgutov

> Date: Thu, 01 Dec 2022 21:36:03 +0000
> From: Gregory Heytings <gregory@heytings.org>
> cc: 56682@debbugs.gnu.org, monnier@iro.umontreal.ca, dgutov@yandex.ru
> 
> 
> >> 1. M-: (let ((large-file-warning-threshold nil)) (find-file "dictionary.json") (narrow-to-region 4000000 4004000)) RET
> >> 2. C-x n w
> >> 3. Kaboom!
> >
> > By "Kaboom!" you mean what? a crash?  Because it doesn't crash here. 
> > This is a build from the latest emacs-29 branch.
> >
> 
> I mean that Emacs is trapped in the long line problem again, don't you see 
> it?

No, not in particular.  Maybe you use a different file?

But anyway, what exactly does this prove, and how?  I asked why we need to
look beyond the narrowing, so how does the above answer that question? what
am I missing?

> > This is all beyond argument.  We do want the heuristic.  I just want it 
> > to be cheaper than it is now, especially for buffers without any long 
> > lines, where each time we run this loop we waste CPU cycles.  So I'm 
> > looking for ways of wasting less of them.
> 
> There are none, or at least none that I can see.  Your proposed heuristic 
> to limit the scan to some portion of the buffer around point cannot work, 
> precisely because the loop is not called during each redisplay cycle, but 
> only from time to time.  See the example above.  Again, we cannot know 
> what happened in the buffer between these two moments, which could be far 
> away in time. We can either use a heuristic on the whole buffer, or not 
> use a heuristic and scan only a portion of the buffer.  We cannot combine 
> both, and use a heuristic on a portion of the buffer.  It would simply be 
> too unsafe.

I give up.  I will probably try to find time to code this myself, since you
don't even want to try.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: locked narrowing
  2022-12-01 21:43                                                                                                                                                                                                       ` Eli Zaretskii
@ 2022-12-01 22:05                                                                                                                                                                                                         ` dick
  2022-12-01 22:23                                                                                                                                                                                                         ` Gregory Heytings
  1 sibling, 0 replies; 685+ messages in thread
From: dick @ 2022-12-01 22:05 UTC (permalink / raw)
  Cc: 56682

EZ> I give up.  I will probably try to find time to code this myself,
EZ> since you don't even want to try.

That's unfair.  All narrowing guy does is try.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: locked narrowing
  2022-12-01 21:43                                                                                                                                                                                                       ` Eli Zaretskii
  2022-12-01 22:05                                                                                                                                                                                                         ` dick
@ 2022-12-01 22:23                                                                                                                                                                                                         ` Gregory Heytings
  2022-12-01 23:11                                                                                                                                                                                                           ` Gregory Heytings
  2022-12-02  7:05                                                                                                                                                                                                           ` Eli Zaretskii
  1 sibling, 2 replies; 685+ messages in thread
From: Gregory Heytings @ 2022-12-01 22:23 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, monnier, dgutov


>> I mean that Emacs is trapped in the long line problem again, don't you 
>> see it?
>
> No, not in particular.  Maybe you use a different file?
>

???  Did you try to edit the file after widening, or even just to move the 
cursor?  I'm using the same dictionary.json file we've been using.

>
> But anyway, what exactly does this prove, and how?  I asked why we need 
> to look beyond the narrowing, so how does the above answer that 
> question? what am I missing?
>

It proves that the long line detection loop must be executed on the whole 
buffer.  In this case there are no modifications to the buffer when it is 
widened, so the detection loop is not triggered, and because there was no 
long line in BEGV/ZV before widening Emacs did not activate the long line 
optimizations.

>
> I give up.  I will probably try to find time to code this myself, since 
> you don't even want to try.
>

Of course I'm willing to try.  But I already tried, I already explored the 
possibility you now consider, and concluded that it was not possible to do 
that.  I'm just trying to explain why and how I reached that conclusion. 
If you have other ideas, I'm all ears.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: locked narrowing
  2022-12-01 22:23                                                                                                                                                                                                         ` Gregory Heytings
@ 2022-12-01 23:11                                                                                                                                                                                                           ` Gregory Heytings
  2022-12-01 23:48                                                                                                                                                                                                             ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-12-02  7:05                                                                                                                                                                                                           ` Eli Zaretskii
  1 sibling, 1 reply; 685+ messages in thread
From: Gregory Heytings @ 2022-12-01 23:11 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, monnier, dgutov


>> I give up.  I will probably try to find time to code this myself, since 
>> you don't even want to try.
>
> Of course I'm willing to try.  But I already tried, I already explored 
> the possibility you now consider, and concluded that it was not possible 
> to do that.  I'm just trying to explain why and how I reached that 
> conclusion. If you have other ideas, I'm all ears.
>

What we could perhaps do is to use something like

CHARS_MODIFF - UNCHANGED_MODIFIED > 8 + log10 (buffer-size) / 2

That would mean that the detection loop is triggered less for larger 
buffers than for smaller ones, or IOW that bigger changes are needed to 
trigger the loop in larger buffers.  It's a bit unsafe, but probably safe 
enough in practice.

Would that fit the bill?





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: locked narrowing
  2022-12-01 23:11                                                                                                                                                                                                           ` Gregory Heytings
@ 2022-12-01 23:48                                                                                                                                                                                                             ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-12-02  0:24                                                                                                                                                                                                               ` Gregory Heytings
  2022-12-02  7:49                                                                                                                                                                                                               ` Eli Zaretskii
  0 siblings, 2 replies; 685+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2022-12-01 23:48 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, Eli Zaretskii, dgutov

Maybe another option is to do the scan more lazily, keeping track more
precisely of what was scanned and/or needs rescanning.

Do an initial scan on the whole buffer and after that keep a BEG..END
limit approximating the region that has been modified since the last scan.

As long as

   END - BEG < LINE_LENGTH_THRESHOLD - MAX_SEEN_LINE_LENGTH

then we know we don't need to rescan anything at all.  And when we do
need to rescan we can limit the scan to

   BEG - MAX_SEEN_LINE_LENGTH ... END + MAX_SEEN_LINE_LENGTH

I assume here that we would remember the MAX_SEEN_LINE_LENGTH.


        Stefan






^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: locked narrowing
  2022-12-01 23:48                                                                                                                                                                                                             ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2022-12-02  0:24                                                                                                                                                                                                               ` Gregory Heytings
  2022-12-02  2:52                                                                                                                                                                                                                 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-12-02  7:49                                                                                                                                                                                                               ` Eli Zaretskii
  1 sibling, 1 reply; 685+ messages in thread
From: Gregory Heytings @ 2022-12-02  0:24 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: 56682, Eli Zaretskii, dgutov


>
> Maybe another option is to do the scan more lazily, keeping track more 
> precisely of what was scanned and/or needs rescanning.
>

Thanks.  It's an option indeed, the problem here is how to keep track of 
what was scanned or needs rescanning.  I think doing that would probably 
need two markers for each buffer, say beg_scan_marker and end_scan_marker. 
An initial scan would set beg_scan_marker to Z and end_scan_marker to BEG. 
Then each operation in insdel.c would move beg_scan_marker downwards (if 
the buffer position at which the operation takes place is before the 
current value of beg_scan_marker) and end_scan_marker upwards (if the 
buffer position at which the operation takes place is after the current 
value of beg_scan_marker).  Then we would only need to scan 
beg_scan_marker - some_constant .. end_scan_marker + some_constant again.

That being said, I'm not sure the added complexity, to avoid small delays 
when performing large editing operations in huge buffers, is worth the 
price.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: locked narrowing
  2022-12-02  0:24                                                                                                                                                                                                               ` Gregory Heytings
@ 2022-12-02  2:52                                                                                                                                                                                                                 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-12-02  8:04                                                                                                                                                                                                                   ` Eli Zaretskii
  2022-12-02  8:54                                                                                                                                                                                                                   ` Gregory Heytings
  0 siblings, 2 replies; 685+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2022-12-02  2:52 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, Eli Zaretskii, dgutov

>> Maybe another option is to do the scan more lazily, keeping track more
>> precisely of what was scanned and/or needs rescanning.
> Thanks.  It's an option indeed, the problem here is how to keep track of
> what was scanned or needs rescanning.

My suggestion was to have as "steady state" that "everything is scanned
except for a region between BEG...END and no line was found to be larger
than MAX_SEEN_LINE_LENGTH".  So it requires keeping track of a BEG..END
(BEG can be an integer but END would likely be an (insert-before)
marker) plus an integer keeping track of MAX_SEEN_LINE_LENGTH.
Initially BEG is 1 and END is Z.

I can't think of a good way to detect when MAX_SEEN_LINE_LENGTH can be
made smaller, tho, so we might still need to rescan the whole buffer
every once in a blue moon.


        Stefan






^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: locked narrowing
  2022-12-01 22:23                                                                                                                                                                                                         ` Gregory Heytings
  2022-12-01 23:11                                                                                                                                                                                                           ` Gregory Heytings
@ 2022-12-02  7:05                                                                                                                                                                                                           ` Eli Zaretskii
  2022-12-02  7:56                                                                                                                                                                                                             ` Gregory Heytings
  1 sibling, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-12-02  7:05 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, monnier, dgutov

> Date: Thu, 01 Dec 2022 22:23:38 +0000
> From: Gregory Heytings <gregory@heytings.org>
> cc: 56682@debbugs.gnu.org, monnier@iro.umontreal.ca, dgutov@yandex.ru
> 
> > But anyway, what exactly does this prove, and how?  I asked why we need 
> > to look beyond the narrowing, so how does the above answer that 
> > question? what am I missing?
> 
> It proves that the long line detection loop must be executed on the whole 
> buffer.

No, it doesn't.  It shows that the conditions to re-examine buffer text are
incomplete and need to be augmented.

> In this case there are no modifications to the buffer when it is 
> widened, so the detection loop is not triggered, and because there was no 
> long line in BEGV/ZV before widening Emacs did not activate the long line 
> optimizations.

You didn't explain the problem clearly enough, so I didn't understand it
originally.  The actual problem is not that the restriction changes since
the last redisplay, the problem is that the restriction changes _and_ the
number of unsaved buffer text modifications is still below the threshold of
8.

Once I understood the scenario, the fix was a simple one-liner, which I
installed yesterday night.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: locked narrowing
  2022-12-01 23:48                                                                                                                                                                                                             ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-12-02  0:24                                                                                                                                                                                                               ` Gregory Heytings
@ 2022-12-02  7:49                                                                                                                                                                                                               ` Eli Zaretskii
  2022-12-02  8:04                                                                                                                                                                                                                 ` Gregory Heytings
  1 sibling, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-12-02  7:49 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: 56682, gregory, dgutov

> From: Stefan Monnier <monnier@iro.umontreal.ca>
> Cc: Eli Zaretskii <eliz@gnu.org>,  56682@debbugs.gnu.org,  dgutov@yandex.ru
> Date: Thu, 01 Dec 2022 18:48:26 -0500
> 
> Do an initial scan on the whole buffer and after that keep a BEG..END
> limit approximating the region that has been modified since the last scan.

We currently don't have any way of telling what was modified since the last
scan.

> As long as
> 
>    END - BEG < LINE_LENGTH_THRESHOLD - MAX_SEEN_LINE_LENGTH
> 
> then we know we don't need to rescan anything at all.  And when we do
> need to rescan we can limit the scan to
> 
>    BEG - MAX_SEEN_LINE_LENGTH ... END + MAX_SEEN_LINE_LENGTH
> 
> I assume here that we would remember the MAX_SEEN_LINE_LENGTH.

I hope we can come up with a less complicated scheme.

We only need to know whether there are long lines in a region around point
that is large enough to make sure redisplay won't look beyond that.
(Gregory disagrees, but I have yet to see a reason why he would be right and
I would be wrong in this matter.)  We know where the window's point was at
the time of the last redisplay, so we can detect when point moves "too far",
and trigger rescanning of the region around the new location of point --
this should be a condition in addition to those that currently guard the
rescanning loop.

Given the above, if the region we actually scan is not the entire BEGV..ZV
one, but has its size limited from above by some fixed value, the scanning
should scale much better for very large buffers, because the scanning loop
will never run more than a fixed upper bound of time.  The limit on the
region can be large enough to be safe, because the scan is very fast.  So
only extremely large buffers will not have all of their accessible portion
scanned, which is consistent with other measures we take to limit
potentially long processing using more or less arbitrary limits, like
syntax-wholeline-max, MAX_PARAGRAPH_SEARCH in bidi.c etc.  The result is
potential inaccuracy and/or degradation, but only in very rare cases.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: locked narrowing
  2022-12-02  7:05                                                                                                                                                                                                           ` Eli Zaretskii
@ 2022-12-02  7:56                                                                                                                                                                                                             ` Gregory Heytings
  2022-12-02  8:51                                                                                                                                                                                                               ` Eli Zaretskii
  0 siblings, 1 reply; 685+ messages in thread
From: Gregory Heytings @ 2022-12-02  7:56 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, monnier, dgutov


>> It proves that the long line detection loop must be executed on the 
>> whole buffer.
>
> No, it doesn't.  It shows that the conditions to re-examine buffer text 
> are incomplete and need to be augmented.
>

It does, and it's just an example of the general point I'm (apparently 
unsuccessfully) trying to convey: when redisplay is called, any kind of 
changes may have been made in the buffer at any point since last 
redisplay, and we cannot know where these changes occurred.  Stefan's 
proposed approach looks promising, however.

>> In this case there are no modifications to the buffer when it is 
>> widened, so the detection loop is not triggered, and because there was 
>> no long line in BEGV/ZV before widening Emacs did not activate the long 
>> line optimizations.
>
> You didn't explain the problem clearly enough, so I didn't understand it 
> originally.  The actual problem is not that the restriction changes 
> since the last redisplay, the problem is that the restriction changes 
> _and_ the number of unsaved buffer text modifications is still below the 
> threshold of 8.
>
> Once I understood the scenario, the fix was a simple one-liner, which I 
> installed yesterday night.
>

That fix is wrong, sorry.  Now the detection loop is triggered each time 
the user changes the narrowing, in the vast majority of cases for no good 
reason.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: locked narrowing
  2022-12-02  7:49                                                                                                                                                                                                               ` Eli Zaretskii
@ 2022-12-02  8:04                                                                                                                                                                                                                 ` Gregory Heytings
  2022-12-02  8:57                                                                                                                                                                                                                   ` Eli Zaretskii
  0 siblings, 1 reply; 685+ messages in thread
From: Gregory Heytings @ 2022-12-02  8:04 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, Stefan Monnier, dgutov


>
> We only need to know whether there are long lines in a region around 
> point that is large enough to make sure redisplay won't look beyond 
> that.
>

Sorry, but no, we don't.

>
> (Gregory disagrees, but I have yet to see a reason why he would be right 
> and I would be wrong in this matter.)
>

Consider this other scenario.  A buffer is buried, and modified in the 
background by some process.  That process adds a long line in that buffer, 
followed by enough non-long lines, with point after these non-long lines. 
Now the user asks for that buffer to be displayed again.  With your 
proposed approach, we would search around point if there are long lines. 
There aren't, so we do not activate long line optimizations.  Now the user 
scrolls the buffer.  The buffer has not changed in any way, so the 
detection is not triggered, and we reach the long line.  Kaboom!





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: locked narrowing
  2022-12-02  2:52                                                                                                                                                                                                                 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2022-12-02  8:04                                                                                                                                                                                                                   ` Eli Zaretskii
  2022-12-02  8:08                                                                                                                                                                                                                     ` Gregory Heytings
  2022-12-02 14:10                                                                                                                                                                                                                     ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-12-02  8:54                                                                                                                                                                                                                   ` Gregory Heytings
  1 sibling, 2 replies; 685+ messages in thread
From: Eli Zaretskii @ 2022-12-02  8:04 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: 56682, gregory, dgutov

> From: Stefan Monnier <monnier@iro.umontreal.ca>
> Cc: 56682@debbugs.gnu.org,  Eli Zaretskii <eliz@gnu.org>,  dgutov@yandex.ru
> Date: Thu, 01 Dec 2022 21:52:03 -0500
> 
> My suggestion was to have as "steady state" that "everything is scanned
> except for a region between BEG...END and no line was found to be larger
> than MAX_SEEN_LINE_LENGTH".  So it requires keeping track of a BEG..END
> (BEG can be an integer but END would likely be an (insert-before)
> marker) plus an integer keeping track of MAX_SEEN_LINE_LENGTH.
> Initially BEG is 1 and END is Z.

I don't understand how you keep track of BEG and END, in general.  E.g.,
deletion of a single character can in some cases reset BEG to 1 and END to
Z, right?

> I can't think of a good way to detect when MAX_SEEN_LINE_LENGTH can be
> made smaller, tho, so we might still need to rescan the whole buffer
> every once in a blue moon.

That, too, is a complication.  Once again, there's absolutely no reason to
scan more than a limited region around point where redisplay is likely to
look.  Scanning the entire buffer is a waste, and can potentially degrade
performance in very large buffers without any long lines.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: locked narrowing
  2022-12-02  8:04                                                                                                                                                                                                                   ` Eli Zaretskii
@ 2022-12-02  8:08                                                                                                                                                                                                                     ` Gregory Heytings
  2022-12-02 14:10                                                                                                                                                                                                                     ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  1 sibling, 0 replies; 685+ messages in thread
From: Gregory Heytings @ 2022-12-02  8:08 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, Stefan Monnier, dgutov


>
> Once again, there's absolutely no reason to scan more than a limited 
> region around point where redisplay is likely to look.
>

That's correct if, and only if, we do that scan each time redisplay is 
called.  If we do that only from time to time, based on some heuristics, 
it is not correct anymore, as I explained repeatedly.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: locked narrowing
  2022-12-02  7:56                                                                                                                                                                                                             ` Gregory Heytings
@ 2022-12-02  8:51                                                                                                                                                                                                               ` Eli Zaretskii
  2022-12-02  9:14                                                                                                                                                                                                                 ` Gregory Heytings
  0 siblings, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-12-02  8:51 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, monnier, dgutov

> Date: Fri, 02 Dec 2022 07:56:06 +0000
> From: Gregory Heytings <gregory@heytings.org>
> cc: 56682@debbugs.gnu.org, monnier@iro.umontreal.ca, dgutov@yandex.ru
> 
> >> It proves that the long line detection loop must be executed on the 
> >> whole buffer.
> >
> > No, it doesn't.  It shows that the conditions to re-examine buffer text 
> > are incomplete and need to be augmented.
> 
> It does, and it's just an example of the general point I'm (apparently 
> unsuccessfully) trying to convey: when redisplay is called, any kind of 
> changes may have been made in the buffer at any point since last 
> redisplay, and we cannot know where these changes occurred.

Not _any_ kind of changes, no.  Only a few that we know about and track,
because redisplay needs to know about them.

> Stefan's proposed approach looks promising, however.

I explained why in my other messages why it sounds too complicated.

> > Once I understood the scenario, the fix was a simple one-liner, which I 
> > installed yesterday night.
> 
> That fix is wrong, sorry.  Now the detection loop is triggered each time 
> the user changes the narrowing, in the vast majority of cases for no good 
> reason.

The same will happen when the user types several characters.  Which happens
more frequently than changes of narrowing, in most use patterns.

And once again, you simply _cannot_ access buffer text beyond BEGV..ZV
safely.  It's a ticking time bomb if you do.

Anyway, let's stop here and agree to disagree.  I'm sorry, but I cannot
afford this endless argument; I'm swamped with too many tasks that no one
else except myself seems to be doing, and this argument already took an
inordinate amount of my time and energy.  Please install your
UNCHANGED_MODIFIED patch, and I will get to improving the scalability of the
scanning loop when I have time.  Please don't install any other changes in
this regard except that one patch.

Thanks.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: locked narrowing
  2022-12-02  2:52                                                                                                                                                                                                                 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-12-02  8:04                                                                                                                                                                                                                   ` Eli Zaretskii
@ 2022-12-02  8:54                                                                                                                                                                                                                   ` Gregory Heytings
  2022-12-02 14:13                                                                                                                                                                                                                     ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  1 sibling, 1 reply; 685+ messages in thread
From: Gregory Heytings @ 2022-12-02  8:54 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: 56682, Eli Zaretskii, dgutov


>>> Maybe another option is to do the scan more lazily, keeping track more
>>> precisely of what was scanned and/or needs rescanning.
>>
>> Thanks.  It's an option indeed, the problem here is how to keep track 
>> of what was scanned or needs rescanning.
>
> My suggestion was to have as "steady state" that "everything is scanned 
> except for a region between BEG...END and no line was found to be larger 
> than MAX_SEEN_LINE_LENGTH".  So it requires keeping track of a BEG..END 
> (BEG can be an integer but END would likely be an (insert-before) 
> marker) plus an integer keeping track of MAX_SEEN_LINE_LENGTH. Initially 
> BEG is 1 and END is Z.
>

I'm not sure I understand how that would work, concretely.  After the 
initial scan, we would have beg=BEG / end=Z.  Now the buffer is modified, 
say 1000 characters are added at position 1000 and 10000 characters are 
added at position 10000.  What would be the values of beg and end after 
these two operations?  The two portions of the buffer that did not change 
are BEG .. 1000 and 20000 .. Z, so it seems to me that it's better to keep 
track of the portion of the buffer that did change, in this case 1000 .. 
20000.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: locked narrowing
  2022-12-02  8:04                                                                                                                                                                                                                 ` Gregory Heytings
@ 2022-12-02  8:57                                                                                                                                                                                                                   ` Eli Zaretskii
  2022-12-02  9:16                                                                                                                                                                                                                     ` Gregory Heytings
  0 siblings, 1 reply; 685+ messages in thread
From: Eli Zaretskii @ 2022-12-02  8:57 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, monnier, dgutov

> Date: Fri, 02 Dec 2022 08:04:06 +0000
> From: Gregory Heytings <gregory@heytings.org>
> cc: Stefan Monnier <monnier@iro.umontreal.ca>, 56682@debbugs.gnu.org, 
>     dgutov@yandex.ru
> 
> Consider this other scenario.  A buffer is buried, and modified in the 
> background by some process.  That process adds a long line in that buffer, 
> followed by enough non-long lines, with point after these non-long lines. 
> Now the user asks for that buffer to be displayed again.  With your 
> proposed approach, we would search around point if there are long lines. 
> There aren't, so we do not activate long line optimizations.  Now the user 
> scrolls the buffer.  The buffer has not changed in any way, so the 
> detection is not triggered, and we reach the long line.  Kaboom!

No "Kaboom!": when the user scrolls the buffer, point moves, so we can
detect that and trigger rescanning.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: locked narrowing
  2022-12-02  8:51                                                                                                                                                                                                               ` Eli Zaretskii
@ 2022-12-02  9:14                                                                                                                                                                                                                 ` Gregory Heytings
  0 siblings, 0 replies; 685+ messages in thread
From: Gregory Heytings @ 2022-12-02  9:14 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, monnier, dgutov


>> Stefan's proposed approach looks promising, however.
>
> I explained why in my other messages why it sounds too complicated.
>

Yet it's AFAICS the only possible approach that was proposed so far.

>> That fix is wrong, sorry.  Now the detection loop is triggered each 
>> time the user changes the narrowing, in the vast majority of cases for 
>> no good reason.
>
> The same will happen when the user types several characters.  Which 
> happens more frequently than changes of narrowing, in most use patterns.
>

The change is wrong nonetheless.  It's a local fix to circumvent an 
example scenario I gave, which was just that: an example.  Many other 
scenarios remain.

>
> And once again, you simply _cannot_ access buffer text beyond BEGV..ZV 
> safely.  It's a ticking time bomb if you do.
>

I already said I agree with that.  I only said (before Stefan proposed a 
potential solution) that I did not see a better way to handle that 
situation.

>
> I'm sorry, but I cannot afford this endless argument; I'm swamped with 
> too many tasks that no one else except myself seems to be doing, and 
> this argument already took an inordinate amount of my time and energy.
>
> Please install your UNCHANGED_MODIFIED patch, and I will get to 
> improving the scalability of the scanning loop when I have time. Please 
> don't install any other changes in this regard except that one patch.
>

Are you serious???  I mean, I've been spending an inordinate amount of my 
time to fix that long line problem, I think I now have a certain expertise 
in that area, I'm trying to find a way to improve these heuristics, you 
dismiss what I'm telling you, and now you tell me that you have too many 
tasks on your plate and that you nonetheless want to improve these 
heuristics yourself and that I should stop working on this???





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: locked narrowing
  2022-12-02  8:57                                                                                                                                                                                                                   ` Eli Zaretskii
@ 2022-12-02  9:16                                                                                                                                                                                                                     ` Gregory Heytings
  2022-12-02 12:02                                                                                                                                                                                                                       ` Eli Zaretskii
  0 siblings, 1 reply; 685+ messages in thread
From: Gregory Heytings @ 2022-12-02  9:16 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, monnier, dgutov


>> Consider this other scenario.  A buffer is buried, and modified in the 
>> background by some process.  That process adds a long line in that 
>> buffer, followed by enough non-long lines, with point after these 
>> non-long lines. Now the user asks for that buffer to be displayed 
>> again.  With your proposed approach, we would search around point if 
>> there are long lines. There aren't, so we do not activate long line 
>> optimizations.  Now the user scrolls the buffer.  The buffer has not 
>> changed in any way, so the detection is not triggered, and we reach the 
>> long line.  Kaboom!
>
> No "Kaboom!": when the user scrolls the buffer, point moves, so we can 
> detect that and trigger rescanning.
>

In which case we are back to the alternative solution, which is to trigger 
rescanning on each redisplay cycle.  Which might, after all, be the 
simplest and safest solution.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: locked narrowing
  2022-12-02  9:16                                                                                                                                                                                                                     ` Gregory Heytings
@ 2022-12-02 12:02                                                                                                                                                                                                                       ` Eli Zaretskii
  0 siblings, 0 replies; 685+ messages in thread
From: Eli Zaretskii @ 2022-12-02 12:02 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, monnier, dgutov

> Date: Fri, 02 Dec 2022 09:16:08 +0000
> From: Gregory Heytings <gregory@heytings.org>
> cc: monnier@iro.umontreal.ca, 56682@debbugs.gnu.org, dgutov@yandex.ru
> 
> In which case we are back to the alternative solution, which is to trigger 
> rescanning on each redisplay cycle.  Which might, after all, be the 
> simplest and safest solution.

If the region we scan is limited by some reasonably large size, that could
indeed be the best solution.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: locked narrowing
  2022-12-02  8:04                                                                                                                                                                                                                   ` Eli Zaretskii
  2022-12-02  8:08                                                                                                                                                                                                                     ` Gregory Heytings
@ 2022-12-02 14:10                                                                                                                                                                                                                     ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  1 sibling, 0 replies; 685+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2022-12-02 14:10 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56682, gregory, dgutov

>> My suggestion was to have as "steady state" that "everything is scanned
>> except for a region between BEG...END and no line was found to be larger
>> than MAX_SEEN_LINE_LENGTH".  So it requires keeping track of a BEG..END
>> (BEG can be an integer but END would likely be an (insert-before)
>> marker) plus an integer keeping track of MAX_SEEN_LINE_LENGTH.
>> Initially BEG is 1 and END is Z.
>
> I don't understand how you keep track of BEG and END, in general.

Every buffer modification updates it.

> E.g., deletion of a single character can in some cases reset BEG to
> 1 and END to Z, right?

No, why would you think so?
Any change at position POS would set BEG to (min BEG POS) and END to (max
END POS) (modulo marker-position updates for END).

I now realize that a deletion can increase line length by removing LF
chars, so the condition I proposed to decide when a rescan is needed
would need to be adjusted, but the basic idea still stands.

>> I can't think of a good way to detect when MAX_SEEN_LINE_LENGTH can be
>> made smaller, tho, so we might still need to rescan the whole buffer
>> every once in a blue moon.
> That, too, is a complication.

For the 99% of the buffers the MAX_SEEN_LINE_LENGTH should stay small
"for ever" so it's probably not a big issue.

> Once again, there's absolutely no reason to scan more than a limited
> region around point where redisplay is likely to look.

Indeed, that's another possible approach.

> Scanning the entire buffer is a waste, and can potentially degrade
> performance in very large buffers without any long lines.

The full-buffer scan would only be needed once when inserting the file
into the buffer, so it's not clear it would degrade performance in any
significant way, but if needed we can make it more lazy by keeping track
(in addition to the "beg..end of not yet scanned changes") of the
"beg..end of region already scanned" so we only scan the part of the
buffer actually visited (which will still degenerate to "the whole
buffer" if we display BOB and then EOB, of course, as usual).


        Stefan






^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: locked narrowing
  2022-12-02  8:54                                                                                                                                                                                                                   ` Gregory Heytings
@ 2022-12-02 14:13                                                                                                                                                                                                                     ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
  0 siblings, 0 replies; 685+ messages in thread
From: Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2022-12-02 14:13 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, Eli Zaretskii, dgutov

> I'm not sure I understand how that would work, concretely.  After the
> initial scan, we would have beg=BEG / end=Z.

No, after the initial the BEG..END region would be empty (since
BEG..END represents the part of the buffer *not yet* scanned).

> Now the buffer is modified,
> say 1000 characters are added at position 1000 and 10000 characters are
> added at position 10000.  What would be the values of beg and end after
> these two operations?

BEG=1000 and END=20000.

> The two portions of the buffer that did not change are BEG .. 1000 and
> 20000 .. Z, so it seems to me that it's better to keep track of the
> portion of the buffer that did change, in this case 1000 .. 20000.

That's exactly what I'm suggesting.


        Stefan






^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: locked narrowing
  2022-11-30 16:34                                                                                                                                                                     ` Juri Linkov
  2022-11-30 17:34                                                                                                                                                                       ` Eli Zaretskii
@ 2022-12-06 17:14                                                                                                                                                                       ` Juri Linkov
  2022-12-06 20:11                                                                                                                                                                         ` Gregory Heytings
  1 sibling, 1 reply; 685+ messages in thread
From: Juri Linkov @ 2022-12-06 17:14 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, Eli Zaretskii, Stefan Monnier, Dmitry Gutov

> 2. after starting Isearch at a large column number,
>    Emacs hangs up indefinitely, e.g. with
>    'M-g TAB 10000000 RET C-s' then even C-g doesn't get out.
>    Debugging shows that the problem is in 'isearch-update'
>    where the call to 'pos-visible-in-window-group-p' doesn't return.
>    When this call is removed, the search is instantaneous.

There is another side-effect: after evaluating manually
'M-: (pos-visible-in-window-p) RET' at the position 1000000,
point moves to the position 749873 afterwards.  It seems
this is related to locked narrowing, because point doesn't jump
after customizing long-line-locked-narrowing-region-size to 0.





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: locked narrowing
  2022-12-06 17:14                                                                                                                                                                       ` Juri Linkov
@ 2022-12-06 20:11                                                                                                                                                                         ` Gregory Heytings
  2022-12-07  7:52                                                                                                                                                                           ` Juri Linkov
  0 siblings, 1 reply; 685+ messages in thread
From: Gregory Heytings @ 2022-12-06 20:11 UTC (permalink / raw)
  To: Juri Linkov; +Cc: 56682, Eli Zaretskii, Stefan Monnier, Dmitry Gutov


>
> There is another side-effect: after evaluating manually 'M-: 
> (pos-visible-in-window-p) RET' at the position 1000000, point moves to 
> the position 749873 afterwards.  It seems this is related to locked 
> narrowing, because point doesn't jump after customizing 
> long-line-locked-narrowing-region-size to 0.
>

I cannot reproduce that.  With the following recipe:

emacs -Q
C-x C-f dictionary.json RET
M-g c 1000000 RET
M-: (pos-visible-in-window-p) RET

point does not move.  Is there something missing in that recipe?





^ permalink raw reply	[flat|nested] 685+ messages in thread

* bug#56682: locked narrowing
  2022-12-06 20:11                                                                                                                                                                         ` Gregory Heytings
@ 2022-12-07  7:52                                                                                                                                                                           ` Juri Linkov
  0 siblings, 0 replies; 685+ messages in thread
From: Juri Linkov @ 2022-12-07  7:52 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: 56682, Eli Zaretskii, Stefan Monnier, Dmitry Gutov

>> There is another side-effect: after evaluating manually 'M-:
>> (pos-visible-in-window-p) RET' at the position 1000000, point moves to
>> the position 749873 afterwards.  It seems this is related to locked
>> narrowing, because point doesn't jump after customizing
>> long-line-locked-narrowing-region-size to 0.
>
> I cannot reproduce that.  With the following recipe:
>
> emacs -Q
> C-x C-f dictionary.json RET
> M-g c 1000000 RET
> M-: (pos-visible-in-window-p) RET
>
> point does not move.  Is there something missing in that recipe?

The prerequisite is this setting:

  (add-hook 'find-file-hook 'toggle-truncate-lines)





^ permalink raw reply	[flat|nested] 685+ messages in thread

end of thread, other threads:[~2022-12-07  7:52 UTC | newest]

Thread overview: 685+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-07-21 18:00 bug#56682: Fix the long lines font locking related slowdowns Gregory Heytings
2022-07-21 18:04 ` Eli Zaretskii
2022-07-22 10:16   ` Gregory Heytings
2022-07-22 14:11     ` Eli Zaretskii
2022-07-22 14:44       ` Lars Ingebrigtsen
2022-07-25 20:59         ` Gregory Heytings
2022-07-22 14:51     ` Eli Zaretskii
2022-07-22 15:06       ` Eli Zaretskii
2022-07-22 19:25         ` Eli Zaretskii
2022-07-23  6:10     ` Eli Zaretskii
2022-07-23  7:07       ` Gerd Möllmann
2022-07-23  7:12         ` Eli Zaretskii
2022-07-23  7:30           ` Gerd Möllmann
2022-07-23  7:18         ` Gerd Möllmann
2022-07-23  8:00           ` Gerd Möllmann
2022-07-23  8:04             ` Gerd Möllmann
2022-07-23  8:11               ` Gerd Möllmann
2022-07-23 13:42                 ` Eli Zaretskii
2022-07-23 14:25                   ` Gerd Möllmann
2022-07-23 14:33                     ` Gerd Möllmann
2022-07-23 15:43                       ` Eli Zaretskii
2022-07-23 14:35                     ` Visuwesh
2022-07-23 14:46                       ` Gerd Möllmann
2022-07-23 15:01                         ` Gerd Möllmann
2022-07-23 16:02                           ` Eli Zaretskii
2022-07-23 17:23                             ` Gerd Möllmann
2022-07-23 17:44                               ` Eli Zaretskii
2022-07-23 17:49                                 ` Eli Zaretskii
2022-07-23 17:59                                   ` Eli Zaretskii
2022-07-24  6:16                                     ` Gerd Möllmann
2022-07-24  6:52                                       ` Eli Zaretskii
2022-07-24 14:36                                         ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-07-24 15:07                                           ` Eli Zaretskii
2022-07-24 15:48                                             ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-07-24 16:18                                               ` Eli Zaretskii
2022-07-24 16:26                                               ` Lars Ingebrigtsen
2022-07-24 16:33                                                 ` Eli Zaretskii
2022-07-24 14:34                                       ` bug#56682: Interval tree balance (was: Fix the long lines font locking related slowdowns) Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-07-24 15:47                                         ` bug#56682: Interval tree balance Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-07-25  6:23                                         ` bug#56682: Fix the long lines font locking related slowdowns Gerd Möllmann
2022-07-25 20:49                                           ` Gregory Heytings
2022-07-26  6:32                                             ` Gerd Möllmann
2022-07-26  6:53                                               ` Gregory Heytings
2022-07-23 14:35                     ` Gerd Möllmann
2022-07-23 14:47                   ` Eli Zaretskii
2022-07-23 15:04                   ` Gerd Möllmann
2022-07-23 16:03                     ` Eli Zaretskii
2022-07-25 21:47                   ` Gregory Heytings
2022-07-26  6:51                     ` Gerd Möllmann
2022-07-26  7:08                       ` Gerd Möllmann
2022-07-26 12:12                       ` Eli Zaretskii
2022-07-26 12:22                         ` Gerd Möllmann
2022-07-26 11:37                     ` Eli Zaretskii
2022-07-26 11:53                       ` Gregory Heytings
2022-07-26 12:09                         ` Eli Zaretskii
2022-07-26 12:34                           ` Gregory Heytings
2022-07-26 12:41                             ` Eli Zaretskii
2022-07-26 13:08                               ` Gerd Möllmann
2022-07-26 17:29                                 ` Eli Zaretskii
2022-07-26 17:46                               ` Eli Zaretskii
2022-07-26 20:55                                 ` Gregory Heytings
2022-07-27  2:41                                   ` Eli Zaretskii
2022-07-27  7:08                                     ` Gregory Heytings
2022-07-27  2:33                                 ` Eli Zaretskii
2022-07-27  6:24                                   ` Gerd Möllmann
2022-07-27 17:26                                     ` Eli Zaretskii
2022-07-28 16:29                                       ` Gregory Heytings
2022-07-28 16:42                                         ` Gregory Heytings
2022-07-28 16:48                                         ` Eli Zaretskii
2022-07-28 17:16                                           ` Gregory Heytings
2022-07-28 17:44                                             ` Eli Zaretskii
2022-07-28 18:40                                               ` Gregory Heytings
2022-07-28 18:57                                                 ` Eli Zaretskii
2022-07-28 21:31                                                   ` Gregory Heytings
2022-07-29  7:12                                                     ` Eli Zaretskii
2022-07-29  8:33                                                       ` Gregory Heytings
2022-07-29 10:29                                                         ` Eli Zaretskii
2022-07-29 10:44                                                           ` Gregory Heytings
2022-07-29 10:53                                                             ` Eli Zaretskii
2022-07-29 11:03                                                               ` Gregory Heytings
     [not found]                                                           ` <19e5f0b3-c259-79f5-c31-469e8dfaf193@heytings.org>
2022-07-29 10:50                                                             ` Gregory Heytings
2022-07-29 11:16                                                               ` Eli Zaretskii
2022-07-29 12:05                                                                 ` Gregory Heytings
2022-07-29 12:36                                                                   ` Eli Zaretskii
2022-07-29 13:27                                                         ` Eli Zaretskii
2022-07-29 13:58                                                           ` Eli Zaretskii
2022-07-29 15:35                                                             ` Gregory Heytings
2022-07-29 15:19                                                           ` Gregory Heytings
2022-07-29 15:35                                                             ` Eli Zaretskii
2022-07-29 16:37                                                               ` Gregory Heytings
2022-07-29 18:09                                                                 ` Eli Zaretskii
2022-07-29 18:27                                                                   ` Gregory Heytings
2022-07-29 20:48                                                                     ` Gregory Heytings
2022-07-29 20:02                                                                   ` Gregory Heytings
2022-07-30  9:05                                                                     ` Eli Zaretskii
2022-07-30 11:34                                                                       ` Gregory Heytings
2022-07-30 13:18                                                                         ` Eli Zaretskii
2022-07-30 13:31                                                                           ` Gregory Heytings
2022-07-30 15:23                                                                             ` Eli Zaretskii
2022-07-30 18:13                                                                               ` Gregory Heytings
2022-07-30 18:34                                                                                 ` Eli Zaretskii
2022-07-30 18:47                                                                                   ` Gregory Heytings
2022-07-30 19:02                                                                                     ` Eli Zaretskii
2022-07-30 19:11                                                                                       ` Gregory Heytings
2022-07-31  6:16                                                                                         ` Eli Zaretskii
2022-07-31  8:22                                                                                           ` Lars Ingebrigtsen
2022-07-31  8:38                                                                                             ` Eli Zaretskii
2022-07-31  8:41                                                                                               ` Lars Ingebrigtsen
2022-07-31 22:45                                                                                                 ` Gregory Heytings
2022-07-31  8:30                                                                                           ` Gregory Heytings
2022-07-31  9:04                                                                                             ` Eli Zaretskii
2022-07-31 14:09                                                                                               ` Gregory Heytings
2022-07-31  7:11                                                                               ` Eli Zaretskii
2022-07-31 22:54                                                                                 ` Gregory Heytings
2022-08-01 12:38                                                                                   ` Eli Zaretskii
2022-08-01 12:51                                                                                     ` Gregory Heytings
2022-08-01 13:13                                                                                       ` Eli Zaretskii
2022-08-01 13:30                                                                                         ` Gregory Heytings
2022-08-01 13:24                                                                                       ` Eli Zaretskii
2022-08-01 13:38                                                                                         ` Gregory Heytings
2022-08-01 13:45                                                                                         ` Eli Zaretskii
2022-08-01 15:08                                                                                           ` Gregory Heytings
2022-08-01 15:49                                                                                             ` Eli Zaretskii
2022-07-22 23:25   ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-07-23  6:41     ` Eli Zaretskii
2022-07-23 14:07       ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-07-23 15:29         ` Eli Zaretskii
2022-07-23 15:46           ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-07-23 16:15             ` Eli Zaretskii
2022-07-23 16:19               ` Eli Zaretskii
2022-07-24  5:50                 ` Gerd Möllmann
2022-07-24 14:35                   ` Dmitry Gutov
2022-07-24 15:05                     ` Eli Zaretskii
2022-07-25 23:23                       ` Dmitry Gutov
2022-07-26  6:52                         ` Gregory Heytings
     [not found]                           ` <addcac7f-cb95-c433-58e5-e2d525582613@yandex.ru>
2022-07-27  6:55                             ` Gregory Heytings
2022-07-27 21:38                               ` Dmitry Gutov
2022-07-28  6:21                                 ` Eli Zaretskii
2022-07-28  7:49                                 ` Gregory Heytings
2022-08-04  0:49                                   ` Dmitry Gutov
2022-08-04  1:26                                     ` Gregory Heytings
2022-08-04  7:50                                       ` Eli Zaretskii
2022-08-04  9:24                                         ` Gregory Heytings
2022-08-04  9:36                                           ` Eli Zaretskii
2022-08-04  9:43                                             ` Gregory Heytings
2022-08-04  9:40                                           ` Eli Zaretskii
2022-08-04  9:46                                             ` Gregory Heytings
2022-08-04  9:57                                               ` Eli Zaretskii
2022-08-04 10:33                                                 ` Gregory Heytings
2022-08-04 13:10                                                   ` Eli Zaretskii
2022-08-04 14:14                                                   ` Eli Zaretskii
2022-08-04 14:31                                                     ` Eli Zaretskii
2022-08-04 15:25                                                       ` Gregory Heytings
2022-08-04 15:08                                                     ` Gregory Heytings
2022-08-04 16:00                                                       ` Eli Zaretskii
2022-08-04 16:25                                                         ` Gregory Heytings
2022-08-04 17:06                                                           ` Eli Zaretskii
2022-08-04 18:16                                                             ` Gregory Heytings
2022-08-04 18:52                                                               ` Eli Zaretskii
2022-08-04 19:26                                                                 ` Gregory Heytings
2022-08-05  6:05                                                                   ` Eli Zaretskii
2022-08-05  9:37                                                                     ` Gregory Heytings
2022-08-05 11:40                                                                       ` Eli Zaretskii
2022-08-05 11:50                                                                         ` Gregory Heytings
2022-08-05 13:43                                                                           ` Eli Zaretskii
2022-08-06 13:28                                                                           ` Eli Zaretskii
2022-08-07  0:29                                                                             ` Gregory Heytings
2022-08-07 14:07                                                                               ` Eli Zaretskii
2022-08-06 14:05                                                                           ` Eli Zaretskii
2022-08-07  0:30                                                                             ` Gregory Heytings
2022-08-04  9:52                                           ` Stefan Kangas
2022-08-04 10:35                                       ` Dmitry Gutov
2022-08-04 11:29                                         ` Gregory Heytings
2022-08-04 11:59                                           ` Stefan Kangas
2022-08-04 12:05                                             ` Gregory Heytings
2022-08-04 12:40                                               ` Eli Zaretskii
2022-08-04 13:10                                                 ` Gregory Heytings
2022-08-04 21:37                                               ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-08-04 13:09                                         ` Eli Zaretskii
2022-08-05  1:39                                           ` Dmitry Gutov
2022-08-05  7:38                                             ` Eli Zaretskii
2022-08-05  8:21                                             ` Gregory Heytings
2022-08-05 10:49                                               ` Eli Zaretskii
2022-08-04  7:29                                     ` Eli Zaretskii
2022-07-26 11:45                         ` Eli Zaretskii
2022-07-26 20:52                           ` Dmitry Gutov
2022-07-23 19:05               ` Gregory Heytings
2022-07-23 19:12                 ` Eli Zaretskii
2022-07-23 19:21                   ` Gregory Heytings
2022-07-25 21:23     ` Gregory Heytings
2022-07-26 21:17       ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-07-27  6:44         ` Gregory Heytings
2022-07-30  7:16           ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-07-30  8:12             ` Eli Zaretskii
2022-07-30 10:52               ` Gregory Heytings
2022-07-30 10:59                 ` Eli Zaretskii
2022-07-30 11:07                   ` Gregory Heytings
2022-07-30 11:32                 ` Eli Zaretskii
2022-07-30 11:36                   ` Gregory Heytings
2022-07-30 12:05                     ` Gregory Heytings
2022-07-31  7:25                 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-07-31  7:48                   ` Eli Zaretskii
2022-07-31  8:08                   ` Gregory Heytings
2022-07-31 10:41                     ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-07-31 10:50                       ` Gregory Heytings
2022-07-31 21:41                         ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-07-31 22:06                           ` Gregory Heytings
2022-07-31 22:45                             ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-07-31 23:12                               ` Gregory Heytings
2022-08-01  7:11                                 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-08-01  7:51                                   ` Gregory Heytings
2022-08-01 12:12                                   ` Eli Zaretskii
2022-08-01 21:54                                     ` Dmitry Gutov
2022-08-02  2:31                                       ` Eli Zaretskii
2022-08-02 14:29                                         ` Dmitry Gutov
2022-08-02 14:57                                           ` Gregory Heytings
2022-08-02 16:14                                             ` Eli Zaretskii
2022-08-02 16:19                                               ` Gregory Heytings
2022-08-03  0:00                                                 ` Dmitry Gutov
2022-08-03  0:26                                                   ` Dmitry Gutov
2022-08-03  8:11                                                     ` Gregory Heytings
2022-08-03 11:56                                                     ` Eli Zaretskii
2022-08-04  1:08                                                       ` Dmitry Gutov
2022-08-04  1:34                                                         ` Gregory Heytings
2022-08-04  6:40                                                         ` Eli Zaretskii
2022-08-02 22:04                                             ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-08-05  2:03                                             ` Dmitry Gutov
2022-08-05  7:43                                               ` Eli Zaretskii
2022-08-05 11:34                                                 ` Dmitry Gutov
2022-08-05 11:48                                                   ` Eli Zaretskii
2022-08-05 12:08                                                     ` Dmitry Gutov
2022-08-05 12:20                                                       ` Gregory Heytings
2022-08-05 12:50                                                         ` Dmitry Gutov
2022-08-05 13:00                                                           ` Gregory Heytings
2022-08-05 13:11                                                             ` Dmitry Gutov
2022-08-05 13:17                                                           ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-08-05 13:30                                                             ` Dmitry Gutov
2022-08-05 13:41                                                               ` Gregory Heytings
2022-08-05 14:00                                                                 ` Dmitry Gutov
2022-08-05 14:09                                                                   ` Gregory Heytings
2022-08-05 22:38                                                                     ` Dmitry Gutov
2022-08-06  7:28                                                                       ` Eli Zaretskii
2022-08-06 22:58                                                                         ` Dmitry Gutov
2022-08-07  0:44                                                                           ` Gregory Heytings
2022-08-07  6:11                                                                           ` Eli Zaretskii
2022-08-07 18:27                                                                             ` Dmitry Gutov
2022-08-07 18:38                                                                               ` Eli Zaretskii
2022-08-12 10:47                                                                                 ` Dmitry Gutov
2022-08-12 12:34                                                                                   ` Gregory Heytings
2022-08-12 16:35                                                                                     ` Dmitry Gutov
2022-08-12 17:56                                                                                       ` Eli Zaretskii
2022-08-12 18:09                                                                                         ` Dmitry Gutov
2022-08-12 21:41                                                                                           ` Gregory Heytings
2022-08-13  5:56                                                                                             ` Eli Zaretskii
2022-08-13 13:37                                                                                               ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-08-13 14:25                                                                                                 ` Eli Zaretskii
2022-08-13 14:32                                                                                                   ` Gregory Heytings
2022-08-13 15:11                                                                                                     ` Eli Zaretskii
2022-08-13 15:38                                                                                                       ` Gregory Heytings
2022-08-13 16:46                                                                                                     ` Dmitry Gutov
2022-08-13 17:16                                                                                                       ` Gregory Heytings
2022-08-13 19:10                                                                                                         ` Dmitry Gutov
2022-08-13 19:54                                                                                                           ` Gregory Heytings
2022-08-13 20:19                                                                                                             ` Dmitry Gutov
2022-08-13 21:15                                                                                                         ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-08-13  8:27                                                                                             ` Dmitry Gutov
2022-08-12 21:31                                                                                       ` Gregory Heytings
2022-08-13  2:01                                                                                         ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-08-13  6:13                                                                                           ` Eli Zaretskii
2022-08-13  8:00                                                                                             ` dgutov
2022-08-13 13:44                                                                                             ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-08-13 16:48                                                                                             ` Dmitry Gutov
2022-08-13  7:58                                                                                           ` Dmitry Gutov
2022-08-13 13:42                                                                                           ` Gregory Heytings
2022-08-13 14:23                                                                                             ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-08-13 14:33                                                                                               ` Gregory Heytings
2022-08-13 16:59                                                                                             ` Dmitry Gutov
2022-08-13 17:26                                                                                               ` Gregory Heytings
2022-08-13 19:12                                                                                                 ` Dmitry Gutov
2022-08-14  5:29                                                                                                   ` Eli Zaretskii
2022-08-14  9:54                                                                                                     ` Dmitry Gutov
2022-08-13  9:00                                                                                         ` Dmitry Gutov
2022-08-13 14:24                                                                                           ` Gregory Heytings
2022-08-13 17:20                                                                                             ` Dmitry Gutov
2022-08-13 17:43                                                                                               ` Gregory Heytings
2022-08-13 19:19                                                                                                 ` Dmitry Gutov
2022-08-14  5:36                                                                                                   ` Eli Zaretskii
2022-08-14  9:41                                                                                                     ` Dmitry Gutov
2022-08-14 13:02                                                                                                       ` Eli Zaretskii
2022-08-14 15:37                                                                                                         ` Dmitry Gutov
2022-08-14 16:24                                                                                                           ` Gregory Heytings
2022-08-14 17:51                                                                                                             ` Dmitry Gutov
2022-08-14 17:54                                                                                                               ` Gregory Heytings
2022-08-14 18:18                                                                                                                 ` Dmitry Gutov
2022-08-15  8:53                                                                                                                   ` Gregory Heytings
2022-08-14 18:01                                                                                                               ` Eli Zaretskii
2022-08-14 18:14                                                                                                                 ` Dmitry Gutov
2022-08-14 18:27                                                                                                                   ` Eli Zaretskii
2022-08-14 22:07                                                                                                                     ` Dmitry Gutov
2022-08-15  2:32                                                                                                                       ` Eli Zaretskii
2022-08-15 10:06                                                                                                                         ` Dmitry Gutov
2022-08-15 11:51                                                                                                                           ` Eli Zaretskii
2022-08-15 12:01                                                                                                                             ` dick
2022-08-15 12:06                                                                                                                             ` Dmitry Gutov
2022-08-15 12:45                                                                                                                               ` Eli Zaretskii
2022-08-15 14:19                                                                                                                               ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-08-15  8:59                                                                                                                   ` Gregory Heytings
2022-08-13 17:54                                                                                               ` Eli Zaretskii
2022-08-13 19:08                                                                                                 ` Dmitry Gutov
2022-08-14  5:23                                                                                                   ` Eli Zaretskii
2022-08-14 10:29                                                                                                     ` Dmitry Gutov
2022-08-14 13:15                                                                                                       ` Eli Zaretskii
2022-08-14 17:47                                                                                                         ` Dmitry Gutov
2022-08-14 17:59                                                                                                           ` Eli Zaretskii
2022-08-14 20:46                                                                                                             ` Dmitry Gutov
2022-08-15 14:06                                                                                                               ` Eli Zaretskii
2022-08-15 15:42                                                                                                                 ` Dmitry Gutov
2022-08-15 15:52                                                                                                                   ` Eli Zaretskii
2022-08-15 16:44                                                                                                                     ` Dmitry Gutov
2022-08-15 16:58                                                                                                                       ` Eli Zaretskii
2022-08-15 19:51                                                                                                                         ` Dmitry Gutov
2022-08-16  2:33                                                                                                                           ` Eli Zaretskii
2022-08-16 14:00                                                                                                                             ` Dmitry Gutov
2022-08-16 14:10                                                                                                                               ` Eli Zaretskii
2022-08-16 14:39                                                                                                                                 ` Dmitry Gutov
2022-08-14 16:16                                                                                                       ` Gregory Heytings
2022-08-14 17:54                                                                                                         ` Dmitry Gutov
2022-08-14 18:47                                                                                                           ` Gregory Heytings
2022-08-14 19:15                                                                                                             ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-08-14 21:03                                                                                                               ` Dmitry Gutov
2022-08-15  8:51                                                                                                               ` Gregory Heytings
2022-08-15  1:23                                                                                                           ` Ihor Radchenko
2022-08-15  1:52                                                                                                             ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-08-15  2:10                                                                                                               ` Ihor Radchenko
2022-08-15  2:41                                                                                                                 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-08-15  3:10                                                                                                                   ` Ihor Radchenko
2022-08-15  9:11                                                                                                                     ` Gregory Heytings
2022-08-15 11:47                                                                                                                       ` Ihor Radchenko
2022-08-16 10:24                                                                                                                         ` Gregory Heytings
2022-08-16 10:49                                                                                                                           ` Ihor Radchenko
2022-08-16 11:30                                                                                                                             ` Gregory Heytings
2022-08-16 11:33                                                                                                                               ` Ihor Radchenko
2022-08-15  9:56                                                                                                                     ` Dmitry Gutov
2022-08-15 12:08                                                                                                                       ` Ihor Radchenko
2022-08-15 12:46                                                                                                                         ` Eli Zaretskii
2022-08-15 14:26                                                                                                                         ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-08-16  4:31                                                                                                                           ` Ihor Radchenko
2022-08-16 10:26                                                                                                                             ` Gregory Heytings
2022-08-16 10:52                                                                                                                               ` Ihor Radchenko
2022-08-16 13:20                                                                                                                             ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-08-16 13:29                                                                                                                               ` Ihor Radchenko
2022-08-15 11:17                                                                                                                 ` Eli Zaretskii
2022-08-16  4:38                                                                                                                   ` Ihor Radchenko
2022-08-16 11:19                                                                                                                     ` Eli Zaretskii
2022-08-16 11:30                                                                                                                       ` Ihor Radchenko
2022-08-16 12:10                                                                                                                         ` Eli Zaretskii
2022-08-16 12:25                                                                                                                           ` Ihor Radchenko
2022-08-16 12:46                                                                                                                             ` Eli Zaretskii
2022-08-16 13:26                                                                                                                         ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-08-15 14:03                                                                                               ` Eli Zaretskii
2022-08-15 15:52                                                                                                 ` Dmitry Gutov
2022-08-15 16:05                                                                                                   ` Eli Zaretskii
2022-08-15 18:17                                                                                                     ` Dmitry Gutov
2022-08-15 18:28                                                                                                       ` Eli Zaretskii
2022-08-15 21:18                                                                                                         ` Dmitry Gutov
2022-08-16  2:45                                                                                                           ` Eli Zaretskii
2022-08-16 10:57                                                                                                             ` Dmitry Gutov
2022-08-15 19:25                                                                                                       ` Gregory Heytings
2022-08-15 19:54                                                                                                         ` Dmitry Gutov
2022-08-15 20:25                                                                                                           ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-08-15 20:40                                                                                                             ` Dmitry Gutov
2022-08-15 21:57                                                                                                               ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-08-15 23:33                                                                                                                 ` Dmitry Gutov
2022-08-15 19:36                                                                                                     ` Gregory Heytings
2022-08-15 20:17                                                                                                       ` Dmitry Gutov
2022-08-15 20:29                                                                                                         ` Gregory Heytings
2022-08-15 20:44                                                                                                           ` Dmitry Gutov
2022-08-15 20:53                                                                                                             ` Gregory Heytings
2022-08-15 21:15                                                                                                               ` Dmitry Gutov
2022-08-15 22:08                                                                                                                 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-08-15 22:14                                                                                                                   ` Gregory Heytings
2022-08-15 22:23                                                                                                                     ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-08-16  8:12                                                                                                                       ` Gregory Heytings
2022-08-16  8:21                                                                                                                         ` Gregory Heytings
2022-08-16 13:43                                                                                                                           ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-08-16 13:53                                                                                                                             ` Eli Zaretskii
2022-08-16 14:03                                                                                                                             ` Gregory Heytings
2022-08-16 14:22                                                                                                                               ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-08-16 13:39                                                                                                                         ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-08-16 14:02                                                                                                                           ` Gregory Heytings
2022-08-16 14:15                                                                                                                             ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-08-16 14:21                                                                                                                               ` Gregory Heytings
2022-08-16 14:32                                                                                                                                 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-08-15 21:42                                                                                                         ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-08-15 21:47                                                                                                           ` Gregory Heytings
2022-08-15 22:15                                                                                                             ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-08-15 22:20                                                                                                             ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-08-16  8:12                                                                                                               ` Gregory Heytings
2022-08-16  2:28                                                                                                       ` Eli Zaretskii
2022-08-16  8:26                                                                                                         ` Gregory Heytings
2022-08-16 11:34                                                                                                           ` Eli Zaretskii
2022-08-16 12:42                                                                                                             ` Gregory Heytings
2022-08-16 12:51                                                                                                               ` Eli Zaretskii
2022-08-16 13:07                                                                                                           ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-08-16 13:09                                                                                                             ` Eli Zaretskii
2022-08-16 13:58                                                                                                               ` Dmitry Gutov
2022-08-16 14:07                                                                                                                 ` Eli Zaretskii
2022-08-16 14:11                                                                                                                   ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-08-16 14:14                                                                                                                     ` Eli Zaretskii
2022-08-16 14:31                                                                                                                       ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-08-16 15:51                                                                                                                         ` Eli Zaretskii
2022-08-16 17:15                                                                                                                           ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-08-16 17:26                                                                                                                             ` Eli Zaretskii
2022-08-16 19:18                                                                                                                               ` bug#56682: locked narrowing (was: bug#56682: Fix the long lines font locking related slowdowns) Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-08-16 19:33                                                                                                                                 ` bug#56682: locked narrowing dick
2022-08-16 19:39                                                                                                                                 ` bug#56682: locked narrowing (was: bug#56682: Fix the long lines font locking related slowdowns) Gregory Heytings
2022-08-16 20:57                                                                                                                                   ` bug#56682: locked narrowing Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-08-16 21:18                                                                                                                                     ` Gregory Heytings
2022-08-16 20:23                                                                                                                                 ` bug#56682: locked narrowing (was: bug#56682: Fix the long lines font locking related slowdowns) Gregory Heytings
2022-08-16 21:42                                                                                                                                   ` bug#56682: locked narrowing Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-08-16 21:50                                                                                                                                     ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-08-17 11:28                                                                                                                                 ` bug#56682: locked narrowing (was: bug#56682: Fix the long lines font locking related slowdowns) Eli Zaretskii
2022-08-17 13:06                                                                                                                                   ` bug#56682: locked narrowing Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-08-17 13:30                                                                                                                                     ` Eli Zaretskii
2022-08-17 13:50                                                                                                                                       ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-08-17 13:59                                                                                                                                         ` Eli Zaretskii
2022-08-17 14:11                                                                                                                                           ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-08-17 14:25                                                                                                                                             ` Eli Zaretskii
2022-08-17 15:58                                                                                                                                               ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-08-17 16:52                                                                                                                                                 ` Eli Zaretskii
2022-08-17 17:09                                                                                                                                                   ` Eli Zaretskii
2022-08-17 19:38                                                                                                                                                     ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-08-17 17:58                                                                                                                                                   ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-08-17 18:29                                                                                                                                                     ` Eli Zaretskii
2022-08-17 19:09                                                                                                                                                       ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-08-17 19:19                                                                                                                                                         ` Eli Zaretskii
2022-08-17 20:04                                                                                                                                                           ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-08-17 18:33                                                                                                                                                     ` Eli Zaretskii
2022-08-17 19:18                                                                                                                                                       ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-08-17 19:24                                                                                                                                                         ` Eli Zaretskii
2022-08-17 20:09                                                                                                                                                           ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-08-18  5:19                                                                                                                                                             ` Eli Zaretskii
2022-08-20 16:20                                                                                                                                                               ` Gregory Heytings
2022-08-20 17:12                                                                                                                                                                 ` Eli Zaretskii
2022-08-20 17:21                                                                                                                                                                 ` Eli Zaretskii
2022-08-20 17:44                                                                                                                                                                   ` Gregory Heytings
2022-10-18 16:30                                                                                                                                                                 ` Dmitry Gutov
2022-11-26 14:14                                                                                                                                                                   ` Gregory Heytings
2022-11-29  3:20                                                                                                                                                                     ` Dmitry Gutov
2022-11-29 12:47                                                                                                                                                                       ` Eli Zaretskii
2022-11-29 13:21                                                                                                                                                                         ` Dmitry Gutov
2022-11-29 14:25                                                                                                                                                                           ` Eli Zaretskii
     [not found]                                                                                                                                                                             ` <444288a4-b51a-9544-2e60-d28b0aa2bb75@yandex.ru>
2022-11-29 15:47                                                                                                                                                                               ` Eli Zaretskii
2022-11-29 17:10                                                                                                                                                                       ` Gregory Heytings
2022-11-29 17:56                                                                                                                                                                         ` Dmitry Gutov
2022-11-29 18:19                                                                                                                                                                           ` Eli Zaretskii
2022-11-29 19:29                                                                                                                                                                             ` Dmitry Gutov
2022-11-29 19:51                                                                                                                                                                               ` Eli Zaretskii
2022-11-29 20:36                                                                                                                                                                                 ` Dmitry Gutov
2022-11-29 20:11                                                                                                                                                                           ` Gregory Heytings
2022-11-29 20:47                                                                                                                                                                             ` Dmitry Gutov
2022-11-29 20:59                                                                                                                                                                               ` Gregory Heytings
2022-11-30  0:15                                                                                                                                                                                 ` Gregory Heytings
2022-11-30  0:47                                                                                                                                                                                   ` Dmitry Gutov
2022-11-30 10:00                                                                                                                                                                                     ` Gregory Heytings
2022-11-30  3:42                                                                                                                                                                                   ` Eli Zaretskii
2022-11-30 10:11                                                                                                                                                                                     ` Gregory Heytings
2022-11-30 14:04                                                                                                                                                                                       ` Eli Zaretskii
2022-11-30 14:40                                                                                                                                                                                         ` Gregory Heytings
2022-11-30 15:31                                                                                                                                                                                           ` Eli Zaretskii
2022-11-30 22:09                                                                                                                                                                                             ` Gregory Heytings
2022-12-01  7:05                                                                                                                                                                                               ` Eli Zaretskii
2022-12-01 20:49                                                                                                                                                                                                 ` Gregory Heytings
2022-12-01 20:52                                                                                                                                                                                                   ` Gregory Heytings
2022-12-01 21:14                                                                                                                                                                                                   ` Eli Zaretskii
2022-12-01 21:36                                                                                                                                                                                                     ` Gregory Heytings
2022-12-01 21:43                                                                                                                                                                                                       ` Eli Zaretskii
2022-12-01 22:05                                                                                                                                                                                                         ` dick
2022-12-01 22:23                                                                                                                                                                                                         ` Gregory Heytings
2022-12-01 23:11                                                                                                                                                                                                           ` Gregory Heytings
2022-12-01 23:48                                                                                                                                                                                                             ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-12-02  0:24                                                                                                                                                                                                               ` Gregory Heytings
2022-12-02  2:52                                                                                                                                                                                                                 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-12-02  8:04                                                                                                                                                                                                                   ` Eli Zaretskii
2022-12-02  8:08                                                                                                                                                                                                                     ` Gregory Heytings
2022-12-02 14:10                                                                                                                                                                                                                     ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-12-02  8:54                                                                                                                                                                                                                   ` Gregory Heytings
2022-12-02 14:13                                                                                                                                                                                                                     ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-12-02  7:49                                                                                                                                                                                                               ` Eli Zaretskii
2022-12-02  8:04                                                                                                                                                                                                                 ` Gregory Heytings
2022-12-02  8:57                                                                                                                                                                                                                   ` Eli Zaretskii
2022-12-02  9:16                                                                                                                                                                                                                     ` Gregory Heytings
2022-12-02 12:02                                                                                                                                                                                                                       ` Eli Zaretskii
2022-12-02  7:05                                                                                                                                                                                                           ` Eli Zaretskii
2022-12-02  7:56                                                                                                                                                                                                             ` Gregory Heytings
2022-12-02  8:51                                                                                                                                                                                                               ` Eli Zaretskii
2022-12-02  9:14                                                                                                                                                                                                                 ` Gregory Heytings
2022-12-01 21:15                                                                                                                                                                                                   ` Gregory Heytings
2022-11-30 15:21                                                                                                                                                                                       ` Dmitry Gutov
2022-11-30 13:19                                                                                                                                                                                   ` Eli Zaretskii
2022-11-30 13:52                                                                                                                                                                                     ` Gregory Heytings
2022-11-30 15:03                                                                                                                                                                                       ` Eli Zaretskii
2022-11-29 18:16                                                                                                                                                                         ` Eli Zaretskii
2022-11-30 16:34                                                                                                                                                                     ` Juri Linkov
2022-11-30 17:34                                                                                                                                                                       ` Eli Zaretskii
2022-12-06 17:14                                                                                                                                                                       ` Juri Linkov
2022-12-06 20:11                                                                                                                                                                         ` Gregory Heytings
2022-12-07  7:52                                                                                                                                                                           ` Juri Linkov
     [not found]                                                                                                                                                                 ` <5faa8871-e809-8750-325a-991a71e76639@yandex.ru>
2022-10-19 17:49                                                                                                                                                                   ` Gregory Heytings
     [not found]                                                                                                                                                                 ` <f3c1c37c495f2b2af64f@heytings.org>
2022-11-26  2:53                                                                                                                                                                   ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-11-26 10:08                                                                                                                                                                   ` Eli Zaretskii
2022-11-26 16:15                                                                                                                                                                     ` Gregory Heytings
2022-11-26 16:51                                                                                                                                                                       ` Eli Zaretskii
2022-11-26 17:44                                                                                                                                                                         ` Eli Zaretskii
2022-11-26 22:42                                                                                                                                                                         ` Gregory Heytings
2022-11-27  1:10                                                                                                                                                                           ` Gregory Heytings
2022-08-05 14:16                                                       ` bug#56682: Fix the long lines font locking related slowdowns Eli Zaretskii
2022-08-05  8:23                                               ` Gregory Heytings
2022-08-05 12:19                                                 ` Dmitry Gutov
2022-08-05 14:18                                                   ` Eli Zaretskii
2022-08-02 16:02                                           ` Eli Zaretskii
2022-08-01 11:58                               ` Eli Zaretskii
2022-08-02  8:10                                 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-08-02  8:22                                   ` Gregory Heytings
2022-08-02  9:25                                     ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-08-02 10:00                                       ` Gregory Heytings
2022-08-02 21:40                                         ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-08-02 22:14                                           ` Gregory Heytings
2022-08-03  8:39                                             ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-08-05 12:59                                 ` Dmitry Gutov
2022-08-05 14:20                                   ` Eli Zaretskii
2022-08-05 14:41                                     ` Dmitry Gutov
2022-08-05 15:33                                       ` Eli Zaretskii
2022-08-05 17:32                                         ` Dmitry Gutov
2022-08-05 18:09                                           ` Eli Zaretskii
2022-08-05 18:02                                         ` Dmitry Gutov
2022-08-05 18:14                                           ` Eli Zaretskii
2022-08-05 19:01                                             ` Dmitry Gutov
2022-08-05 19:14                                               ` Eli Zaretskii
2022-08-05 20:23                                                 ` Dmitry Gutov
2022-08-06  6:07                                                   ` Eli Zaretskii
2022-08-06 10:50                                                     ` Dmitry Gutov
2022-08-06 11:17                                                       ` Eli Zaretskii
2022-08-06 11:49                                                         ` Gregory Heytings
2022-08-06 11:50                                                           ` Gregory Heytings
2022-08-06 20:04                                                           ` Dmitry Gutov
2022-08-06 23:29                                                             ` Gregory Heytings
2022-08-07 11:14                                                               ` Dmitry Gutov
2022-08-06 20:59                                                         ` Dmitry Gutov
2022-08-07  0:11                                                       ` Gregory Heytings
2022-08-07 11:28                                                         ` Dmitry Gutov
2022-08-07 12:46                                                           ` Gregory Heytings
2022-08-07 17:40                                                             ` Dmitry Gutov
2022-08-07 20:21                                                               ` Gregory Heytings
2022-08-10  1:04                                                                 ` Dmitry Gutov
2022-08-10  7:47                                                                   ` Gregory Heytings
2022-08-10  8:48                                                                     ` Stephen Berman
2022-08-10  8:59                                                                       ` Gregory Heytings
2022-08-10  9:04                                                                         ` Gregory Heytings
2022-08-10  9:35                                                                           ` Stephen Berman
2022-08-10 10:34                                                                             ` Gregory Heytings
2022-08-10 10:55                                                                               ` Stephen Berman
2022-08-10 11:54                                                                                 ` Dmitry Gutov
2022-08-10 12:04                                                                                   ` Eli Zaretskii
2022-08-10 12:28                                                                                     ` Dmitry Gutov
2022-08-10 11:44                                                                               ` Eli Zaretskii
2022-08-10 11:59                                                                                 ` Stephen Berman
2022-08-10 12:16                                                                                   ` Eli Zaretskii
2022-08-10 12:31                                                                                 ` Gregory Heytings
2022-08-10 12:43                                                                                   ` Eli Zaretskii
2022-08-10 12:48                                                                                     ` Gregory Heytings
2022-08-10 13:04                                                                                       ` Stephen Berman
2022-08-10 13:11                                                                                         ` Gregory Heytings
2022-08-10 13:29                                                                                           ` Stephen Berman
2022-08-10 15:00                                                                                             ` Gregory Heytings
2022-08-10 15:44                                                                                     ` Dmitry Gutov
2022-08-10 16:08                                                                                       ` Eli Zaretskii
2022-08-10 17:02                                                                                         ` Dmitry Gutov
2022-08-10 17:19                                                                                           ` Eli Zaretskii
2022-08-10 18:54                                                                                             ` Dmitry Gutov
2022-08-10 19:13                                                                                               ` Eli Zaretskii
2022-08-07 17:41                                                           ` Dmitry Gutov
2022-08-09 21:03                                                             ` Gregory Heytings
2022-08-01 18:09                               ` Gregory Heytings
2022-08-02  8:12                                 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-07-31 22:03                         ` Dmitry Gutov
2022-07-31 22:23                           ` Gregory Heytings
2022-07-31 22:42                             ` Dmitry Gutov
2022-07-31 22:50                               ` Gregory Heytings
2022-07-31 23:21                                 ` Gregory Heytings
2022-08-01  1:23                                 ` Dmitry Gutov
2022-08-01 12:08                                   ` Eli Zaretskii
2022-08-02  1:05                                     ` Dmitry Gutov
2022-08-02  7:55                                       ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-08-02 14:08                                         ` Dmitry Gutov
2022-08-02 12:35                                       ` Eli Zaretskii
2022-08-02 14:47                                         ` Dmitry Gutov
2022-08-02 15:06                                           ` Gregory Heytings
2022-08-02 21:51                                             ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-08-02 16:11                                           ` Eli Zaretskii
2022-08-02 21:46                                         ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-08-03  2:33                                           ` Eli Zaretskii
2022-08-02 21:49                                         ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-08-02 21:53                                           ` Gregory Heytings
2022-08-03  8:42                                             ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-08-01 12:04                                 ` Eli Zaretskii
2022-08-01 12:20                                   ` Gregory Heytings
2022-08-01 13:04                                     ` Eli Zaretskii
2022-08-01 13:14                                       ` Gregory Heytings
2022-08-01 13:19                                         ` Eli Zaretskii
2022-08-01 13:34                                           ` Gregory Heytings
2022-08-01 21:50                                           ` Dmitry Gutov
2022-08-02  2:27                                             ` Eli Zaretskii
2022-08-02 14:10                                               ` Dmitry Gutov
2022-08-02 15:46                                                 ` Eli Zaretskii
2022-08-04  1:08                                                   ` Dmitry Gutov
2022-08-04  1:41                                                     ` Gregory Heytings
2022-08-05 12:28                                                       ` Dmitry Gutov
2022-08-04  7:45                                                     ` Eli Zaretskii
2022-08-02  7:51                                     ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-08-02  7:48                                   ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-07-31 23:00                               ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-07-31 22:47                             ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-07-31 23:15                               ` Gregory Heytings
2022-08-01  7:02                                 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-08-01  8:38                                   ` Gregory Heytings
2022-08-01  9:34                                     ` Gregory Heytings
2022-08-01  9:46                                       ` Dmitry Gutov
2022-08-01  9:56                                         ` Gregory Heytings
2022-08-01 10:00                                           ` Gregory Heytings
2022-08-01 10:46                                           ` Dmitry Gutov
2022-08-01 11:01                                             ` Gregory Heytings
2022-08-02 14:53                                               ` Dmitry Gutov
2022-08-02 15:09                                                 ` Gregory Heytings
2022-08-02 21:19                                                   ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-08-03  2:30                                                     ` Eli Zaretskii
2022-08-03  8:37                                                       ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-08-03 12:08                                                         ` Eli Zaretskii
2022-08-03 20:38                                                           ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-08-04  5:40                                                             ` Eli Zaretskii
2022-08-04 22:35                                                               ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-08-05  6:20                                                                 ` Eli Zaretskii
2022-08-05  9:03                                                                   ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-08-05 10:57                                                                     ` Eli Zaretskii
2022-08-05 12:06                                                                       ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-08-05 12:16                                                                         ` Gregory Heytings
2022-08-05 12:21                                                                           ` Dmitry Gutov
2022-08-05 12:42                                                                             ` Gregory Heytings
2022-08-05 13:05                                                                         ` Eli Zaretskii
2022-08-05 10:00                                                                 ` Gregory Heytings
2022-08-02 21:18                                               ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-08-02 21:26                                                 ` Gregory Heytings
2022-08-02 22:26                                                   ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-08-02 22:52                                                     ` Gregory Heytings
2022-08-03  8:34                                                       ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-08-03  9:04                                                         ` Gregory Heytings
2022-08-03 20:33                                                           ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-08-03 21:37                                                             ` Gregory Heytings
2022-08-03 22:42                                                               ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-08-04  1:29                                                                 ` Gregory Heytings
2022-08-04  6:08                                                                 ` Eli Zaretskii
2022-08-04  6:23                                                                   ` Lars Ingebrigtsen
2022-08-04 11:21                                                                     ` Gregory Heytings
2022-08-03 22:10                                                             ` Gregory Heytings
2022-08-03 11:54                                                     ` Eli Zaretskii
2022-08-03 20:36                                                       ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-08-04  5:30                                                         ` Eli Zaretskii
2022-08-01 11:06                                       ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-08-01 11:23                                         ` Gregory Heytings
2022-08-01 21:53                                           ` Dmitry Gutov
2022-08-02  7:34                                             ` Gregory Heytings
2022-08-02 11:07                                               ` Dmitry Gutov
2022-08-02 21:32                                           ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-08-02 21:43                                             ` Gregory Heytings
2022-08-03 21:26                                               ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-08-03 21:42                                                 ` Gregory Heytings
2022-08-03 22:43                                                   ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-08-04  1:30                                                     ` Gregory Heytings
2022-08-04 21:24                                                       ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-08-02  3:01                                       ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-07-30 13:17             ` Gregory Heytings
2022-07-27 11:18         ` Eli Zaretskii
2022-08-01 16:34 ` Eli Zaretskii
2022-08-01 16:49   ` Gregory Heytings
2022-08-01 17:08     ` Eli Zaretskii

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).