unofficial mirror of bug-gnu-emacs@gnu.org 
 help / color / mirror / code / Atom feed
From: Eli Zaretskii <eliz@gnu.org>
To: Keith David Bershatsky <esq@lawlist.com>
Cc: 22763@debbugs.gnu.org
Subject: bug#22763: 25.1.50; Feature Request -- A faster method to obtain line number at position.
Date: Mon, 22 Feb 2016 18:06:37 +0200	[thread overview]
Message-ID: <83y4aclofm.fsf@gnu.org> (raw)
In-Reply-To: <m2r3g5bh3n.wl%esq@lawlist.com> (message from Keith David Bershatsky on Sun, 21 Feb 2016 18:42:52 -0800)

> Date: Sun, 21 Feb 2016 18:42:52 -0800
> From: Keith David Bershatsky <esq@lawlist.com>
> 
> A while back, I posed a question on emacs.stackexchange.com for a faster method to obtain `line-number-at-pos`.  A user by the name of Constantine came up with `(format-mode-line "%l")`, which is indeed much faster.  I think the draft code below may be just a tad faster, with the added feature of the POS argument.
> 
> http://emacs.stackexchange.com/questions/3821/a-faster-method-to-obtain-line-number-at-pos-in-large-buffers
> 
> A user named wasamasa posted a comment: "Be aware that this method will give you "??" for lines exceeding line-number-display-limit-width which is set to a value of 200 per default as I found out here."
> 
> And Stefan posted a comment:  "IIRC the result may also be unreliable if there have been modifications in the buffer since the last redisplay."
> 
> The thread has received 555 hits in the past year, and several have star-ed it and up-voted the question and answer.
> 
> The following is a draft in C based on the existing function `decode_mode_spec` that lets the user input the POS as an argument without the necessity to use `goto-char`.  I'm not sure if it resolves either of the comments above.  The draft is not meant to be a patch per se, because I'm not a programmer and am just beginning my tinkering quest into the language of C.  I have been using it in my own setup for about a week and I haven't seen any ill effects.  It can of course use some TLC by someone more knowledgeable than myself.

This would overwrite the line number and position cached by each
window for redisplay purposes.  I think this is undesirable.  More
importantly, the gotchas pointed out above will still be true, AFAICT.

My suggestion is instead to expose display_count_lines to Lisp via a
simple wrapper (that would need to take care of narrowing and such
likes, something that your proposed API doesn't do, btw).  In my
limited testing I saw a 5- to 10-fold speedup as compared to
line-number-at-pos, when doing that.  I think this is good enough;
applications that need faster massive counting, if there are such
applications, can implement a cache in Lisp and speed this up even
more.

Thanks.





  reply	other threads:[~2016-02-22 16:06 UTC|newest]

Thread overview: 40+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-02-22  2:42 bug#22763: 25.1.50; Feature Request -- A faster method to obtain line number at position Keith David Bershatsky
2016-02-22 16:06 ` Eli Zaretskii [this message]
2021-02-07 15:07   ` Lars Ingebrigtsen
2021-02-07 15:44     ` Lars Ingebrigtsen
2021-02-07 16:07     ` Lars Ingebrigtsen
2021-02-07 17:40       ` Stefan Monnier
2021-02-07 17:45         ` Lars Ingebrigtsen
2021-02-07 18:07           ` Lars Ingebrigtsen
2021-02-07 18:09           ` Eli Zaretskii
2021-02-07 18:14             ` Lars Ingebrigtsen
2021-02-07 18:23               ` Lars Ingebrigtsen
2021-02-07 19:02                 ` Eli Zaretskii
2021-02-07 19:06                   ` Eli Zaretskii
2021-02-07 19:25                   ` Lars Ingebrigtsen
2021-02-07 19:34                     ` Lars Ingebrigtsen
2021-02-07 19:43                       ` Eli Zaretskii
2021-02-07 19:42                     ` Eli Zaretskii
2021-02-07 19:46                       ` Lars Ingebrigtsen
2021-02-07 19:52                         ` Eli Zaretskii
2021-02-07 21:52                           ` Lars Ingebrigtsen
2021-02-07 21:58                             ` Lars Ingebrigtsen
2021-02-08  3:34                               ` Eli Zaretskii
2021-02-07 22:09                             ` Philipp
2021-02-07 20:37                     ` Stefan Monnier
2021-02-07 20:42                       ` Lars Ingebrigtsen
2021-02-07 20:50                         ` Eli Zaretskii
2021-02-07 21:36                           ` Lars Ingebrigtsen
2021-02-08 15:04                             ` Eli Zaretskii
2021-02-09  2:17                               ` Katsumi Yamaoka
2021-02-09  7:13                                 ` Lars Ingebrigtsen
2021-05-19 23:55 ` Ben Levy via Bug reports for GNU Emacs, the Swiss army knife of text editors
2021-05-20  6:45   ` Eli Zaretskii
2021-05-20  7:27     ` Andreas Schwab
2021-05-20  7:35       ` Ben Levy via Bug reports for GNU Emacs, the Swiss army knife of text editors
2021-05-20  9:08         ` Eli Zaretskii
2021-05-20  9:03       ` Eli Zaretskii
2021-05-20 19:53 ` Ben Levy via Bug reports for GNU Emacs, the Swiss army knife of text editors
2021-05-20 20:09   ` Eli Zaretskii
2021-05-20 20:40 ` Ben Levy via Bug reports for GNU Emacs, the Swiss army knife of text editors
2021-05-21  5:46   ` Eli Zaretskii

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=83y4aclofm.fsf@gnu.org \
    --to=eliz@gnu.org \
    --cc=22763@debbugs.gnu.org \
    --cc=esq@lawlist.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).