GNU bug report logs - #58950
[PATCH] * lisp/subr.el (buffer-match-p): Optimise performance

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; Severity: wishlist; Reported by: Philip Kaludercic <philipk@HIDDEN>; Keywords: patch; dated Tue, 1 Nov 2022 19:12:02 UTC; Maintainer for emacs is bug-gnu-emacs@HIDDEN.
Severity set to 'wishlist' from 'normal' Request was from Stefan Kangas <stefankangas@HIDDEN> to control <at> debbugs.gnu.org. Full text available.

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


Received: (at 58950) by debbugs.gnu.org; 7 Nov 2022 01:04:50 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Sun Nov 06 20:04:50 2022
Received: from localhost ([127.0.0.1]:60944 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1orqZG-0007dr-4v
	for submit <at> debbugs.gnu.org; Sun, 06 Nov 2022 20:04:50 -0500
Received: from mail-wr1-f52.google.com ([209.85.221.52]:34551)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <raaahh@HIDDEN>) id 1orqZA-0007db-Lj
 for 58950 <at> debbugs.gnu.org; Sun, 06 Nov 2022 20:04:48 -0500
Received: by mail-wr1-f52.google.com with SMTP id k8so14142958wrh.1
 for <58950 <at> debbugs.gnu.org>; Sun, 06 Nov 2022 17:04:44 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112;
 h=content-transfer-encoding:in-reply-to:from:references:to
 :content-language:subject:user-agent:mime-version:date:message-id
 :sender:from:to:cc:subject:date:message-id:reply-to;
 bh=qzu3dA7mFWJmo4aSwSsRj/PbqS+lVjQKUWXRVGrx3Vo=;
 b=TpFtkLICGd8YMmLdKztdpEFaNU84sxwM7vcv/qblfQ2zVvy//BDedOu2ZrQ7SRz9cA
 Vh7hP3YY2dAkhPuODb9Lql/MSRnCwnONOy6QmQAnC8+HXzZafc0PIb5oPMc52oxoN/Dn
 isBLcfO8xLPBR7agmISTjyJlQcNHewCznSDjqZOSem7HybF4cGjT1QXup0Rb4SSLHRpW
 B8ggVScYzM+dpXvnUhCmXlW7E2YvNJRDqj7wexC+L/bDU1l816H5BTvlH3XWV1bjrwHd
 lUWfvqgmuNFJ7G9zjjZN4jfZbA4rhKzgoSJ9keYoriSAjiig6lwPGutbNbeXtTFnCIwg
 F4Yg==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20210112;
 h=content-transfer-encoding:in-reply-to:from:references:to
 :content-language:subject:user-agent:mime-version:date:message-id
 :sender:x-gm-message-state:from:to:cc:subject:date:message-id
 :reply-to;
 bh=qzu3dA7mFWJmo4aSwSsRj/PbqS+lVjQKUWXRVGrx3Vo=;
 b=wL0BzF2Xr7sHDtR9+oTp1uy1SddS2hqb5WsHqpR7FgnrlAG3vP5aWjawijH/UJTlaE
 JVO6tglpmYOkirmKTTR5un44798GHqRD1x+UGVG14lM3reQcgKoMmQJsvm2Xh00cBlwf
 D/w2PxaOzbeZBn+BjtF4Joj2gVTDtHA3FgfRk0RAX1UU2WB2SgPzvxmVFDhvjWyND3g4
 l4ZwIM/u0xGgy+TS6AbmXFau2yhQOvhV9aapfoaJ17WwL1xQmJTZudXszFJGJLdskHLp
 iF0wgmWrpx/J33ga2RCnwDl3RFvGDYM8h9gbsLrRygKWcyQX4d0EGMVxujMBJ6QdqfQa
 WsRw==
X-Gm-Message-State: ACrzQf2hnT02N+EIxXrQZhNOK57RVVX2uMDI+cZF6G09pyZUdc1pU5Qc
 WYMVoH0H46TjMJRjY65Ha74=
X-Google-Smtp-Source: AMsMyM6WsAkgMm+chpw2U428mLPwOIdqpm/GL38uXyNgyvyfQXE61Oy/3BQV9llRCayMrzdpsJ1p+A==
X-Received: by 2002:a5d:4711:0:b0:236:48b6:cb89 with SMTP id
 y17-20020a5d4711000000b0023648b6cb89mr30364336wrq.246.1667783078710; 
 Sun, 06 Nov 2022 17:04:38 -0800 (PST)
Received: from [192.168.0.6] ([46.251.119.176])
 by smtp.googlemail.com with ESMTPSA id
 j7-20020a05600c190700b003b477532e66sm27918395wmq.2.2022.11.06.17.04.37
 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128);
 Sun, 06 Nov 2022 17:04:38 -0800 (PST)
Message-ID: <c08e7175-aa5c-0c46-7dc0-9be2658cd711@HIDDEN>
Date: Mon, 7 Nov 2022 03:04:35 +0200
MIME-Version: 1.0
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101
 Thunderbird/102.2.2
Subject: Re: bug#58950: [PATCH] * lisp/subr.el (buffer-match-p): Optimise
 performance
Content-Language: en-US
To: Philip Kaludercic <philipk@HIDDEN>, 58950 <at> debbugs.gnu.org
References: <875yfyebi0.fsf@HIDDEN>
From: Dmitry Gutov <dgutov@HIDDEN>
In-Reply-To: <875yfyebi0.fsf@HIDDEN>
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 7bit
X-Spam-Score: -1.3 (-)
X-Debbugs-Envelope-To: 58950
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 (--)

On 01.11.2022 21:11, Philip Kaludercic wrote:
> 1. Style.  I wrap the defun in a let (or rather letrec) block to avoid
>     littering the global namespace.  It isn't necessary, and one could
>     argue it makes debugging more difficult.
> 
> 2. Caching policy.  Caching is critical to this optimisation.  Just
>     using byte-compilation would cause the above test to slow down to
>     (76.323692627 656 57.088315405).  The question is if the hash map
>     will collect too much garbage over time, and if there is a better
>     approach that could be taken?

I'd like to let our language-level specialists to take the deeper look.

This approach looks the most straightforward, but there could be others, 
just like "compiling" the form inside defcustom setter (for 
project-kill-buffer-conditions, and every similar option), doing 
precompilation closer to where the rules are used (similar to 
font-lock-compile-keywords), or not doing any of that. All depending on 
how long a typical compilation takes, and how many buffers the user has 
to have, to see any noticeable benefit.

On the last note, I'm curious how many buffers would it take to see a 
50ms improvement in match-buffers' runtime when using the current 
project-kill-buffer-conditions's value, for example.




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

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


Received: (at 58950) by debbugs.gnu.org; 4 Nov 2022 23:00:25 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Fri Nov 04 19:00:25 2022
Received: from localhost ([127.0.0.1]:55033 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1or5fl-000170-Gc
	for submit <at> debbugs.gnu.org; Fri, 04 Nov 2022 19:00:25 -0400
Received: from mout01.posteo.de ([185.67.36.65]:33081)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <philipk@HIDDEN>) id 1or5fg-00016g-Jk
 for 58950 <at> debbugs.gnu.org; Fri, 04 Nov 2022 19:00:24 -0400
Received: from submission (posteo.de [185.67.36.169]) 
 by mout01.posteo.de (Postfix) with ESMTPS id 13AD124002B
 for <58950 <at> debbugs.gnu.org>; Sat,  5 Nov 2022 00:00:15 +0100 (CET)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=posteo.net; s=2017;
 t=1667602815; bh=F/sXLNWDxrmVaz9NXg3JdkL54yuregoCr0vvNffAlFY=;
 h=From:To:Subject:Autocrypt:Date:From;
 b=SmlDB2WzSD1V/Kejn/jOgd73FVVnAD6+NTo+ujesH8KwFchutazJ3o1XDG7a4ftlo
 9VgJ9DtuRDpTkCrFgB0tUIbm19HTA7Q0GojdMNfFAiHtx1p6LEKZykvobUb22XQGLI
 A80rPbTGGeNT7s6fbrKWTQjaYF7rpaJ994zt/P2gLO6+LiRE1cWWM3uKdF4DCnsJi8
 5/Np7sEB7JSM8jZn7uUQ3aHkDkNE3V/VliPmgMfk+TkLsTqc9/sCLrv4/JJrDwRHWU
 n1nj1dr1ApekO4PQkHpxQ6KmczMhZLkzAeYdy1YnWY2gBb9u/OIMAQXoP8YRWUZqVW
 pJ/X4N2Ikyufw==
Received: from customer (localhost [127.0.0.1])
 by submission (posteo.de) with ESMTPSA id 4N3x0t03Pgz6ttj
 for <58950 <at> debbugs.gnu.org>; Sat,  5 Nov 2022 00:00:12 +0100 (CET)
From: Philip Kaludercic <philipk@HIDDEN>
To: 58950 <at> debbugs.gnu.org
Subject: Re: bug#58950: [PATCH] * lisp/subr.el (buffer-match-p): Optimise
 performance
In-Reply-To: <875yfyebi0.fsf@HIDDEN> (Philip Kaludercic's message of "Tue, 
 01 Nov 2022 19:11:03 +0000")
References: <875yfyebi0.fsf@HIDDEN>
Autocrypt: addr=philipk@HIDDEN; keydata=
 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
Date: Fri, 04 Nov 2022 23:00:12 +0000
Message-ID: <878rkqjpfn.fsf@HIDDEN>
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable
X-Spam-Score: -2.3 (--)
X-Debbugs-Envelope-To: 58950
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 (---)

Philip Kaludercic <philipk@HIDDEN> writes:

> Tags: patch
>
>
> The below patch is based on a tangent discussion in bug#58839, the below
> patch was written in collaboration with Jo=C3=A3o T=C3=A1vora.  It involv=
es an
> optimisation to `buffer-match-p' that dramatically speeds the execution
> of the function.  This is important for the very least as
> `buffer-match-p' is used for displaying buffer.
>
> Running (benchmark-run 1000 (match-buffers "\\*.+\\*")) I previously got
> (22.822269875 178 15.524474267999977), and with the patch applied
> (0.27100275 2 0.1730835160000197).
>
> There are a few points that can be discussed:
>
> 1. Style.  I wrap the defun in a let (or rather letrec) block to avoid
>    littering the global namespace.  It isn't necessary, and one could
>    argue it makes debugging more difficult.
>
> 2. Caching policy.  Caching is critical to this optimisation.  Just
>    using byte-compilation would cause the above test to slow down to
>    (76.323692627 656 57.088315405).  The question is if the hash map
>    will collect too much garbage over time, and if there is a better
>    approach that could be taken?
>
> In GNU Emacs 29.0.50 (build 3, x86_64-pc-linux-gnu, GTK+ Version
>  3.24.30, cairo version 1.16.0) of 2022-10-31 built on heron
> Repository revision: 462a66e79edcc34ecbeef7cc1604765adfdc038e
> Repository branch: feature/package+vc
> System Description: Guix System
>
> Configured using:
>  'configure --with-pgtk --with-imagemagick
>  PKG_CONFIG_PATH=3D/gnu/store/ssg343s6ldqdwh30136pnawhbgd0cb6i-profile/li=
b/pkgconfig:/gnu/store/ssg343s6ldqdwh30136pnawhbgd0cb6i-profile/share/pkgco=
nfig'

Ping?




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

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


Received: (at submit) by debbugs.gnu.org; 1 Nov 2022 19:11:17 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Tue Nov 01 15:11:17 2022
Received: from localhost ([127.0.0.1]:44250 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1opwfI-00074W-V9
	for submit <at> debbugs.gnu.org; Tue, 01 Nov 2022 15:11:17 -0400
Received: from lists.gnu.org ([209.51.188.17]:59336)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <philipk@HIDDEN>) id 1opwfG-00074O-RO
 for submit <at> debbugs.gnu.org; Tue, 01 Nov 2022 15:11:11 -0400
Received: from eggs.gnu.org ([2001:470:142:3::10])
 by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)
 (Exim 4.90_1) (envelope-from <philipk@HIDDEN>)
 id 1opwfG-0005il-Jy
 for bug-gnu-emacs@HIDDEN; Tue, 01 Nov 2022 15:11:10 -0400
Received: from mout02.posteo.de ([185.67.36.66])
 by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)
 (Exim 4.90_1) (envelope-from <philipk@HIDDEN>)
 id 1opwfD-0000AZ-8s
 for bug-gnu-emacs@HIDDEN; Tue, 01 Nov 2022 15:11:10 -0400
Received: from submission (posteo.de [185.67.36.169]) 
 by mout02.posteo.de (Postfix) with ESMTPS id D189A240103
 for <bug-gnu-emacs@HIDDEN>; Tue,  1 Nov 2022 20:11:04 +0100 (CET)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=posteo.net; s=2017;
 t=1667329864; bh=X3hp3DOimqNA/sHJyFisRQo6gxIdDOOkG9TsQbnfutY=;
 h=From:To:Subject:Autocrypt:Date:From;
 b=QxhFbslYDteLXfV1DEw7k/qzVNyckFS9JRKAA4zRQ1lemsvdzPNsCXBXreaQivC1b
 bHkDrgh4qvTjW1hIsGDV/ia4OmriMP9ytfDtxqvic95668G5PkQoBv2nf7S7gqRCLb
 +oMH3Qv5bOV8Pkb4BBk6oOJaYrnp0qDEQr3ZBoyDXHyyg99pRbTaBaywVTxSheblTJ
 l5fpkBAtWbstp1gynXpnE7KIGPFWtjRFlVnp3uqQmsvxi70y891laqRCfMYq+hSsGs
 vVUODiCfwLRoXaGsxxha2e7zrryWLpZ7YzNEt6YaBJZEsU79c5FNBKLjHfKMDTHkkZ
 gCzDsIyufKVMw==
Received: from customer (localhost [127.0.0.1])
 by submission (posteo.de) with ESMTPSA id 4N203r1jXYz6tmL
 for <bug-gnu-emacs@HIDDEN>; Tue,  1 Nov 2022 20:11:03 +0100 (CET)
From: Philip Kaludercic <philipk@HIDDEN>
To: bug-gnu-emacs@HIDDEN
Subject: [PATCH] * lisp/subr.el (buffer-match-p): Optimise performance
Autocrypt: addr=philipk@HIDDEN; prefer-encrypt=nopreference; keydata=
 mDMEYHHqUhYJKwYBBAHaRw8BAQdAp3GdmYJ6tm5McweY6dEvIYIiry+Oz9rU4MH6NHWK0Ee0QlBo
 aWxpcCBLYWx1ZGVyY2ljIChnZW5lcmF0ZWQgYnkgYXV0b2NyeXB0LmVsKSA8cGhpbGlwa0Bwb3N0
 ZW8ubmV0PoiQBBMWCAA4FiEEDM2H44ZoPt9Ms0eHtVrAHPRh1FwFAmBx6lICGwMFCwkIBwIGFQoJ
 CAsCBBYCAwECHgECF4AACgkQtVrAHPRh1FyTkgEAjlbGPxFchvMbxzAES3r8QLuZgCxeAXunM9gh
 io0ePtUBALVhh9G6wIoZhl0gUCbQpoN/UJHI08Gm1qDob5zDxnIHuDgEYHHqUhIKKwYBBAGXVQEF
 AQEHQNcRB+MUimTMqoxxMMUERpOR+Q4b1KgncDZkhrO2ql1tAwEIB4h4BBgWCAAgFiEEDM2H44Zo
 Pt9Ms0eHtVrAHPRh1FwFAmBx6lICGwwACgkQtVrAHPRh1Fw1JwD/Qo7kvtib8jy7puyWrSv0MeTS
 g8qIxgoRWJE/KKdkCLEA/jb9b9/g8nnX+UcwHf/4VfKsjExlnND3FrBviXUW6NcB
Date: Tue, 01 Nov 2022 19:11:03 +0000
Message-ID: <875yfyebi0.fsf@HIDDEN>
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="=-=-="
Received-SPF: pass client-ip=185.67.36.66; envelope-from=philipk@HIDDEN;
 helo=mout02.posteo.de
X-Spam_score_int: -20
X-Spam_score: -2.1
X-Spam_bar: --
X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1,
 DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1,
 RCVD_IN_MSPIKE_H2=-0.001, 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
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 (--)

--=-=-=
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable

Tags: patch


The below patch is based on a tangent discussion in bug#58839, the below
patch was written in collaboration with Jo=C3=A3o T=C3=A1vora.  It involves=
 an
optimisation to `buffer-match-p' that dramatically speeds the execution
of the function.  This is important for the very least as
`buffer-match-p' is used for displaying buffer.

Running (benchmark-run 1000 (match-buffers "\\*.+\\*")) I previously got
(22.822269875 178 15.524474267999977), and with the patch applied
(0.27100275 2 0.1730835160000197).

There are a few points that can be discussed:

1. Style.  I wrap the defun in a let (or rather letrec) block to avoid
   littering the global namespace.  It isn't necessary, and one could
   argue it makes debugging more difficult.

2. Caching policy.  Caching is critical to this optimisation.  Just
   using byte-compilation would cause the above test to slow down to
   (76.323692627 656 57.088315405).  The question is if the hash map
   will collect too much garbage over time, and if there is a better
   approach that could be taken?

In GNU Emacs 29.0.50 (build 3, x86_64-pc-linux-gnu, GTK+ Version
 3.24.30, cairo version 1.16.0) of 2022-10-31 built on heron
Repository revision: 462a66e79edcc34ecbeef7cc1604765adfdc038e
Repository branch: feature/package+vc
System Description: Guix System

Configured using:
 'configure --with-pgtk --with-imagemagick
 PKG_CONFIG_PATH=3D/gnu/store/ssg343s6ldqdwh30136pnawhbgd0cb6i-profile/lib/=
pkgconfig:/gnu/store/ssg343s6ldqdwh30136pnawhbgd0cb6i-profile/share/pkgconf=
ig'


--=-=-=
Content-Type: text/patch
Content-Disposition: attachment;
 filename=0002-lisp-subr.el-buffer-match-p-Accelerate-using-byte-co.patch

From 0a9ddbcc6958fa7ed94456722a3eee65582a56b2 Mon Sep 17 00:00:00 2001
From: Philip Kaludercic <philipk@HIDDEN>
Date: Tue, 1 Nov 2022 19:57:49 +0100
Subject: [PATCH] * lisp/subr.el (buffer-match-p): Optimise performance

---
 lisp/subr.el | 75 +++++++++++++++++++++++++++-------------------------
 1 file changed, 39 insertions(+), 36 deletions(-)

diff --git a/lisp/subr.el b/lisp/subr.el
index 83e2e75c41..0dd7a814d9 100644
--- a/lisp/subr.el
+++ b/lisp/subr.el
@@ -7002,8 +7002,38 @@ string-lines
             (setq start (length string)))))
       (nreverse lines))))
 
-(defun buffer-match-p (condition buffer-or-name &optional arg)
-  "Return non-nil if BUFFER-OR-NAME matches CONDITION.
+(letrec ((buffer-sym (make-symbol "buffer"))
+         (arg-sym (make-symbol "arg"))
+         (translate
+          (lambda (condition)
+            "Compile a CONDITION into a predicate function."
+            (pcase-exhaustive condition
+              ((or 't 'nil)
+               condition)
+              ((pred stringp)
+               `(string-match-p ,condition (buffer-name ,buffer-sym)))
+              ((pred functionp)
+               (if (eq 1 (cdr (func-arity condition)))
+                   `(condition ,buffer-sym)
+                 `(condition
+                   ,buffer-sym
+                   ,arg-sym)))
+              (`(major-mode . ,mode)
+               `(eq (buffer-local-value 'major-mode ,buffer-sym)
+                    ',mode))
+              (`(derived-mode . ,mode)
+               `(provided-mode-derived-p
+                 (buffer-local-value 'major-mode ,buffer-sym)
+                 ',mode))
+              (`(not . ,cond)
+               `(not ,(funcall translate cond)))
+              (`(or . ,conds)
+               `(or ,@(mapcar translate conds)))
+              (`(and . ,conds)
+               `(and ,@(mapcar translate conds))))))
+         (cond-cache (make-hash-table :test 'eq)))
+  (defun buffer-match-p (condition buffer-or-name &optional arg)
+    "Return non-nil if BUFFER-OR-NAME matches CONDITION.
 CONDITION is either:
 - the symbol t, to always match,
 - the symbol nil, which never matches,
@@ -7022,40 +7052,13 @@ buffer-match-p
     to be met.
   * `or': the cdr is a list of recursive condition, of which at
     least one has to be met."
-  (letrec
-      ((buffer (get-buffer buffer-or-name))
-       (match
-        (lambda (conditions)
-          (catch 'match
-            (dolist (condition conditions)
-              (when (pcase condition
-                      ('t t)
-                      ((pred stringp)
-                       (string-match-p condition (buffer-name buffer)))
-                      ((pred functionp)
-                       (if (eq 1 (cdr (func-arity condition)))
-                           (funcall condition buffer)
-                         (funcall condition buffer arg)))
-                      (`(major-mode . ,mode)
-                       (eq
-                        (buffer-local-value 'major-mode buffer)
-                        mode))
-                      (`(derived-mode . ,mode)
-                       (provided-mode-derived-p
-                        (buffer-local-value 'major-mode buffer)
-                        mode))
-                      (`(not . ,cond)
-                       (not (funcall match cond)))
-                      (`(or . ,args)
-                       (funcall match args))
-                      (`(and . ,args)
-                       (catch 'fail
-                         (dolist (c args)
-                           (unless (funcall match (list c))
-                             (throw 'fail nil)))
-                         t)))
-                (throw 'match t)))))))
-    (funcall match (list condition))))
+    (funcall (or (gethash condition cond-cache)
+                 (puthash condition
+                          (byte-compile
+                           `(lambda (,buffer-sym ,arg-sym)
+                              ,(funcall translate condition)))
+                          cond-cache))
+             (get-buffer buffer-or-name) arg)))
 
 (defun match-buffers (condition &optional buffers arg)
   "Return a list of buffers that match CONDITION.
-- 
2.38.0


--=-=-=--




Acknowledgement sent to Philip Kaludercic <philipk@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#58950; 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: Sat, 12 Nov 2022 20:45:02 UTC

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