From: Yuan Fu <casouri@gmail.com>
To: JD Smith <jdtsmith@gmail.com>
Cc: Dmitry Gutov <dmitry@gutov.dev>, emacs-devel@gnu.org
Subject: Re: Tree-sitter navigation time grows as sqrt(line-number)
Date: Sat, 19 Aug 2023 15:16:12 -0700 [thread overview]
Message-ID: <69D18963-D94F-4792-9FF1-159897A99E50@gmail.com> (raw)
In-Reply-To: <1F7C956D-6D22-4CC1-8656-6E2A4D07D5FB@gmail.com>
[-- Attachment #1: Type: text/plain, Size: 1580 bytes --]
> On Aug 19, 2023, at 7:24 AM, JD Smith <jdtsmith@gmail.com> wrote:
>
> Thanks for your patch, Dmitry. I had a chance to test it this morning (the new, non-crashing version). I made a new NS build, with and without the patch. The results are really striking (scroll to bottom):
>
> https://gist.github.com/jdtsmith/7fa6263a13559d587abb51827e6ae472
>
> Summary:
>
> - Applying the same test above on _axes.py reproduces the earlier emacs-mac/29 results: the time to navigate from the node at line beginning to root starts at under 10µs, but rises as sqrt(N) by ~100x, reaching over 3000µs.
>
> - With Dimitry’s patch, it performs much, much better, starting off with similar timing at early positions in the file, but rising no higher than 50µs, scaling much shallower than sqrt(N).
>
> I should emphasize this is a new fast machine; I fully expect my old laptop would be much slower (10x ?) than 3ms in files this large, which makes using parent navigation for things like font-lock problematic.
>
> The patched version results also make a lot more sense in terms of their similar logarithmic growth as node-at-point, since the method of search for a node at point and for its parent is, as Yuan points at, quite similar.
I inspected the descending algorithm, and there’s indeed an oversight made by me. Here’s a patch that should fix it. I tested it briefly and it does speeds things up greatly. Thanks for investigating this, JD!
I think the patch is relatively safe, so maybe we can push it to emacs-29 instead of master.
Yuan
[-- Attachment #2: node-parent.patch --]
[-- Type: application/octet-stream, Size: 1088 bytes --]
From dd20c4449493765c22dd2067ae410490e9f1d1dc Mon Sep 17 00:00:00 2001
From: Yuan Fu <casouri@gmail.com>
Date: Sat, 19 Aug 2023 15:04:20 -0700
Subject: [PATCH] Fix treesit_cursor_helper_1
* src/treesit.c (treesit_cursor_helper_1): Skip child nodes that can't
contain TARGET when traversing the tree: only traverse down the child
node if that node's end is grater or equal to TARGET's end.
---
src/treesit.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/src/treesit.c b/src/treesit.c
index 1f694e47201..f9e98244a4f 100644
--- a/src/treesit.c
+++ b/src/treesit.c
@@ -3048,7 +3048,8 @@ treesit_cursor_helper_1 (TSTreeCursor *cursor, TSNode *target,
siblings that could contain TARGET. */
while (ts_node_start_byte (cursor_node) <= end_pos)
{
- if (treesit_cursor_helper_1 (cursor, target, end_pos, limit - 1))
+ if (ts_node_end_byte (cursor_node) >= end_pos
+ && treesit_cursor_helper_1 (cursor, target, end_pos, limit - 1))
return true;
if (!ts_tree_cursor_goto_next_sibling (cursor))
--
2.41.0
next prev parent reply other threads:[~2023-08-19 22:16 UTC|newest]
Thread overview: 40+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-08-17 4:01 Tree-sitter navigation time grows as sqrt(line-number) JD Smith
2023-08-17 10:56 ` Dmitry Gutov
2023-08-17 11:41 ` Eli Zaretskii
2023-08-17 11:51 ` tomas
2023-08-17 12:21 ` JD Smith
2023-08-17 12:34 ` Dmitry Gutov
2023-08-17 13:19 ` Dmitry Gutov
2023-08-19 14:24 ` JD Smith
2023-08-19 22:16 ` Yuan Fu [this message]
2023-08-20 0:18 ` JD Smith
2023-08-20 0:39 ` Dmitry Gutov
2023-08-20 2:01 ` Yuan Fu
2023-08-20 12:40 ` JD Smith
2023-08-20 20:26 ` Dmitry Gutov
2023-08-22 1:41 ` Yuan Fu
2023-08-22 21:07 ` JD Smith
2023-08-31 4:26 ` Yuan Fu
2023-08-31 6:03 ` Eli Zaretskii
2023-08-31 11:04 ` Dmitry Gutov
2023-08-31 11:42 ` Po Lu
2023-08-31 17:32 ` Dmitry Gutov
2023-08-31 12:51 ` Eli Zaretskii
2023-08-31 13:58 ` JD Smith
2023-08-31 17:49 ` Dmitry Gutov
2023-08-31 19:03 ` Yuan Fu
2023-08-31 19:06 ` Eli Zaretskii
2023-08-31 20:24 ` Stefan Kangas
2023-09-01 5:33 ` Eli Zaretskii
2023-08-20 6:18 ` Eli Zaretskii
2023-08-18 3:00 ` Yuan Fu
2023-08-18 4:19 ` JD Smith
2023-08-18 5:20 ` Yuan Fu
2023-08-18 13:21 ` Dmitry Gutov
2023-08-18 13:39 ` JD Smith
[not found] <87v8ddsqwe.fsf@web.de>
2023-08-17 14:25 ` Dmitry Gutov
2023-08-17 14:36 ` Dmitry Gutov
2023-08-17 15:01 ` Dmitry Gutov
2023-08-17 15:15 ` Felix
2023-08-18 2:49 ` Yuan Fu
2023-08-18 13:29 ` Dmitry Gutov
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://www.gnu.org/software/emacs/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=69D18963-D94F-4792-9FF1-159897A99E50@gmail.com \
--to=casouri@gmail.com \
--cc=dmitry@gutov.dev \
--cc=emacs-devel@gnu.org \
--cc=jdtsmith@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/emacs.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).