GNU bug report logs - #58361
29.0.50; noverlay branch is O(N) for important calls

Please note: This is a static page, with minimal formatting, updated once a day.
Click here to see this page with the latest information and nicer formatting.

Package: emacs; Reported by: Andreas Politz <mail@HIDDEN>; merged with #58342; dated Fri, 7 Oct 2022 18:15:02 UTC; Maintainer for emacs is bug-gnu-emacs@HIDDEN.
Forcibly Merged 58342 58361. Request was from Stefan Kangas <stefankangas@HIDDEN> to control <at> debbugs.gnu.org. Full text available.

Message received at submit <at> debbugs.gnu.org:


Received: (at submit) by debbugs.gnu.org; 7 Oct 2022 18:39:16 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Fri Oct 07 14:39:16 2022
Received: from localhost ([127.0.0.1]:37358 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1ogsFg-0002Iv-9S
	for submit <at> debbugs.gnu.org; Fri, 07 Oct 2022 14:39:16 -0400
Received: from lists.gnu.org ([209.51.188.17]:39630)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <monnier@HIDDEN>) id 1ogsFd-0002Il-Sr
 for submit <at> debbugs.gnu.org; Fri, 07 Oct 2022 14:39:15 -0400
Received: from eggs.gnu.org ([2001:470:142:3::10]:51884)
 by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)
 (Exim 4.90_1) (envelope-from <monnier@HIDDEN>)
 id 1ogsFZ-000086-7B
 for bug-gnu-emacs@HIDDEN; Fri, 07 Oct 2022 14:39:12 -0400
Received: from mailscanner.iro.umontreal.ca ([132.204.25.50]:9898)
 by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)
 (Exim 4.90_1) (envelope-from <monnier@HIDDEN>)
 id 1ogsF4-0001su-D8; Fri, 07 Oct 2022 14:38:59 -0400
Received: from pmg2.iro.umontreal.ca (localhost.localdomain [127.0.0.1])
 by pmg2.iro.umontreal.ca (Proxmox) with ESMTP id 5F1E18004C;
 Fri,  7 Oct 2022 14:38:35 -0400 (EDT)
Received: from mail01.iro.umontreal.ca (unknown [172.31.2.1])
 by pmg2.iro.umontreal.ca (Proxmox) with ESMTP id 50FA380401;
 Fri,  7 Oct 2022 14:38:33 -0400 (EDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=iro.umontreal.ca;
 s=mail; t=1665167913;
 bh=TfRJTRm0zM57+oiReAoWVUmuMZkOqz0SJtRY/HWhT6Q=;
 h=From:To:Cc:Subject:In-Reply-To:References:Date:From;
 b=d9Iht9JQBzpoMQq3sIPI9glDmwxLa0fStR7KLPd9WiNSo/s3UgRNnE27jAG5RMdhQ
 m3R+Tk1TRSvkZYrMot/4GOi9nnOH8skkrnpokGe0HqiRlMjmfs7ZiHzwQbFdYhktrR
 Ouc7M2dZK5pFgTTdRPKTpDlrXUb0uafv+YK3raaPUTm1cRB8aA7Lp/qRg+e3ui3dTI
 dN3/Ke5cNtYNcyK98tjU91TOjniFp8vgZARwovDqewBZrUYHO62sELDShX5avzReIZ
 /JkIaNv7OWrOlWWX4L+zh8yHdsOOkL/QNSVZwEdg3nhq7QGqML+WlFSyFNtdYhRMZN
 u3Q0ojOb+Q2yw==
Received: from pastel (65-110-220-202.cpe.pppoe.ca [65.110.220.202])
 by mail01.iro.umontreal.ca (Postfix) with ESMTPSA id D1BA212047D;
 Fri,  7 Oct 2022 14:38:32 -0400 (EDT)
From: Stefan Monnier <monnier@HIDDEN>
To: Andreas Politz <mail@HIDDEN>
Subject: Re: 29.0.50; noverlay branch is O(N) for important calls
In-Reply-To: <D54E3787-D89B-43E1-A03E-75DFC6A34A62@HIDDEN> (Andreas
 Politz's message of "Fri, 7 Oct 2022 18:51:14 +0200")
Message-ID: <jwvfsfz5vx9.fsf-monnier+emacs@HIDDEN>
References: <878rlrfyje.fsf@HIDDEN>
 <D54E3787-D89B-43E1-A03E-75DFC6A34A62@HIDDEN>
Date: Fri, 07 Oct 2022 14:38:31 -0400
User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/29.0.50 (gnu/linux)
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable
X-SPAM-INFO: Spam detection results:  0
 ALL_TRUSTED                -1 Passed through trusted hosts only via SMTP
 AWL -0.139 Adjusted score from AWL reputation of From: address
 BAYES_00                 -1.9 Bayes spam probability is 0 to 1%
 DKIM_SIGNED               0.1 Message has a DKIM or DK signature,
 not necessarily valid
 DKIM_VALID -0.1 Message has at least one valid DKIM or DK signature
 DKIM_VALID_AU -0.1 Message has a valid DKIM or DK signature from author's
 domain
 KAM_SHORT               0.001 Use of a URL Shortener for very short URL
X-SPAM-LEVEL: 
Received-SPF: pass client-ip=132.204.25.50;
 envelope-from=monnier@HIDDEN; helo=mailscanner.iro.umontreal.ca
X-Spam_score_int: -42
X-Spam_score: -4.3
X-Spam_bar: ----
X-Spam_report: (-4.3 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1,
 DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, RCVD_IN_DNSWL_MED=-2.3,
 SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no
X-Spam_action: no action
X-Spam-Score: -1.3 (-)
X-Debbugs-Envelope-To: submit
Cc: Gerd =?windows-1252?Q?M=F6llmann?= <gerd.moellmann@HIDDEN>,
 Matt Armstrong <matt@HIDDEN>, bug-gnu-emacs@HIDDEN,
 Eli Zaretskii <eliz@HIDDEN>
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -2.3 (--)

> I think, a straightforward way   to use 2 trees, one for begin and one for
> end, could be to create another abstraction above those trees, while for =
the
> most part  duplicating the existing  interface.  This abstraction would t=
hen
> either delegate to one or both trees, depending on the operation. The tri=
ck
> would be to kinda multiplying the end-tree by -1,  i.e. reverse begin and
> end and multiply with -1 all inputs and outputs of this tree.
>
> Would that work ?

Could be but I'm not sure we want to pay this memory&cpu price to try
and fix a performance bug that's still hypothetical.
For all we know, in those cases where this performance problem could
bite, other performance problems bite us harder anyway.


        Stefan


>> Am 07.10.2022 um 17:23 schrieb Matt Armstrong <matt@HIDDEN>:
>>=20
>> =EF=BB=BFTo start, I don't think this issue should delay a merge to mast=
er.  I
>> don't think it is clear we need to fix anything here.
>>=20
>> I would like a note or FIXME in code noting the potentially slow
>> algorithm (patch sent), because it is currently well hidden behind a
>> generator loop.
>>=20
>>=20
>> Stefan Monnier <monnier@HIDDEN> writes:
>>=20
>>>> Here we traverse overlays in ASCENDING order of BEG positions.  The be=
st
>>>> we can say is that this loop executes in O(K*log(N)) time, where K is
>>>> the MIN of number of overlays that overlap POS and the number of valid
>>>=20
>>> The core operation in itree.c is the equivalent of `overlays-in/at`.
>>=20
>> [...]
>>=20
>> Yes, and for this O(K*log(N)) performance is a good result.  The key
>> insight is that previous and next overlay changes require examining a
>> large K (in worst case, extending all the way to the beginning or end of
>> the buffer) because there is no ordering by END positions.
>>=20
>>> Realistic benchmarks would be most welcome.
>>=20
>> I am working on polishing off
>> https://git.sr.ht/~matta/emacs-overlay-perftests.  Good news is that
>> redisplay is faster on the noverlay branch for the "realistic" case of
>> overlaping not overlapping eachother in pathalogical ways.
>>=20
>>=20
>>> [ Site note: `previous-overlay-change` is probably not very important in
>>>  practice, but `next-overlay-change` OTOH is indeed important because
>>>  it's used during redisplay.  So if someone comes up with a trick to
>>>  speed up only one direction, it should be good enough.  ]
>>>=20
>>> Maybe one way to improve the behavior is to accept the worst-case
>>> bound but to try and avoid paying it over-and-over each time the
>>> redisplay needs the "next change".  IOW instead of a
>>> `next_overlay_change` function which takes a POS and returns the next
>>> change after that, the xdisp.c might benefit from having a
>>> `next_overlay_changes` *generator* which takes a starting POS and
>>> returns an iterator which will return (each time it's called) the
>>> successive positions where there's an overlay change.
>>>=20
>>> Hopefully this way we'd pay the O(N) cost once per redisplayed window
>>> rather than once per "small step in the rendering engine" (i.e. per
>>> next_overlay_change).
>>=20
>> At the moment I can't think of a reasonable way to implement such a
>> generator efficiently without, effectively, computing a temporary
>> ordered collection over overlay END positions.
>>=20
>> This is why I keep coming back to the idea of storing both BEG and END
>> positions in ordered collections at all times.
>>=20
>>=20
>>> Another way to do basically the same is to let next_overlay_change
>>> fill up a cache of change-positions which would be flushed whenever
>>> some overlay is modified/added/removed (or the current_buffer is
>>> different from last time).  That might be easier to use with the
>>> current code since xdisp.c wouldn't need to pass around this iterator
>>> (which could require significant reworks).
>>=20
>> ...possibly, but the problem with caching is the time spent filling the
>> cache back up.  I like the idea of storing both BEG and END positions in
>> an ordered collection because in that case the (potentially slow)
>> recomputation need not occur with every key press.  If we're not worried
>> about that kind per-key-press of delay, then I argue there is no need
>> for a cache either.





Information forwarded to bug-gnu-emacs@HIDDEN:
bug#58361; Package emacs. Full text available.

Message received at submit <at> debbugs.gnu.org:


Received: (at submit) by debbugs.gnu.org; 7 Oct 2022 18:14:41 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Fri Oct 07 14:14:41 2022
Received: from localhost ([127.0.0.1]:37329 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1ogrrs-0001fH-PQ
	for submit <at> debbugs.gnu.org; Fri, 07 Oct 2022 14:14:41 -0400
Received: from lists.gnu.org ([209.51.188.17]:49324)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <mail@HIDDEN>) id 1ogqZO-00085B-8m
 for submit <at> debbugs.gnu.org; Fri, 07 Oct 2022 12:51:30 -0400
Received: from eggs.gnu.org ([2001:470:142:3::10]:57950)
 by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)
 (Exim 4.90_1) (envelope-from <mail@HIDDEN>)
 id 1ogqZN-0001pK-Nw
 for bug-gnu-emacs@HIDDEN; Fri, 07 Oct 2022 12:51:29 -0400
Received: from mout.kundenserver.de ([212.227.126.130]:55023)
 by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)
 (Exim 4.90_1) (envelope-from <mail@HIDDEN>)
 id 1ogqZK-00041N-PN; Fri, 07 Oct 2022 12:51:29 -0400
Received: from smtpclient.apple ([77.181.178.184]) by mrelayeu.kundenserver.de
 (mreue012 [213.165.67.97]) with ESMTPSA (Nemesis) id
 1MJnnV-1oRe291dqT-00K9io; Fri, 07 Oct 2022 18:51:16 +0200
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable
From: Andreas Politz <mail@HIDDEN>
Mime-Version: 1.0 (1.0)
Subject: Re: 29.0.50; noverlay branch is O(N) for important calls
Date: Fri, 7 Oct 2022 18:51:14 +0200
Message-Id: <D54E3787-D89B-43E1-A03E-75DFC6A34A62@HIDDEN>
References: <878rlrfyje.fsf@HIDDEN>
In-Reply-To: <878rlrfyje.fsf@HIDDEN>
To: Matt Armstrong <matt@HIDDEN>
X-Mailer: iPad Mail (19G82)
X-Provags-ID: V03:K1:fzXBlZNteNLENboVA/hlyJcvuu1kDBiI4uNkLz7grifTm+Iw4Vk
 WRvP022ngLL0DJ/V6F9/+Tj4DQXJxs4CP5ZVc4Zuoek3Z1Q+y8jzc3Aul+inIBgfLhTYgEl
 vgK5HY4tHZTUvOUQOO5G+8tV57a8M0lzi6m9QyErXkaM8Wo5KfzZzRB06Vt5pJNRVljO72Q
 RK/bBLfThOLfRs82kh/sg==
X-Spam-Flag: NO
X-UI-Out-Filterresults: notjunk:1;V03:K0:oxOSyS6HEzY=:5woV7akfpcILVaBLPZiHMm
 Ad2OLhUwJZrMow4S3dK8kXSie0sItgCH6pDGALHtCIb5rR/aFzzU2Ku6FR3mtayl7FsMMV1bo
 QNQ/LHLAPtdctmwxK0/Y/jT41SJJSBQS4o1kWI111M1pXc63T6t4MvoZeAKoLRQ0EfpT3t4sY
 c27uAYHzAzQdv8xEfMSCk/gVnQy87Qcn4HerX1ZAZ0BjvRvEXnj9b42tM4BwrTZH+95SsQHDV
 gEbcodPhhyiGYPSJcMr1j9vUQsmlC/Sj5Vwqy35FEGywyXmTLAsVHdzN2+YBnDYGjEVxFz6Jv
 Cv1nFbnA+S3YGLMqYQ9kruqhSC8wnk1sqbKNtRg80J29WB6QepM0rNhVSOh948JqzepOPzM7I
 CMcGhzhUGosOtuM9io2DEju4HQfFxc7U2YknoPWffh0e6/UTb838jsV9CotaUgZITS2WmHe5t
 kNqaOxvp5t+H6Na5P3nLRwHSdcpFn6XFz8UMPjEL6r1YsjGcYQu6rmnQR4qX2NjvT9PNKQ0x7
 S8bOk4p03WUhef6WAte/mYgWyZG2MAP0FHCzg6tpQqVJO0hoYkn7fi+/VN76jqt1Y+U3Mz2nd
 W98RajWddSWOVb5EuLFDzg4azHlY6gApVmKQvDNpbrmIZCS4DVwkqXJNEUZZKjN+kSNrgm5YM
 al1X90V/nIdIiUPvUU2iZQi+c1pNlUA5+OFuC2i9dDFTuXpWzajOpGmCfvjytrtu6aPBNxdSB
 1r4+39bCood2pDXGzsbXYBTUeIC6g1XXLURLPAlP7EBSL0s6na+UeXpUbpm2eo5hN3HrL3IWH
 Ur6kcLa660KZWKXkFZHUswueU7HQw==
Received-SPF: none client-ip=212.227.126.130;
 envelope-from=mail@HIDDEN; helo=mout.kundenserver.de
X-Spam_score_int: -18
X-Spam_score: -1.9
X-Spam_bar: -
X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, RCVD_IN_DNSWL_NONE=-0.0001,
 RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001,
 SPF_NONE=0.001 autolearn=ham autolearn_force=no
X-Spam_action: no action
X-Spam-Score: -2.3 (--)
X-Debbugs-Envelope-To: submit
X-Mailman-Approved-At: Fri, 07 Oct 2022 14:14:39 -0400
Cc: =?utf-8?Q?Gerd_M=C3=B6llmann?= <gerd.moellmann@HIDDEN>,
 bug-gnu-emacs@HIDDEN, Eli Zaretskii <eliz@HIDDEN>,
 Stefan Monnier <monnier@HIDDEN>
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -3.3 (---)

I think, a straightforward way   to use 2 trees, one for begin and one for e=
nd, could be to create another abstraction above those trees, while for the m=
ost part  duplicating the existing  interface.  This abstraction would then e=
ither delegate to one or both trees, depending on the operation. The trick w=
ould be to kinda multiplying the end-tree by -1,  i.e. reverse begin and end=
 and multiply with -1 all inputs and outputs of this tree.

Would that work ?

> Am 07.10.2022 um 17:23 schrieb Matt Armstrong <matt@HIDDEN>:
>=20
> =EF=BB=BFTo start, I don't think this issue should delay a merge to master=
.  I
> don't think it is clear we need to fix anything here.
>=20
> I would like a note or FIXME in code noting the potentially slow
> algorithm (patch sent), because it is currently well hidden behind a
> generator loop.
>=20
>=20
> Stefan Monnier <monnier@HIDDEN> writes:
>=20
>>> Here we traverse overlays in ASCENDING order of BEG positions.  The best=

>>> we can say is that this loop executes in O(K*log(N)) time, where K is
>>> the MIN of number of overlays that overlap POS and the number of valid
>>=20
>> The core operation in itree.c is the equivalent of `overlays-in/at`.
>=20
> [...]
>=20
> Yes, and for this O(K*log(N)) performance is a good result.  The key
> insight is that previous and next overlay changes require examining a
> large K (in worst case, extending all the way to the beginning or end of
> the buffer) because there is no ordering by END positions.
>=20
>> Realistic benchmarks would be most welcome.
>=20
> I am working on polishing off
> https://git.sr.ht/~matta/emacs-overlay-perftests.  Good news is that
> redisplay is faster on the noverlay branch for the "realistic" case of
> overlaping not overlapping eachother in pathalogical ways.
>=20
>=20
>> [ Site note: `previous-overlay-change` is probably not very important in
>>  practice, but `next-overlay-change` OTOH is indeed important because
>>  it's used during redisplay.  So if someone comes up with a trick to
>>  speed up only one direction, it should be good enough.  ]
>>=20
>> Maybe one way to improve the behavior is to accept the worst-case
>> bound but to try and avoid paying it over-and-over each time the
>> redisplay needs the "next change".  IOW instead of a
>> `next_overlay_change` function which takes a POS and returns the next
>> change after that, the xdisp.c might benefit from having a
>> `next_overlay_changes` *generator* which takes a starting POS and
>> returns an iterator which will return (each time it's called) the
>> successive positions where there's an overlay change.
>>=20
>> Hopefully this way we'd pay the O(N) cost once per redisplayed window
>> rather than once per "small step in the rendering engine" (i.e. per
>> next_overlay_change).
>=20
> At the moment I can't think of a reasonable way to implement such a
> generator efficiently without, effectively, computing a temporary
> ordered collection over overlay END positions.
>=20
> This is why I keep coming back to the idea of storing both BEG and END
> positions in ordered collections at all times.
>=20
>=20
>> Another way to do basically the same is to let next_overlay_change
>> fill up a cache of change-positions which would be flushed whenever
>> some overlay is modified/added/removed (or the current_buffer is
>> different from last time).  That might be easier to use with the
>> current code since xdisp.c wouldn't need to pass around this iterator
>> (which could require significant reworks).
>=20
> ...possibly, but the problem with caching is the time spent filling the
> cache back up.  I like the idea of storing both BEG and END positions in
> an ordered collection because in that case the (potentially slow)
> recomputation need not occur with every key press.  If we're not worried
> about that kind per-key-press of delay, then I argue there is no need
> for a cache either.





Acknowledgement sent to Andreas Politz <mail@HIDDEN>:
New bug report received and forwarded. Copy sent to bug-gnu-emacs@HIDDEN. Full text available.
Report forwarded to bug-gnu-emacs@HIDDEN:
bug#58361; Package emacs. Full text available.
Please note: This is a static page, with minimal formatting, updated once a day.
Click here to see this page with the latest information and nicer formatting.
Last modified: Thu, 13 Oct 2022 14:00:02 UTC

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