Received: (at 77620-done) by debbugs.gnu.org; 26 Apr 2025 11:23:12 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Sat Apr 26 07:23:12 2025 Received: from localhost ([127.0.0.1]:58740 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1u8dcm-00013g-8r for submit <at> debbugs.gnu.org; Sat, 26 Apr 2025 07:23:12 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:56594) by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.84_2) (envelope-from <eliz@HIDDEN>) id 1u8dcj-00013R-4r for 77620-done <at> debbugs.gnu.org; Sat, 26 Apr 2025 07:23:10 -0400 Received: from fencepost.gnu.org ([2001:470:142:3::e]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from <eliz@HIDDEN>) id 1u8dcd-0006xo-Km; Sat, 26 Apr 2025 07:23:03 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=gnu.org; s=fencepost-gnu-org; h=References:Subject:In-Reply-To:To:From:Date: mime-version; bh=sweMG9Om3/Q1FTqI/3zwDunjMpZPvctNVsG1g8x+b4g=; b=GCYhaUUjWN4B Be6dECnxXmYM69u5zFlEvH7jiqkbLrfHKXVS+C1x8hrDDckouC1T9DdI4QOF1fOaLSYuvuAa0w/U2 LV2SotBk/AXwJPD/vQyIcMrrkxu/AOc4qqvxT/1z7FSuW9FNqFR7Bg3mUstEzqSr5wWCqVgeApPtO GTgy0WJtrLGeuUNFgYVMhI4H0804jc++HlP0sjExYTvKZgMk8j0xrVtmOgEi6wqFWnd4os+2sK0E3 3AdCY3aaDyK9V/ysMkev7dgwbTZNDpxza9GKztEN1ZgeLRV/aRTVR2afMMJ1h67geqnWlGH4r/EaY wqgTy8WHzGmzQmPjXOHPRA==; Date: Sat, 26 Apr 2025 14:22:59 +0300 Message-Id: <86ikmrupyk.fsf@HIDDEN> From: Eli Zaretskii <eliz@HIDDEN> To: kobarity <kobarity@HIDDEN> In-Reply-To: <eke7zfg9wq5l.wl-kobarity@HIDDEN> (message from kobarity on Mon, 21 Apr 2025 23:22:14 +0900) Subject: Re: bug#77620: thingatpt can be incredibly slow in python-mode buffers References: <DD4BC1EE-246D-4080-9B93-07D359F8C70E@HIDDEN> <86cydnsz5v.fsf@HIDDEN> <eke7cydluz80.wl-kobarity@HIDDEN> <86semhqqml.fsf@HIDDEN> <eke74iyiyita.wl-kobarity@HIDDEN> <eke7zfg9wq5l.wl-kobarity@HIDDEN> X-Spam-Score: -2.3 (--) X-Debbugs-Envelope-To: 77620-done Cc: 77620-done <at> debbugs.gnu.org, jdtsmith@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 (---) > Date: Mon, 21 Apr 2025 23:22:14 +0900 > From: kobarity <kobarity@HIDDEN> > Cc: 77620 <at> debbugs.gnu.org > > kobarity wrote: > > In the process of looking into #77620, I noticed bugs in the > > end-of-block detection functions. So I submitted a patch to #77941. > > Please note that the patch attached to this mail assumes the #77941 > > patch. > > > > In my environment, the next test shows about 2 seconds on _axes.py's > > L8817. > > > > > (/ (car (benchmark-run 10 (thing-at-point 'sexp))) 10) > > > > But there are worse cases. Let's add the next two lines to the end of > > _axes.py with 4-character indent. > > > > a = 1 > > b = 2 > > > > The same measurement at the end of line "a = 1" gives 6 seconds; at > > the end of line "b = 2" it gives 7 seconds. This is because it calls > > time-consuming functions many times. > > > > `python-nav-beginning-of-block' and `python-nav-end-of-block' are very > > time consuming if the block is large. In the case of _axes.py, "class > > Axes" is a large block with over 8000 lines. > > > > However, `python-nav-forward-sexp' that (thing-at-point 'sexp) calls > > does not necessarily have to perform these functions. They are just > > called by `python-info-statement-ends-block-p': (Before #77941 patch) > > > > (defun python-info-statement-ends-block-p () > > "Return non-nil if point is at end of block." > > (let ((end-of-block-pos (save-excursion > > (python-nav-end-of-block))) > > (end-of-statement-pos (save-excursion > > (python-nav-end-of-statement)))) > > (and end-of-block-pos end-of-statement-pos > > (= end-of-block-pos end-of-statement-pos)))) > > > > The logic is that if the end of the current statement is the end of > > the current block, then it is the last line of the block. This is not > > wrong, but the problem is that it takes time to move to the end of the > > block. > > > > Fortunately, in many cases it is much easier to determine that it is > > not the end of the block. Specifically, if the indentation of the > > next statement is equal to or greater than the indentation of the > > current statement, then the current statement cannot be the end of the > > block. The attached patch > > 0001-Performance-optimization-of-python-info-statement-en.patch takes > > advantage of this to improve the performance of > > `python-info-statement-ends-block-p'. Please remember that it assumes > > the #77941 patch is applied. > > > > 0001-Performance-optimization-of-python-info-statement-en.patch solves > > the performance problem with _axes.py, but does not have much effect > > on the problem with lines "a = 1" and "b = 2" added above. The > > attached patch > > 0002-Add-cache-to-Python-block-navigation-functions.patch is an > > attempt to introduce a cache to alleviate this problem. > > > > I measured the following to disable the cache for each benchmark. > > > > (/ (car (benchmark-run 10 (progn (thing-at-point 'sexp) (setq python-nav-cache nil)))) 10) > > > > It shows about 1.6 seconds for both "a = 1" and "b = 2" lines. > > > > I believe 0002-Add-cache-to-Python-block-navigation-functions.patch is > > a PoC level patch, so I welcome opinions on what you think of this > > direction. > > I revised 0002-Add-cache-to-Python-block-navigation-functions.patch. > There was no need to use a macro. Thanks, installed, and closing the bug.
JD Smith <jdtsmith@HIDDEN>
:Eli Zaretskii <eliz@HIDDEN>
:Received: (at 77620) by debbugs.gnu.org; 21 Apr 2025 14:22:27 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Mon Apr 21 10:22:27 2025 Received: from localhost ([127.0.0.1]:35883 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1u6s2U-00032q-Fx for submit <at> debbugs.gnu.org; Mon, 21 Apr 2025 10:22:26 -0400 Received: from mail-pl1-x634.google.com ([2607:f8b0:4864:20::634]:56386) by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.84_2) (envelope-from <kobarity@HIDDEN>) id 1u6s2R-00032P-91 for 77620 <at> debbugs.gnu.org; Mon, 21 Apr 2025 10:22:23 -0400 Received: by mail-pl1-x634.google.com with SMTP id d9443c01a7336-225477548e1so38783375ad.0 for <77620 <at> debbugs.gnu.org>; Mon, 21 Apr 2025 07:22:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1745245337; x=1745850137; darn=debbugs.gnu.org; h=mime-version:user-agent:references:in-reply-to:subject:cc:to:from :message-id:date:from:to:cc:subject:date:message-id:reply-to; bh=Ll1yhBNYXe03Gc7zQfO99lmpqnld8RPVUWkAcR4awAs=; b=FjtkJbq64lVkp62zJ06NYyh+piMVj1t28pvy4P5nrIaSTNJS7PObut1T0Gqmuw1Yl2 Iyq5IRvy5hBN2z1CxB5b7xVPnBDAbTjrHOE8YOD7lLcZ1zoTyMYeJChYmshNbAsr0zc3 e44ycMTJoeBbqp0fwrzkobPypTrbUclH/bj5qROK5Vt6OP4l1spQdqy0Aq9T+BgMZKio jts48a07CgE7GcyOWUI3TRJaVSxQRyz48oXbwaiY9Umv70o96i9uNRfLErPlpJN6BqGu MRDGq3ewLGct9E5IAiTvnca+XsiDIEfXsi3t0+P6/q63QlSTvSyRyQz/aVO5tOxmauKm wuPw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1745245337; x=1745850137; h=mime-version:user-agent:references:in-reply-to:subject:cc:to:from :message-id:date:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=Ll1yhBNYXe03Gc7zQfO99lmpqnld8RPVUWkAcR4awAs=; b=bvNri58V9kzZAP75m+EkiPa093fGxt1EtF9Z/mCT/wqRwhhfpIjgJ1MebS/uhdM+ww rLk+wLuP5Nsgq7JqMqgn2QBIuK1v9j5oHwgm8FtxuDpP+tmN03Un/1i0C+DdpOdaJo11 yujTxEMhh6ue+5boKXCi4+gvxv372HnZR73YroOIi322sGsvqSLClfPM2LfmBqEBbXiz iFINiLAlqmmCkBy3GkN0Clt9aTYH7xyoNJvyjUmFHdXT2MyrjV7tHwoR3G8Cof03ihyL aKO9U6zYAaTLXxtiP+fb33M1gbEDYqSDvLr0Oj+WeBO4Zaj9mdMLBspaKLhcuf4y+P0r D93Q== X-Gm-Message-State: AOJu0YwNBJMWjzbGZLnAxlKSWwBcPc3Rlk3iPMlh6szl/JXz5yGAx0an gt8vijkhRNKnPbsu4FrEQwDAcO3bt8S0suE6/9r7tAdHyuGaMi6E X-Gm-Gg: ASbGncv1DoT8AiKx3TxkoR74DtU5T8nYLCIYun+F7qWQmF0amKR9AMPisKvYSsiHOzc 1IqJ7T0qu7kP4NAlt+UPle20pl00oQKxAnHZU1lrO+6vf3sidjuUc94DnUQGmXQ0ey5QRTNMAFH b0CRYtyd+n0WC1IfdULyZ8hmg+im7RHBJnAQZS6YC+Eviu3JRPhJCMobcStkE7B3bS2il2uUaN7 zDOSYv/6n5Bf7h7yh9sGsLSIgZw7AAv5fTZ5I9hc7PjwqQuoVT0ehEPifMXWwV03VdzOiylEyRn IleIgC7dxvthA0iRuYGQVD6klKvV/M0dBYYyXXlpKn8jp09dnx72cWo0Msy0azosQo5hSyI= X-Google-Smtp-Source: AGHT+IGODLCkxC5HRevFtbF/AiKuhbgwCQBx11+UQ1IPAyWFQBbQHyzQTrwRtx5TukuZ5lsYdzxAew== X-Received: by 2002:a17:902:f708:b0:224:ab0:9b00 with SMTP id d9443c01a7336-22c535ac5d7mr181659005ad.27.1745245337136; Mon, 21 Apr 2025 07:22:17 -0700 (PDT) Received: from localhost (58x12x133x161.ap58.ftth.ucom.ne.jp. [58.12.133.161]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-22c50eb4aadsm65586325ad.146.2025.04.21.07.22.15 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 21 Apr 2025 07:22:16 -0700 (PDT) Date: Mon, 21 Apr 2025 23:22:14 +0900 Message-ID: <eke7zfg9wq5l.wl-kobarity@HIDDEN> From: kobarity <kobarity@HIDDEN> To: Eli Zaretskii <eliz@HIDDEN>, jdtsmith@HIDDEN Subject: Re: bug#77620: thingatpt can be incredibly slow in python-mode buffers In-Reply-To: <eke74iyiyita.wl-kobarity@HIDDEN> References: <DD4BC1EE-246D-4080-9B93-07D359F8C70E@HIDDEN> <86cydnsz5v.fsf@HIDDEN> <eke7cydluz80.wl-kobarity@HIDDEN> <86semhqqml.fsf@HIDDEN> <eke74iyiyita.wl-kobarity@HIDDEN> User-Agent: Wanderlust/2.15.9 (Almost Unreal) SEMI-EPG/1.14.7 (Harue) FLIM-LB/1.14.9 (=?ISO-8859-4?Q?Goj=F2?=) APEL-LB/10.8 EasyPG/1.0.0 Emacs/31.0.50 (x86_64-pc-linux-gnu) MULE/6.0 (HANACHIRUSATO) MIME-Version: 1.0 (generated by SEMI-EPG 1.14.7 - "Harue") Content-Type: multipart/mixed; boundary="Multipart_Mon_Apr_21_23:22:13_2025-1" X-Spam-Score: 0.0 (/) X-Debbugs-Envelope-To: 77620 Cc: 77620 <at> debbugs.gnu.org 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: -1.0 (-) --Multipart_Mon_Apr_21_23:22:13_2025-1 Content-Type: text/plain; charset=US-ASCII kobarity wrote: > In the process of looking into #77620, I noticed bugs in the > end-of-block detection functions. So I submitted a patch to #77941. > Please note that the patch attached to this mail assumes the #77941 > patch. > > In my environment, the next test shows about 2 seconds on _axes.py's > L8817. > > > (/ (car (benchmark-run 10 (thing-at-point 'sexp))) 10) > > But there are worse cases. Let's add the next two lines to the end of > _axes.py with 4-character indent. > > a = 1 > b = 2 > > The same measurement at the end of line "a = 1" gives 6 seconds; at > the end of line "b = 2" it gives 7 seconds. This is because it calls > time-consuming functions many times. > > `python-nav-beginning-of-block' and `python-nav-end-of-block' are very > time consuming if the block is large. In the case of _axes.py, "class > Axes" is a large block with over 8000 lines. > > However, `python-nav-forward-sexp' that (thing-at-point 'sexp) calls > does not necessarily have to perform these functions. They are just > called by `python-info-statement-ends-block-p': (Before #77941 patch) > > (defun python-info-statement-ends-block-p () > "Return non-nil if point is at end of block." > (let ((end-of-block-pos (save-excursion > (python-nav-end-of-block))) > (end-of-statement-pos (save-excursion > (python-nav-end-of-statement)))) > (and end-of-block-pos end-of-statement-pos > (= end-of-block-pos end-of-statement-pos)))) > > The logic is that if the end of the current statement is the end of > the current block, then it is the last line of the block. This is not > wrong, but the problem is that it takes time to move to the end of the > block. > > Fortunately, in many cases it is much easier to determine that it is > not the end of the block. Specifically, if the indentation of the > next statement is equal to or greater than the indentation of the > current statement, then the current statement cannot be the end of the > block. The attached patch > 0001-Performance-optimization-of-python-info-statement-en.patch takes > advantage of this to improve the performance of > `python-info-statement-ends-block-p'. Please remember that it assumes > the #77941 patch is applied. > > 0001-Performance-optimization-of-python-info-statement-en.patch solves > the performance problem with _axes.py, but does not have much effect > on the problem with lines "a = 1" and "b = 2" added above. The > attached patch > 0002-Add-cache-to-Python-block-navigation-functions.patch is an > attempt to introduce a cache to alleviate this problem. > > I measured the following to disable the cache for each benchmark. > > (/ (car (benchmark-run 10 (progn (thing-at-point 'sexp) (setq python-nav-cache nil)))) 10) > > It shows about 1.6 seconds for both "a = 1" and "b = 2" lines. > > I believe 0002-Add-cache-to-Python-block-navigation-functions.patch is > a PoC level patch, so I welcome opinions on what you think of this > direction. I revised 0002-Add-cache-to-Python-block-navigation-functions.patch. There was no need to use a macro. --Multipart_Mon_Apr_21_23:22:13_2025-1 Content-Type: application/octet-stream; type=patch; name="0002-Add-cache-to-Python-block-navigation-functions.patch" Content-Disposition: attachment; filename="0002-Add-cache-to-Python-block-navigation-functions.patch" Content-Transfer-Encoding: 7bit From c70af095f1a3cc669e2481c4c5e720f10b0eb83c Mon Sep 17 00:00:00 2001 From: kobarity <kobarity@HIDDEN> Date: Mon, 21 Apr 2025 23:17:37 +0900 Subject: [PATCH 2/2] Add cache to Python block navigation functions * lisp/progmodes/python.el (python-nav-cache), (python-nav-cache-tick): New variables. (python-nav-cache-get), (python-nav-cache-set), (python-nav-with-cache): New functions. (python-nav-beginning-of-block), (python-nav-end-of-block): New wrapper functions. (python-nav--beginning-of-block): Renamed from python-nav-beginning-of-block. (python-nav--end-of-block): Renamed from python-nav-end-of-block. (Bug#77620) --- lisp/progmodes/python.el | 52 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/lisp/progmodes/python.el b/lisp/progmodes/python.el index 81440cfcfc9..594681594b0 100644 --- a/lisp/progmodes/python.el +++ b/lisp/progmodes/python.el @@ -2386,9 +2386,54 @@ python-nav-forward-statement (python-nav-beginning-of-statement) (setq arg (1+ arg)))) +(defvar python-nav-cache nil + "Cache to hold the results of navigation functions.") + +(defvar python-nav-cache-tick 0 + "`buffer-chars-modified-tick' when registering the navigation cache.") + +(defun python-nav-cache-get (kind) + "Get value from the navigation cache. +If the current buffer is not modified, the navigation cache is searched +using KIND and the current line number as a key." + (and (= (buffer-chars-modified-tick) python-nav-cache-tick) + (cdr (assoc (cons kind (line-number-at-pos nil t)) python-nav-cache)))) + +(defun python-nav-cache-set (kind current target) + "Add a key-value pair to the navigation cache. +Invalidate the navigation cache if the current buffer has been modified. +Then add a key-value pair to the navigation cache. The key consists of +KIND and CURRENT line number, and the value is TARGET position." + (let ((tick (buffer-chars-modified-tick))) + (when (/= tick python-nav-cache-tick) + (setq-local python-nav-cache nil + python-nav-cache-tick tick)) + (push (cons (cons kind current) target) python-nav-cache) + target)) + +(defun python-nav-with-cache (kind func) + "Cached version of the navigation FUNC. +If a value is obtained from the navigation cache using KIND, it will +navigate there and return the position. Otherwise, use FUNC to navigate +and cache the result." + (let ((target (python-nav-cache-get kind))) + (if target + (progn + (goto-char target) + (point-marker)) + (let ((current (line-number-at-pos nil t))) + (python-nav-cache-set kind current (funcall func)))))) + (defun python-nav-beginning-of-block () "Move to start of current block." (interactive "^") + (python-nav-with-cache + 'beginning-of-block #'python-nav--beginning-of-block)) + +(defun python-nav--beginning-of-block () + "Move to start of current block. +This is an internal implementation of `python-nav-beginning-of-block' +without the navigation cache." (let ((starting-pos (point))) ;; Go to first line beginning a statement (while (and (not (bobp)) @@ -2413,6 +2458,13 @@ python-nav-beginning-of-block (defun python-nav-end-of-block () "Move to end of current block." (interactive "^") + (python-nav-with-cache + 'end-of-block #'python-nav--end-of-block)) + +(defun python-nav--end-of-block () + "Move to end of current block. +This is an internal implementation of `python-nav-end-of-block' without +the navigation cache." (when (python-nav-beginning-of-block) (let ((block-indentation (current-indentation))) (python-nav-end-of-statement) -- 2.43.0 --Multipart_Mon_Apr_21_23:22:13_2025-1--
bug-gnu-emacs@HIDDEN
:bug#77620
; Package emacs
.
Full text available.Received: (at 77620) by debbugs.gnu.org; 20 Apr 2025 15:05:55 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Sun Apr 20 11:05:55 2025 Received: from localhost ([127.0.0.1]:50624 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1u6WEy-0005ek-2S for submit <at> debbugs.gnu.org; Sun, 20 Apr 2025 11:05:55 -0400 Received: from mail-pf1-x42f.google.com ([2607:f8b0:4864:20::42f]:61498) by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.84_2) (envelope-from <kobarity@HIDDEN>) id 1u6WEs-0005cn-TT for 77620 <at> debbugs.gnu.org; Sun, 20 Apr 2025 11:05:49 -0400 Received: by mail-pf1-x42f.google.com with SMTP id d2e1a72fcca58-736c3e7b390so2710627b3a.2 for <77620 <at> debbugs.gnu.org>; Sun, 20 Apr 2025 08:05:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1745161541; x=1745766341; darn=debbugs.gnu.org; h=mime-version:user-agent:references:in-reply-to:subject:cc:to:from :message-id:date:from:to:cc:subject:date:message-id:reply-to; bh=AaPJBYnFdb1nS/oITxmkTVUETWDJz010ZxqmCBAPPsA=; b=cqCZZOwO9TBzOwboJ2/2WIZEwtga+sPVpL8Cah3MjfEfd4VUiHxRoZkKByNS3Eh6f8 wmPlwtkKFtkd+t5hcTa0y+8WcNxMt9f6AEVq+aHR/1kTpJmnOJZMFJVtqFDlhtOPUskV PRclv/+8LNBKQ/J36OFuIXRXV7tNI4JMZmOjgRIHcbZ/HMzUrDU8RLtSWJrqJ4dnkpWL 9wc2Ti3Uxj8OMY0yYNc1gh4V0yxoA4AdxcGVa9GO7KUrlXA9C531xucBmAug8CKrO3XL ZSVC0uQPlHFVja0N+Fopl6y3m0bSga0fzqF32hzFxBX57RS8cM5R6FtwA7ZwXHjlnr6O 6PGw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1745161541; x=1745766341; h=mime-version:user-agent:references:in-reply-to:subject:cc:to:from :message-id:date:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=AaPJBYnFdb1nS/oITxmkTVUETWDJz010ZxqmCBAPPsA=; b=khc9+7w9Iif4Kec4j4TODwe2qL3T+RFmiNlzs5994FcaOtVjsNIfbtM0jRhKVw6VCM T73ld+EDDwONlb4+FLAMCo+3zd20XtmAW/z/nd3ADoAcUkK8wIySv1G8mLUGcmSC6oN5 oY8v/8f+XtPxmU/nc1EsvZNOh674J8WznjeDLg0OqXb5OxafI0in71TS3cxwFuHqKdLg 2k/4WoGdAgjSUcVBf9/VCJIXkvcGHXfVuNebwfgVYg74K6as8wu3E3qkyjgrGKICdIHK OYJY38g4ktVoJXqDuZAq49oVIBswbH7b+hVnV4/wxGba9//5/vGfaf+bA5L4usFMQ4Ci iVfA== X-Gm-Message-State: AOJu0Yz6jmDdAoogIAgd721xwNP5hxvBlPcCnUOzhZO2NAO3Bh1Na2bS 8zhdKcot6Sj6I150wPKUNcEhZXLzDqVM/nqWwE0EZNF3XUZMFS+e X-Gm-Gg: ASbGncsmRTgFtsHABwtHdfdPKiN4hwAE6jr6iO3gk2HxZ5+otAX+62urWRWLZms8G9Q 72/9d+NNh6/iy65Mzrq+qzmR/cKNlbJPc4HU66o8m6Hep+rIC/Uu+NcRJzry6O4XjXdSIe8UBDe dw/lFQE8tiPP73V2hgmmGa4tOF2xBl42k+394MhbkpXMCdwpgwo5+OJi3NlGlY0mM7smAkSEnnQ Nw/vqA0+Hwpz3LQdaxKDaneToQo3Sqpnjy/YgpoZqgs787ELjjZSarXMEUo7CHBh/WhkKudrRMS bBvlXtwfBMj4dBWVb9DcmzWwXqy4XL5coPRth/YyCyaJUnCgGOlThrkP1AXVzifKCgBPOfY= X-Google-Smtp-Source: AGHT+IFcZk9rSbb2FhSDTqsGahqvyC1IPrt+wn644CCnTfno43+E2HjOdCN9qCH7AwRS6qNrCQmrcA== X-Received: by 2002:a05:6a00:3d02:b0:736:4e0a:7e82 with SMTP id d2e1a72fcca58-73dc1480119mr10343588b3a.10.1745161540610; Sun, 20 Apr 2025 08:05:40 -0700 (PDT) Received: from localhost (58x12x133x161.ap58.ftth.ucom.ne.jp. [58.12.133.161]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-73dbfa57508sm4993380b3a.104.2025.04.20.08.05.39 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 20 Apr 2025 08:05:40 -0700 (PDT) Date: Mon, 21 Apr 2025 00:05:37 +0900 Message-ID: <eke74iyiyita.wl-kobarity@HIDDEN> From: kobarity <kobarity@HIDDEN> To: Eli Zaretskii <eliz@HIDDEN>, jdtsmith@HIDDEN Subject: Re: bug#77620: thingatpt can be incredibly slow in python-mode buffers In-Reply-To: <86semhqqml.fsf@HIDDEN> References: <DD4BC1EE-246D-4080-9B93-07D359F8C70E@HIDDEN> <86cydnsz5v.fsf@HIDDEN> <eke7cydluz80.wl-kobarity@HIDDEN> <86semhqqml.fsf@HIDDEN> User-Agent: Wanderlust/2.15.9 (Almost Unreal) SEMI-EPG/1.14.7 (Harue) FLIM-LB/1.14.9 (=?ISO-8859-4?Q?Goj=F2?=) APEL-LB/10.8 EasyPG/1.0.0 Emacs/31.0.50 (x86_64-pc-linux-gnu) MULE/6.0 (HANACHIRUSATO) MIME-Version: 1.0 (generated by SEMI-EPG 1.14.7 - "Harue") Content-Type: multipart/mixed; boundary="Multipart_Mon_Apr_21_00:05:36_2025-1" X-Spam-Score: 0.0 (/) X-Debbugs-Envelope-To: 77620 Cc: 77620 <at> debbugs.gnu.org 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: -1.0 (-) --Multipart_Mon_Apr_21_00:05:36_2025-1 Content-Type: text/plain; charset=US-ASCII Eli Zaretskii wrote: > > > Date: Thu, 10 Apr 2025 00:33:03 +0900 > > From: kobarity <kobarity@HIDDEN> > > Cc: JD Smith <jdtsmith@HIDDEN>, > > 77620 <at> debbugs.gnu.org > > > > Eli Zaretskii wrote: > > > > > > > In #77588 this was shown to lead to long intermittent pauses with eglot in large python buffers, but the issue is more general for any packages using thingatpt in python buffers. > > > > > > The Lisp profile, which seems to point to the likely culprit, is > > > below. > > > > > > Maybe kobarity (CC'ed) will have some ideas or suggestions. > > > > > > 345 89% - ... > > > 343 89% - cond > > > 343 89% - let > > > 343 89% - condition-case > > > 343 89% - progn > > > 343 89% - save-excursion > > > 173 44% - funcall > > > 173 44% - thing-at-point--end-of-sexp > > > 173 44% - let > > > 173 44% - if > > > 173 44% - condition-case > > > 173 44% - forward-sexp > > > 173 44% - python-nav-forward-sexp > > > 173 44% - python-nav--forward-sexp > > > 173 44% - python-info-statement-ends-block-p > > > 173 44% - python-nav-end-of-block > > > 96 24% - python-nav-end-of-statement > > > 69 17% - syntax-ppss > > > 67 17% parse-partial-sexp > > > 27 7% - python-info-line-ends-backslash-p > > > 27 7% - syntax-ppss > > > 27 7% parse-partial-sexp > > > 76 19% - python-nav-beginning-of-block > > > 76 19% - python-nav-backward-block > > > 76 19% - python-nav-forward-block > > > 75 19% - python-syntax-context-type > > > 75 19% - syntax-ppss > > > 74 19% parse-partial-sexp > > > 1 0% - python-nav-beginning-of-statement > > > 1 0% point-marker > > > 1 0% current-indentation > > > 170 44% - let > > > 170 44% - if > > > 170 44% - funcall > > > 170 44% - thing-at-point--beginning-of-sexp > > > 170 44% - let > > > 170 44% - if > > > 170 44% - forward-sexp > > > 170 44% - python-nav-forward-sexp > > > 170 44% - python-nav--forward-sexp > > > 170 44% - python-info-statement-ends-block-p > > > 170 44% - python-nav-end-of-block > > > 95 24% - python-nav-end-of-statement > > > 63 16% - syntax-ppss > > > 62 16% parse-partial-sexp > > > 31 8% - python-info-line-ends-backslash-p > > > 31 8% - syntax-ppss > > > 30 7% parse-partial-sexp > > > 1 0% re-search-forward > > > 75 19% - python-nav-beginning-of-block > > > 75 19% - python-nav-backward-block > > > 75 19% - python-nav-forward-block > > > 72 18% - python-syntax-context-type > > > 72 18% - syntax-ppss > > > 71 18% parse-partial-sexp > > > 2 0% re-search-backward > > > 1 0% - python-nav-beginning-of-statement > > > 1 0% - python-info-line-ends-backslash-p > > > 1 0% - syntax-ppss > > > 1 0% syntax-ppss--data > > > 2 0% - python-shell-get-process > > > 2 0% - python-shell-get-buffer > > > 2 0% - seq-some > > > 2 0% + seq-do > > > 32 8% Automatic GC > > > 6 1% - command-execute > > > 6 1% - call-interactively > > > 6 1% - byte-code > > > 6 1% - read-extended-command > > > 6 1% - read-extended-command-1 > > > 6 1% - completing-read > > > 6 1% - completing-read-default > > > 6 1% - read-from-minibuffer > > > 1 0% redisplay_internal (C function) > > > 2 0% redisplay_internal (C function) > > > > Please give me some time as I'm trying to improve performance. > > Sure, there's no rush. TIA. In the process of looking into #77620, I noticed bugs in the end-of-block detection functions. So I submitted a patch to #77941. Please note that the patch attached to this mail assumes the #77941 patch. In my environment, the next test shows about 2 seconds on _axes.py's L8817. > (/ (car (benchmark-run 10 (thing-at-point 'sexp))) 10) But there are worse cases. Let's add the next two lines to the end of _axes.py with 4-character indent. a = 1 b = 2 The same measurement at the end of line "a = 1" gives 6 seconds; at the end of line "b = 2" it gives 7 seconds. This is because it calls time-consuming functions many times. `python-nav-beginning-of-block' and `python-nav-end-of-block' are very time consuming if the block is large. In the case of _axes.py, "class Axes" is a large block with over 8000 lines. However, `python-nav-forward-sexp' that (thing-at-point 'sexp) calls does not necessarily have to perform these functions. They are just called by `python-info-statement-ends-block-p': (Before #77941 patch) (defun python-info-statement-ends-block-p () "Return non-nil if point is at end of block." (let ((end-of-block-pos (save-excursion (python-nav-end-of-block))) (end-of-statement-pos (save-excursion (python-nav-end-of-statement)))) (and end-of-block-pos end-of-statement-pos (= end-of-block-pos end-of-statement-pos)))) The logic is that if the end of the current statement is the end of the current block, then it is the last line of the block. This is not wrong, but the problem is that it takes time to move to the end of the block. Fortunately, in many cases it is much easier to determine that it is not the end of the block. Specifically, if the indentation of the next statement is equal to or greater than the indentation of the current statement, then the current statement cannot be the end of the block. The attached patch 0001-Performance-optimization-of-python-info-statement-en.patch takes advantage of this to improve the performance of `python-info-statement-ends-block-p'. Please remember that it assumes the #77941 patch is applied. 0001-Performance-optimization-of-python-info-statement-en.patch solves the performance problem with _axes.py, but does not have much effect on the problem with lines "a = 1" and "b = 2" added above. The attached patch 0002-Add-cache-to-Python-block-navigation-functions.patch is an attempt to introduce a cache to alleviate this problem. I measured the following to disable the cache for each benchmark. (/ (car (benchmark-run 10 (progn (thing-at-point 'sexp) (setq python-nav-cache nil)))) 10) It shows about 1.6 seconds for both "a = 1" and "b = 2" lines. I believe 0002-Add-cache-to-Python-block-navigation-functions.patch is a PoC level patch, so I welcome opinions on what you think of this direction. --Multipart_Mon_Apr_21_00:05:36_2025-1 Content-Type: application/octet-stream; type=patch; name="0001-Performance-optimization-of-python-info-statement-en.patch" Content-Disposition: attachment; filename="0001-Performance-optimization-of-python-info-statement-en.patch" Content-Transfer-Encoding: 7bit From 760304b6560499674fd41e9132feceb050f603ae Mon Sep 17 00:00:00 2001 From: kobarity <kobarity@HIDDEN> Date: Sun, 20 Apr 2025 21:14:46 +0900 Subject: [PATCH 1/2] Performance optimization of python-info-statement-ends-block-p * lisp/progmodes/python.el (python-info-statement-ends-block-p): Add a comparison of the indentation of the next statement with the indentation of the current statement. (Bug#77620) --- lisp/progmodes/python.el | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/lisp/progmodes/python.el b/lisp/progmodes/python.el index b03e4f9efdf..81440cfcfc9 100644 --- a/lisp/progmodes/python.el +++ b/lisp/progmodes/python.el @@ -6156,14 +6156,25 @@ python-info-statement-starts-block-p (defun python-info-statement-ends-block-p () "Return non-nil if point is at end of block." - (let ((end-of-block-pos (save-excursion - (python-nav-end-of-block))) - (end-of-statement-pos (save-excursion - (python-nav-end-of-statement) - (python-util-forward-comment -1) - (point)))) - (and end-of-block-pos end-of-statement-pos - (= end-of-block-pos end-of-statement-pos)))) + (let* (current-statement + (current-indentation (save-excursion + (setq current-statement + (python-nav-beginning-of-statement)) + (current-indentation))) + next-statement + (next-indentation (save-excursion + (python-nav-forward-statement) + (setq next-statement (point)) + (current-indentation)))) + (unless (and (< current-statement next-statement) + (<= current-indentation next-indentation)) + (and-let* ((end-of-statement-pos (save-excursion + (python-nav-end-of-statement) + (python-util-forward-comment -1) + (point))) + (end-of-block-pos (save-excursion + (python-nav-end-of-block)))) + (= end-of-block-pos end-of-statement-pos))))) (defun python-info-beginning-of-statement-p () "Return non-nil if point is at beginning of statement." -- 2.43.0 --Multipart_Mon_Apr_21_00:05:36_2025-1 Content-Type: application/octet-stream; type=patch; name="0002-Add-cache-to-Python-block-navigation-functions.patch" Content-Disposition: attachment; filename="0002-Add-cache-to-Python-block-navigation-functions.patch" Content-Transfer-Encoding: 7bit From ab1948d91186603a7f799e3e5cf203b1f13399ef Mon Sep 17 00:00:00 2001 From: kobarity <kobarity@HIDDEN> Date: Sun, 20 Apr 2025 21:14:46 +0900 Subject: [PATCH 2/2] Add cache to Python block navigation functions * lisp/progmodes/python.el (python-nav-cache), (python-nav-cache-tick): New variables. (python-nav-cache-get), (python-nav-cache-set): New functions. (python-nav-with-cache): New macro. (python-nav-beginning-of-block), (python-nav-end-of-block): New wrapper functions. (python-nav--beginning-of-block): Renamed from python-nav-beginning-of-block. (python-nav--end-of-block): Renamed from python-nav-end-of-block. (Bug#77620) --- lisp/progmodes/python.el | 52 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/lisp/progmodes/python.el b/lisp/progmodes/python.el index 81440cfcfc9..08ab94f525b 100644 --- a/lisp/progmodes/python.el +++ b/lisp/progmodes/python.el @@ -2386,9 +2386,54 @@ python-nav-forward-statement (python-nav-beginning-of-statement) (setq arg (1+ arg)))) +(defvar python-nav-cache nil + "Cache to hold the results of navigation functions.") + +(defvar python-nav-cache-tick 0 + "`buffer-chars-modified-tick' when registering the navigation cache.") + +(defun python-nav-cache-get (kind) + "Get value from the navigation cache. +If the current buffer is not modified, the navigation cache is searched +using KIND and the current line number as a key." + (and (= (buffer-chars-modified-tick) python-nav-cache-tick) + (cdr (assoc (cons kind (line-number-at-pos nil t)) python-nav-cache)))) + +(defun python-nav-cache-set (kind current target) + "Add a key-value pair to the navigation cache. +Invalidate the navigation cache if the current buffer has been modified. +Then add a key-value pair to the navigation cache. The key consists of +KIND and CURRENT line number, and the value is TARGET position." + (let ((tick (buffer-chars-modified-tick))) + (when (/= tick python-nav-cache-tick) + (setq-local python-nav-cache nil + python-nav-cache-tick tick)) + (push (cons (cons kind current) target) python-nav-cache) + target)) + +(defmacro python-nav-with-cache (kind func) + "Cached version of the navigation FUNC. +If a value is obtained from the navigation cache using KIND, it will +navigate there and return the position. Otherwise, use FUNC to navigate +and cache the result." + `(let ((target (python-nav-cache-get ,kind))) + (if target + (progn + (goto-char target) + (point-marker)) + (let ((current (line-number-at-pos nil t))) + (python-nav-cache-set ,kind current (funcall ,func)))))) + (defun python-nav-beginning-of-block () "Move to start of current block." (interactive "^") + (python-nav-with-cache + 'beginning-of-block #'python-nav--beginning-of-block)) + +(defun python-nav--beginning-of-block () + "Move to start of current block. +This is an internal implementation of `python-nav-beginning-of-block' +without the navigation cache." (let ((starting-pos (point))) ;; Go to first line beginning a statement (while (and (not (bobp)) @@ -2413,6 +2458,13 @@ python-nav-beginning-of-block (defun python-nav-end-of-block () "Move to end of current block." (interactive "^") + (python-nav-with-cache + 'end-of-block #'python-nav--end-of-block)) + +(defun python-nav--end-of-block () + "Move to end of current block. +This is an internal implementation of `python-nav-end-of-block' without +the navigation cache." (when (python-nav-beginning-of-block) (let ((block-indentation (current-indentation))) (python-nav-end-of-statement) -- 2.43.0 --Multipart_Mon_Apr_21_00:05:36_2025-1--
bug-gnu-emacs@HIDDEN
:bug#77620
; Package emacs
.
Full text available.Received: (at 77620) by debbugs.gnu.org; 9 Apr 2025 15:52:29 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Wed Apr 09 11:52:29 2025 Received: from localhost ([127.0.0.1]:41276 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1u2Xj3-0005O2-BH for submit <at> debbugs.gnu.org; Wed, 09 Apr 2025 11:52:29 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:53784) by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.84_2) (envelope-from <eliz@HIDDEN>) id 1u2Xj0-0005Nl-FB for 77620 <at> debbugs.gnu.org; Wed, 09 Apr 2025 11:52:26 -0400 Received: from fencepost.gnu.org ([2001:470:142:3::e]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from <eliz@HIDDEN>) id 1u2Xiu-0008VL-Vj; Wed, 09 Apr 2025 11:52:20 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=gnu.org; s=fencepost-gnu-org; h=References:Subject:In-Reply-To:To:From:Date: mime-version; bh=JjAl1Ych6tPbfFh+qKkL8V82OHb5/Kk/G8s6PTxrYl0=; b=D/M8Lt6l+E2m bjDVgBpdOIQ50Rwm0g5BFRSpixW5va6ovJ3iYFwm9KtAElqmvb4Pt71v+7ziGcB3PmgoV9zyc7A9I 7eku0sL6WYOZptZZm1nP0E/0TpUAcmfPi5kAfGpKd1c7AUvb044juzBUf0DgNvRCYxSMXJduHZYvJ uHRfWj8bY75rYxBhJ/nFpoBqJb3zah9TLvTLhDBDd4lEFsjpxjjJWdX2HY6ev7NizdewWBbZ1laX7 5DhMuOh7XLOkV1iSS9nPmVBFFQdMTdeFZE1tkxMihU7kOUDliLONxeNKIRhh5zJnPmsW8xlKMiZhP RWGB7/J5PhjSnB/GxwgL4w==; Date: Wed, 09 Apr 2025 18:52:18 +0300 Message-Id: <86semhqqml.fsf@HIDDEN> From: Eli Zaretskii <eliz@HIDDEN> To: kobarity <kobarity@HIDDEN> In-Reply-To: <eke7cydluz80.wl-kobarity@HIDDEN> (message from kobarity on Thu, 10 Apr 2025 00:33:03 +0900) Subject: Re: bug#77620: thingatpt can be incredibly slow in python-mode buffers References: <DD4BC1EE-246D-4080-9B93-07D359F8C70E@HIDDEN> <86cydnsz5v.fsf@HIDDEN> <eke7cydluz80.wl-kobarity@HIDDEN> X-Spam-Score: -2.3 (--) X-Debbugs-Envelope-To: 77620 Cc: 77620 <at> debbugs.gnu.org, jdtsmith@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 (---) > Date: Thu, 10 Apr 2025 00:33:03 +0900 > From: kobarity <kobarity@HIDDEN> > Cc: JD Smith <jdtsmith@HIDDEN>, > 77620 <at> debbugs.gnu.org > > Eli Zaretskii wrote: > > > > > In #77588 this was shown to lead to long intermittent pauses with eglot in large python buffers, but the issue is more general for any packages using thingatpt in python buffers. > > > > The Lisp profile, which seems to point to the likely culprit, is > > below. > > > > Maybe kobarity (CC'ed) will have some ideas or suggestions. > > > > 345 89% - ... > > 343 89% - cond > > 343 89% - let > > 343 89% - condition-case > > 343 89% - progn > > 343 89% - save-excursion > > 173 44% - funcall > > 173 44% - thing-at-point--end-of-sexp > > 173 44% - let > > 173 44% - if > > 173 44% - condition-case > > 173 44% - forward-sexp > > 173 44% - python-nav-forward-sexp > > 173 44% - python-nav--forward-sexp > > 173 44% - python-info-statement-ends-block-p > > 173 44% - python-nav-end-of-block > > 96 24% - python-nav-end-of-statement > > 69 17% - syntax-ppss > > 67 17% parse-partial-sexp > > 27 7% - python-info-line-ends-backslash-p > > 27 7% - syntax-ppss > > 27 7% parse-partial-sexp > > 76 19% - python-nav-beginning-of-block > > 76 19% - python-nav-backward-block > > 76 19% - python-nav-forward-block > > 75 19% - python-syntax-context-type > > 75 19% - syntax-ppss > > 74 19% parse-partial-sexp > > 1 0% - python-nav-beginning-of-statement > > 1 0% point-marker > > 1 0% current-indentation > > 170 44% - let > > 170 44% - if > > 170 44% - funcall > > 170 44% - thing-at-point--beginning-of-sexp > > 170 44% - let > > 170 44% - if > > 170 44% - forward-sexp > > 170 44% - python-nav-forward-sexp > > 170 44% - python-nav--forward-sexp > > 170 44% - python-info-statement-ends-block-p > > 170 44% - python-nav-end-of-block > > 95 24% - python-nav-end-of-statement > > 63 16% - syntax-ppss > > 62 16% parse-partial-sexp > > 31 8% - python-info-line-ends-backslash-p > > 31 8% - syntax-ppss > > 30 7% parse-partial-sexp > > 1 0% re-search-forward > > 75 19% - python-nav-beginning-of-block > > 75 19% - python-nav-backward-block > > 75 19% - python-nav-forward-block > > 72 18% - python-syntax-context-type > > 72 18% - syntax-ppss > > 71 18% parse-partial-sexp > > 2 0% re-search-backward > > 1 0% - python-nav-beginning-of-statement > > 1 0% - python-info-line-ends-backslash-p > > 1 0% - syntax-ppss > > 1 0% syntax-ppss--data > > 2 0% - python-shell-get-process > > 2 0% - python-shell-get-buffer > > 2 0% - seq-some > > 2 0% + seq-do > > 32 8% Automatic GC > > 6 1% - command-execute > > 6 1% - call-interactively > > 6 1% - byte-code > > 6 1% - read-extended-command > > 6 1% - read-extended-command-1 > > 6 1% - completing-read > > 6 1% - completing-read-default > > 6 1% - read-from-minibuffer > > 1 0% redisplay_internal (C function) > > 2 0% redisplay_internal (C function) > > Please give me some time as I'm trying to improve performance. Sure, there's no rush. TIA.
bug-gnu-emacs@HIDDEN
:bug#77620
; Package emacs
.
Full text available.Received: (at 77620) by debbugs.gnu.org; 9 Apr 2025 15:33:36 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Wed Apr 09 11:33:35 2025 Received: from localhost ([127.0.0.1]:41209 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1u2XQl-0004MZ-Fv for submit <at> debbugs.gnu.org; Wed, 09 Apr 2025 11:33:35 -0400 Received: from mail-pf1-x435.google.com ([2607:f8b0:4864:20::435]:42076) by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.84_2) (envelope-from <kobarity@HIDDEN>) id 1u2XQi-0004MF-7j for 77620 <at> debbugs.gnu.org; Wed, 09 Apr 2025 11:33:33 -0400 Received: by mail-pf1-x435.google.com with SMTP id d2e1a72fcca58-7399838db7fso1024896b3a.0 for <77620 <at> debbugs.gnu.org>; Wed, 09 Apr 2025 08:33:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1744212806; x=1744817606; darn=debbugs.gnu.org; h=content-transfer-encoding:mime-version:user-agent:references :in-reply-to:subject:cc:to:from:message-id:date:from:to:cc:subject :date:message-id:reply-to; bh=XZ5plIGL6WpXPuqrrw/NE/tbgrdjy/sWMDOhXtSZvk0=; b=RBp5Jh8BIM5wFmu1R8frAX4xJS7fH5po4Xj4K7NKw2G80vnxTUqt/cDuwSiTSN7DRV i8XtsRRgNT5Jj7d0pspXRL5l73fyu29Gh//e4odI9f20+4M5Yozj8N3J39JaObK4Dag2 M3S/rWGiBuPs5+oU1dXgeTxOKPBWjBoegMFTScia+MT2JyOmXdergyFXeCwja5PF9brf 6IpjSZU/9LS03FP0dh/14eGPePXga27yw3iKre4+9nRPl9cYPqvYc868zoLTW9zQjMIM 2fexJ7/ORWCVTY/GhV6OZLbAzm3gjmlodi/Ow6k3EZlVpj1EHIAtf6y1xjKRq4QsJ493 CFKw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1744212806; x=1744817606; h=content-transfer-encoding:mime-version:user-agent:references :in-reply-to:subject:cc:to:from:message-id:date:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; bh=XZ5plIGL6WpXPuqrrw/NE/tbgrdjy/sWMDOhXtSZvk0=; b=odrhye/+w3pCh8fR6W3BGvxU0Z6NXwgbEwfs+IsSIvmURH2Q90mHWq4HMKe1RlxppI 9+X1jzwhHpl3PAW/0D6tMHoQMvALxTarsjfvK9xhYRRHJ6ddGcaKzF4x052BsZXYiKkc RLjPjCY9sZsQxQgfqDRaygSpw8cmaLJhb/HBnDkgby8ebpzPIMAu7oqwEHjSU+1ayCQ1 i0PiEWqfYjdo8UcesBc+HS2jW3tzLLaSsvFbQhqzG/HSDS5AHKLli8Fcg67jQzfDe5ec sQXOS0G/dlgXeCI1cF8y+RwLp/GsEkyqZ856yQ0qJMqRecrhM+R/xSmnBjSjgKUJLHEt G0XA== X-Forwarded-Encrypted: i=1; AJvYcCUdMIZVferpCSzNwsx6ccxGanuFGV7qvnoIH9UT2yWTnhdBKujr1JQjSkNiHdC4o82kNDvFwg==@debbugs.gnu.org X-Gm-Message-State: AOJu0YwoXauRC6XzwQXhPHmFL9zgrR1fKBFjcyAbI5cZR7ZEKbSo6erq B5/W86RMazTcVfQ4SuXZGuy95bI5D5IgBSk7a0OX/Bj0HIA7AAi7 X-Gm-Gg: ASbGncscaUBxBO8sKgLAEf2rzUbN9q4D56kANX6QKPPcPLjErWomoYns3yJUX3S8bv4 m7jsl03+zs0x5T6SXVZ6/kO0AB+UBcwPqEt6dJbJ++JQM4qfYhS87uxCRNlUiM30xwjP6939t2/ Plu8Mupmt4HMdKOmYGKZUMZ0jZRtLQBZxbLfF/jboffdagJ7e+jD1O3nn1LuGt5U2w0m+uTmAlj 9pMMxrjn+5QVlJ86i10ZjqM5mSwSU5jUYok7PIVy2DOEd1y6adxP2xb1NMhLzX4yLIKyDWBPWgY f+LHwuuVY6UseEdhbhG1PsJzB0uGWtcH6lcdR8Lhj9GMSu2EpdYekxNPNBsmADNeYB0cf40= X-Google-Smtp-Source: AGHT+IFCT/Vc7k8nVGqet2n1KSGbm2tGnPqBfp48tWlRh0imw17XQj+A1fQ8e80DkHnbtu3ZwStCrg== X-Received: by 2002:a05:6a00:3bc3:b0:732:706c:c4ff with SMTP id d2e1a72fcca58-73b9d3d31edmr9068171b3a.7.1744212805702; Wed, 09 Apr 2025 08:33:25 -0700 (PDT) Received: from localhost (58x12x133x161.ap58.ftth.ucom.ne.jp. [58.12.133.161]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-73bb1d68cb1sm1475413b3a.75.2025.04.09.08.33.24 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 09 Apr 2025 08:33:25 -0700 (PDT) Date: Thu, 10 Apr 2025 00:33:03 +0900 Message-ID: <eke7cydluz80.wl-kobarity@HIDDEN> From: kobarity <kobarity@HIDDEN> To: Eli Zaretskii <eliz@HIDDEN> Subject: Re: bug#77620: thingatpt can be incredibly slow in python-mode buffers In-Reply-To: <86cydnsz5v.fsf@HIDDEN> References: <DD4BC1EE-246D-4080-9B93-07D359F8C70E@HIDDEN> <86cydnsz5v.fsf@HIDDEN> User-Agent: Wanderlust/2.15.9 (Almost Unreal) SEMI-EPG/1.14.7 (Harue) FLIM-LB/1.14.9 (=?ISO-8859-4?Q?Goj=F2?=) APEL-LB/10.8 EasyPG/1.0.0 Emacs/31.0.50 (x86_64-pc-linux-gnu) MULE/6.0 (HANACHIRUSATO) MIME-Version: 1.0 (generated by SEMI-EPG 1.14.7 - "Harue") Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable X-Spam-Score: 0.7 (/) X-Debbugs-Envelope-To: 77620 Cc: 77620 <at> debbugs.gnu.org, JD Smith <jdtsmith@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: -0.3 (/) Eli Zaretskii wrote: >=20 > > From: JD Smith <jdtsmith@HIDDEN> > > Date: Mon, 7 Apr 2025 17:48:49 -0400 > >=20 > > > (/ (car (benchmark-run 10 (thing-at-point 'sexp))) 10) > >=20 > >=20 > > Try this test at the start of L8817 in this file (no eglot needed; eith= er python-mode or python-ts-mode is fine, as both show the same issue): > >=20 > > https://raw.githubusercontent.com/matplotlib/matplotlib/refs/heads/main= /lib/matplotlib/axes/_axes.py > > https://raw.githubusercontent.com/matplotlib/matplotlib/refs/heads/main= /lib/matplotlib/axes/_axes.py=EF=BF=BC > > _axes > > Text Document =C2=B7 353 KB > >=20 > > In #77588 this was shown to lead to long intermittent pauses with eglot= in large python buffers, but the issue is more general for any packages us= ing thingatpt in python buffers. >=20 > The Lisp profile, which seems to point to the likely culprit, is > below. >=20 > Maybe kobarity (CC'ed) will have some ideas or suggestions. >=20 > 345 89% - ... > 343 89% - cond > 343 89% - let > 343 89% - condition-case > 343 89% - progn > 343 89% - save-excursion > 173 44% - funcall > 173 44% - thing-at-point--end-of-sexp > 173 44% - let > 173 44% - if > 173 44% - condition-case > 173 44% - forward-sexp > 173 44% - python-nav-forward-sexp > 173 44% - python-nav--forward-sexp > 173 44% - python-info-statement-ends-block-p > 173 44% - python-nav-end-of-block > 96 24% - python-nav-end-of-statement > 69 17% - syntax-ppss > 67 17% parse-partial-sexp > 27 7% - python-info-line-ends-backslash-p > 27 7% - syntax-ppss > 27 7% parse-partial-sexp > 76 19% - python-nav-beginning-of-block > 76 19% - python-nav-backward-block > 76 19% - python-nav-forward-block > 75 19% - python-syntax-context-type > 75 19% - syntax-ppss > 74 19% parse-partial-sexp > 1 0% - python-nav-beginning-of-statement > 1 0% point-marker > 1 0% current-indentation > 170 44% - let > 170 44% - if > 170 44% - funcall > 170 44% - thing-at-point--beginning-of-sexp > 170 44% - let > 170 44% - if > 170 44% - forward-sexp > 170 44% - python-nav-forward-sexp > 170 44% - python-nav--forward-sexp > 170 44% - python-info-statement-ends-block-p > 170 44% - python-nav-end-of-block > 95 24% - python-nav-end-of-statement > 63 16% - syntax-ppss > 62 16% parse-partial-sexp > 31 8% - python-info-line-ends-backslash-p > 31 8% - syntax-ppss > 30 7% parse-partial-sexp > 1 0% re-search-forward > 75 19% - python-nav-beginning-of-block > 75 19% - python-nav-backward-block > 75 19% - python-nav-forward-block > 72 18% - python-syntax-context-type > 72 18% - syntax-ppss > 71 18% parse-partial-sexp > 2 0% re-search-backward > 1 0% - python-nav-beginning-of-statement > 1 0% - python-info-line-ends-backslash-p > 1 0% - syntax-ppss > 1 0% syntax-ppss--data > 2 0% - python-shell-get-process > 2 0% - python-shell-get-buffer > 2 0% - seq-some > 2 0% + seq-do > 32 8% Automatic GC > 6 1% - command-execute > 6 1% - call-interactively > 6 1% - byte-code > 6 1% - read-extended-command > 6 1% - read-extended-command-1 > 6 1% - completing-read > 6 1% - completing-read-default > 6 1% - read-from-minibuffer > 1 0% redisplay_internal (C function) > 2 0% redisplay_internal (C function) Please give me some time as I'm trying to improve performance.
bug-gnu-emacs@HIDDEN
:bug#77620
; Package emacs
.
Full text available.Received: (at 77620) by debbugs.gnu.org; 8 Apr 2025 10:52:56 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Tue Apr 08 06:52:56 2025 Received: from localhost ([127.0.0.1]:59287 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1u26Zb-0002Mo-7X for submit <at> debbugs.gnu.org; Tue, 08 Apr 2025 06:52:55 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:56270) by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.84_2) (envelope-from <eliz@HIDDEN>) id 1u26ZY-0002MI-5R for 77620 <at> debbugs.gnu.org; Tue, 08 Apr 2025 06:52:52 -0400 Received: from fencepost.gnu.org ([2001:470:142:3::e]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from <eliz@HIDDEN>) id 1u26ZS-0001Qv-Rb; Tue, 08 Apr 2025 06:52:46 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=gnu.org; s=fencepost-gnu-org; h=MIME-version:References:Subject:In-Reply-To:To:From: Date; bh=tkQ+s3TH3ALS6p/Q1p7kGss6LiAzN9qlTyP3hQW+bcg=; b=XCsBqgSR3/EwrXee7DRZ T6dOIpKEhGJwuVikTDfZCfudns+bGV1fAZrNpqCMCc/MLxUgWaTIaQYLxWMDL+/AFowWpAtj3OYCT b57ywpf8jySgIhGZCUPv+21IVw8C/JpXlw6NfYK+OVz/T0JJ4KBrwxKpk5YZZNzlzzZ1pJjjZGG3E uMb+zzHqb7tJuPOq2vFtoejhORzRJ/+SFFlGmBr1cl10cZLYEp5qVZQFA0V8kVHHMQCden6Qo7sEZ Gu+c5wT4MGNYRV2jTTwp57BmUDigaWEUhuNpqRJKIwCr8QSmJcMPswYib8zAWKGeKdWaTL0NAucRd ivjjkHaqRv102w==; Date: Tue, 08 Apr 2025 13:52:44 +0300 Message-Id: <86cydnsz5v.fsf@HIDDEN> From: Eli Zaretskii <eliz@HIDDEN> To: JD Smith <jdtsmith@HIDDEN>, kobarity <kobarity@HIDDEN> In-Reply-To: <DD4BC1EE-246D-4080-9B93-07D359F8C70E@HIDDEN> (message from JD Smith on Mon, 7 Apr 2025 17:48:49 -0400) Subject: Re: bug#77620: thingatpt can be incredibly slow in python-mode buffers References: <DD4BC1EE-246D-4080-9B93-07D359F8C70E@HIDDEN> MIME-version: 1.0 Content-type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Spam-Score: -1.6 (-) X-Debbugs-Envelope-To: 77620 Cc: 77620 <at> debbugs.gnu.org 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.6 (--) > From: JD Smith <jdtsmith@HIDDEN> > Date: Mon, 7 Apr 2025 17:48:49 -0400 > > > (/ (car (benchmark-run 10 (thing-at-point 'sexp))) 10) > > > Try this test at the start of L8817 in this file (no eglot needed; either python-mode or python-ts-mode is fine, as both show the same issue): > > https://raw.githubusercontent.com/matplotlib/matplotlib/refs/heads/main/lib/matplotlib/axes/_axes.py > https://raw.githubusercontent.com/matplotlib/matplotlib/refs/heads/main/lib/matplotlib/axes/_axes.py > _axes > Text Document · 353 KB > > In #77588 this was shown to lead to long intermittent pauses with eglot in large python buffers, but the issue is more general for any packages using thingatpt in python buffers. The Lisp profile, which seems to point to the likely culprit, is below. Maybe kobarity (CC'ed) will have some ideas or suggestions. 345 89% - ... 343 89% - cond 343 89% - let 343 89% - condition-case 343 89% - progn 343 89% - save-excursion 173 44% - funcall 173 44% - thing-at-point--end-of-sexp 173 44% - let 173 44% - if 173 44% - condition-case 173 44% - forward-sexp 173 44% - python-nav-forward-sexp 173 44% - python-nav--forward-sexp 173 44% - python-info-statement-ends-block-p 173 44% - python-nav-end-of-block 96 24% - python-nav-end-of-statement 69 17% - syntax-ppss 67 17% parse-partial-sexp 27 7% - python-info-line-ends-backslash-p 27 7% - syntax-ppss 27 7% parse-partial-sexp 76 19% - python-nav-beginning-of-block 76 19% - python-nav-backward-block 76 19% - python-nav-forward-block 75 19% - python-syntax-context-type 75 19% - syntax-ppss 74 19% parse-partial-sexp 1 0% - python-nav-beginning-of-statement 1 0% point-marker 1 0% current-indentation 170 44% - let 170 44% - if 170 44% - funcall 170 44% - thing-at-point--beginning-of-sexp 170 44% - let 170 44% - if 170 44% - forward-sexp 170 44% - python-nav-forward-sexp 170 44% - python-nav--forward-sexp 170 44% - python-info-statement-ends-block-p 170 44% - python-nav-end-of-block 95 24% - python-nav-end-of-statement 63 16% - syntax-ppss 62 16% parse-partial-sexp 31 8% - python-info-line-ends-backslash-p 31 8% - syntax-ppss 30 7% parse-partial-sexp 1 0% re-search-forward 75 19% - python-nav-beginning-of-block 75 19% - python-nav-backward-block 75 19% - python-nav-forward-block 72 18% - python-syntax-context-type 72 18% - syntax-ppss 71 18% parse-partial-sexp 2 0% re-search-backward 1 0% - python-nav-beginning-of-statement 1 0% - python-info-line-ends-backslash-p 1 0% - syntax-ppss 1 0% syntax-ppss--data 2 0% - python-shell-get-process 2 0% - python-shell-get-buffer 2 0% - seq-some 2 0% + seq-do 32 8% Automatic GC 6 1% - command-execute 6 1% - call-interactively 6 1% - byte-code 6 1% - read-extended-command 6 1% - read-extended-command-1 6 1% - completing-read 6 1% - completing-read-default 6 1% - read-from-minibuffer 1 0% redisplay_internal (C function) 2 0% redisplay_internal (C function)
bug-gnu-emacs@HIDDEN
:bug#77620
; Package emacs
.
Full text available.Received: (at submit) by debbugs.gnu.org; 7 Apr 2025 21:49:16 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Mon Apr 07 17:49:15 2025 Received: from localhost ([127.0.0.1]:57308 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1u1uLD-0003VW-IS for submit <at> debbugs.gnu.org; Mon, 07 Apr 2025 17:49:15 -0400 Received: from lists.gnu.org ([2001:470:142::17]:60698) by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.84_2) (envelope-from <jdtsmith@HIDDEN>) id 1u1uL7-0003Uc-Lq for submit <at> debbugs.gnu.org; Mon, 07 Apr 2025 17:49:10 -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 <jdtsmith@HIDDEN>) id 1u1uL1-0001LN-Ov for bug-gnu-emacs@HIDDEN; Mon, 07 Apr 2025 17:49:03 -0400 Received: from mail-yb1-xb30.google.com ([2607:f8b0:4864:20::b30]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from <jdtsmith@HIDDEN>) id 1u1uL0-0003cX-10 for bug-gnu-emacs@HIDDEN; Mon, 07 Apr 2025 17:49:03 -0400 Received: by mail-yb1-xb30.google.com with SMTP id 3f1490d57ef6-e5dc299deb4so4783317276.1 for <bug-gnu-emacs@HIDDEN>; Mon, 07 Apr 2025 14:49:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1744062540; x=1744667340; darn=gnu.org; h=to:date:message-id:subject:mime-version:from:from:to:cc:subject :date:message-id:reply-to; bh=Q91aJg7/CQMHluKkHcMPvJZxmH1ZTuCl94qL1ZpAgLY=; b=Ut97N0m3+6HR2hxbR5W6m9PBgPMNztwKjde3+fsml8U7Z0q9/gdssspdP1mzMzayJE 3xfKbxiGHDYBgIZ99Qn+m4Z5N63xgP4OoqsonE6YKFhApbMgjCzbiuFaISD/yGiFjtUY 3zC90bSAOxHzyaFM1UUDDMdKQeyLTkv4gSrKVhWw58UFanZu90RtkPWhhnUhai3h84rT /yAY2rgpfcaVkSKw8SxnmAP+RhZaK7SJHYyUBPekemSHCCLYI9hnDsgqlKRlvlwIcPWs 4LtXMRKk2xUidU1JWzt7DU5VcwtG99sU837IrzTetx4VwurgAenNi/ijsymLsS3QO3jb uy5A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1744062540; x=1744667340; h=to:date:message-id:subject:mime-version:from:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; bh=Q91aJg7/CQMHluKkHcMPvJZxmH1ZTuCl94qL1ZpAgLY=; b=lYXqSqPRuuf5SLSeRKr89gJcCnXcXbZW4nv0QoRvXN42UkWvfmlKffFJVFYZesEei8 KfARlTumb4ds9awpoY5RAam2+CFmlbKfDAFJsO4buA2BHAF/tuB7iIXi08r3zDGNop68 ISzRNrKt5NBl/tP6NP+PFcNacBPmKnJOWZ19kM+umf/nRie9H7wI2hLiT/50pI8zQm9U n8KAsdpzfZjBa+NP80C2Hp2KA412hHcPsWsvsMCuVwnlM6Oo+1LRlTXoQzL5XByDGMDS A+O4zN49/eIV3PZbZosLzCeJXdkN5JuVVt8KjlbWsw5O0dxn1mu0dhH6u5LlE1osVHjY GKHQ== X-Gm-Message-State: AOJu0YxfJc2dUurrtKqj1UDx7hQUx+UmzMo5APHpnP9YCLoP2Y6MbtA7 zZApaCWxY89yJc/JRcRGEURmPrAW74j/L4eKJUshLjoVdvdXd+ibZ9etKw== X-Gm-Gg: ASbGncsxJATSp8vzZOklDCuVw7GnLWnZe7yxFSk2U9bkcVEKC0IwQGc0l47EdAGOhbJ iBG03/8prfeL+ooOQ1EjD8tEqIuqLv8nKgKiTT84A8kKbK0PzJ5u8F/Qqx16sW0411cwBVrEoS9 pBPO+wBSugT+SNSXg/QPrlFTBMlFPBLQPAWDBPZuEK5PfB0tic+mYTMOmrOtUBB1lER8bZnN/dJ ufSR2Hrr3GwyOLq904cQc/ymGt0Jb3CvE/wcBjGlxKgY9CloSylqZ+1qV0LgEqZNwvd8D61NDZ1 ACCTGcNOQkvdN2AMXNIoRMGuBSVKOVDmOGWHvrjzXnRhHPleizoMzzzADQKRTw== X-Google-Smtp-Source: AGHT+IEDKtpZcPWQB7uQ7iWME0tvTSzFg2zvua/dkEKEm3LtIczo0BRrlK5XDXGSYcxHjP6zR2rkfg== X-Received: by 2002:a05:6902:13ce:b0:e6d:fe4e:2fea with SMTP id 3f1490d57ef6-e6e1f9c3caemr21391720276.22.1744062540544; Mon, 07 Apr 2025 14:49:00 -0700 (PDT) Received: from smtpclient.apple ([131.183.188.117]) by smtp.gmail.com with ESMTPSA id 3f1490d57ef6-e6e0caa4e08sm2557131276.38.2025.04.07.14.48.59 for <bug-gnu-emacs@HIDDEN> (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Mon, 07 Apr 2025 14:49:00 -0700 (PDT) From: JD Smith <jdtsmith@HIDDEN> Content-Type: multipart/alternative; boundary="Apple-Mail=_5E795CDF-FFFA-45EF-848B-7DF5E10AF583" Mime-Version: 1.0 (Mac OS X Mail 16.0 \(3826.400.131.1.6\)) Subject: thingatpt can be incredibly slow in python-mode buffers Message-Id: <DD4BC1EE-246D-4080-9B93-07D359F8C70E@HIDDEN> Date: Mon, 7 Apr 2025 17:48:49 -0400 To: bug-gnu-emacs@HIDDEN X-Mailer: Apple Mail (2.3826.400.131.1.6) Received-SPF: pass client-ip=2607:f8b0:4864:20::b30; envelope-from=jdtsmith@HIDDEN; helo=mail-yb1-xb30.google.com 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, FREEMAIL_FROM=0.001, HTML_IMAGE_RATIO_08=0.001, HTML_MESSAGE=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-Spam-Score: 1.7 (+) X-Spam-Report: Spam detection software, running on the system "debbugs.gnu.org", has NOT identified this incoming email as spam. The original message has been attached to this so you can view it or label similar future email. If you have any questions, see the administrator of that system for details. Content preview: As discussed in Bug#77588: > (/ (car (benchmark-run 10 (thing-at-point 'sexp))) 10) Try this test at the start of L8817 in this file (no eglot needed; either python-mode or python-ts-mode is fine, as both show the same issue): Content analysis details: (1.7 points, 10.0 required) pts rule name description ---- ---------------------- -------------------------------------------------- 0.1 URIBL_SBL_A Contains URL's A record listed in the Spamhaus SBL blocklist [URIs: raw.githubusercontent.com] 0.6 URIBL_SBL Contains an URL's NS IP listed in the Spamhaus SBL blocklist [URIs: raw.githubusercontent.com] -0.0 SPF_HELO_PASS SPF: HELO matches SPF record 0.0 FREEMAIL_FROM Sender email is commonly abused enduser mail provider (jdtsmith[at]gmail.com) 1.0 SPF_SOFTFAIL SPF: sender does not match SPF record (softfail) -0.0 RCVD_IN_DNSWL_NONE RBL: Sender listed at https://www.dnswl.org/, no trust [2001:470:142:0:0:0:0:17 listed in] [list.dnswl.org] 0.0 HTML_MESSAGE BODY: HTML included in message 0.0 HTML_IMAGE_RATIO_08 BODY: HTML has a low ratio of text to image area 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: 0.7 (/) --Apple-Mail=_5E795CDF-FFFA-45EF-848B-7DF5E10AF583 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=utf-8 As discussed in Bug#77588: > (/ (car (benchmark-run 10 (thing-at-point 'sexp))) 10) Try this test at the start of L8817 in this file (no eglot needed; = either python-mode or python-ts-mode is fine, as both show the same = issue): = https://raw.githubusercontent.com/matplotlib/matplotlib/refs/heads/main/li= b/matplotlib/axes/_axes.py = https://raw.githubusercontent.com/matplotlib/matplotlib/refs/heads/main/li= b/matplotlib/axes/_axes.py=EF=BF=BC _axes Text Document =C2=B7 353 KB In #77588 this was shown to lead to long intermittent pauses with eglot = in large python buffers, but the issue is more general for any packages = using thingatpt in python buffers.= --Apple-Mail=_5E795CDF-FFFA-45EF-848B-7DF5E10AF583 Content-Type: multipart/related; type="text/html"; boundary="Apple-Mail=_2AF2A801-F5C0-408C-9D43-357A4E8E50C2" --Apple-Mail=_2AF2A801-F5C0-408C-9D43-357A4E8E50C2 Content-Transfer-Encoding: quoted-printable Content-Type: text/html; charset=utf-8 <html><head><meta http-equiv=3D"content-type" content=3D"text/html; = charset=3Dutf-8"></head><body style=3D"overflow-wrap: break-word; = -webkit-nbsp-mode: space; line-break: after-white-space;">As discussed = in Bug#77588:<div><br></div><div><blockquote type=3D"cite" = style=3D"caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0);">(/ (car = (benchmark-run 10 (thing-at-point 'sexp))) = 10)</blockquote></div><div><br></div><div><div style=3D"caret-color: = rgb(0, 0, 0); color: rgb(0, 0, 0);">Try this test at the start of L8817 = in this file (no eglot needed; either python-mode or python-ts-mode is = fine, as both show the same issue):</div><div style=3D"caret-color: = rgb(0, 0, 0); color: rgb(0, 0, 0);"><br></div><div style=3D"caret-color: = rgb(0, 0, 0); color: rgb(0, 0, 0);"><div><div class=3D"apple-rich-link" = draggable=3D"true" role=3D"link" = data-url=3D"https://raw.githubusercontent.com/matplotlib/matplotlib/refs/h= eads/main/lib/matplotlib/axes/_axes.py" style=3D"-webkit-user-select: = all; -webkit-user-drag: element; display: = inline-block;"></div></div></div><div style=3D"display: block;"><div = style=3D"-webkit-user-select: all; -webkit-user-drag: element; display: = inline-block;" class=3D"apple-rich-link" draggable=3D"true" role=3D"link" = data-url=3D"https://raw.githubusercontent.com/matplotlib/matplotlib/refs/h= eads/main/lib/matplotlib/axes/_axes.py"><a = style=3D"border-radius:10px;font-family:-apple-system, Helvetica, Arial, = sans-serif;display:block;-webkit-user-select:none;width:228px;user-select:= none;-webkit-user-modify:read-only;user-modify:read-only;overflow:hidden;t= ext-decoration:none;" class=3D"lp-rich-link" rel=3D"nofollow" = href=3D"https://raw.githubusercontent.com/matplotlib/matplotlib/refs/heads= /main/lib/matplotlib/axes/_axes.py" dir=3D"ltr" role=3D"button" = draggable=3D"false" width=3D"228"><table = style=3D"table-layout:fixed;border-collapse:collapse;width:228px;backgroun= d-color:#E5E6E9;font-family:-apple-system, Helvetica, Arial, = sans-serif;" class=3D"lp-rich-link-emailBaseTable" cellpadding=3D"0" = cellspacing=3D"0" border=3D"0" width=3D"228"><tbody><tr><td = vertical-align=3D"center" align=3D"center"><img = style=3D"width:228px;filter:brightness(0.97);height:228px;" width=3D"228" = height=3D"228" draggable=3D"false" class=3D"lp-rich-link-mediaImage" = alt=3D"preview.png" = src=3D"cid:39E1D319-4829-49C1-BE36-15E2FBEF8F18"></td></tr><tr><td = vertical-align=3D"center"><table bgcolor=3D"#E5E6E9" cellpadding=3D"0" = cellspacing=3D"0" width=3D"228" = style=3D"table-layout:fixed;font-family:-apple-system, Helvetica, Arial, = sans-serif;background-color:rgba(229, 230, 233, 1);" = class=3D"lp-rich-link-captionBar"><tbody><tr><td style=3D"padding:8px = 0px 8px 0px;" class=3D"lp-rich-link-captionBar-textStackItem"><div = style=3D"max-width:100%;margin:0px 16px 0px 16px;overflow:hidden;" = class=3D"lp-rich-link-captionBar-textStack"><div = style=3D"word-wrap:break-word;font-weight:500;font-size:12px;overflow:hidd= en;text-overflow:ellipsis;text-align:left;" = class=3D"lp-rich-link-captionBar-textStack-topCaption-leading"><a = rel=3D"nofollow" = href=3D"https://raw.githubusercontent.com/matplotlib/matplotlib/refs/heads= /main/lib/matplotlib/axes/_axes.py" style=3D"text-decoration: none" = draggable=3D"false"><font color=3D"#272727" style=3D"color: rgba(0, 0, = 0, 0.847059);">_axes</font></a></div><div = style=3D"word-wrap:break-word;font-weight:400;font-size:11px;overflow:hidd= en;text-overflow:ellipsis;text-align:left;" = class=3D"lp-rich-link-captionBar-textStack-bottomCaption-leading"><a = rel=3D"nofollow" = href=3D"https://raw.githubusercontent.com/matplotlib/matplotlib/refs/heads= /main/lib/matplotlib/axes/_axes.py" style=3D"text-decoration: none" = draggable=3D"false"><font color=3D"#808080" style=3D"color: rgba(0, 0, = 0, 0.498039);">Text Document =C2=B7 353 = KB</font></a></div></div></td></tr></tbody></table></td></tr></tbody></tab= le></a></div></div></div><div><br></div><div>In #77588 this was shown to = lead to long intermittent pauses with eglot in large python buffers, but = the issue is more general for any packages using thingatpt in python = buffers.</div></body></html>= --Apple-Mail=_2AF2A801-F5C0-408C-9D43-357A4E8E50C2 Content-Transfer-Encoding: base64 Content-Disposition: inline; filename=preview.png Content-Type: image/png; x-unix-mode=0666; name="preview.png" Content-Id: <39E1D319-4829-49C1-BE36-15E2FBEF8F18> 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 --Apple-Mail=_2AF2A801-F5C0-408C-9D43-357A4E8E50C2-- --Apple-Mail=_5E795CDF-FFFA-45EF-848B-7DF5E10AF583--
JD Smith <jdtsmith@HIDDEN>
:bug-gnu-emacs@HIDDEN
.
Full text available.bug-gnu-emacs@HIDDEN
:bug#77620
; Package emacs
.
Full text available.
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997 nCipher Corporation Ltd,
1994-97 Ian Jackson.