all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
From: Stefan Monnier <monnier@iro.umontreal.ca>
To: emacs-devel@gnu.org
Subject: Re: Pushing the `gnus-range-*' functions down into the C layer
Date: Fri, 10 Sep 2010 12:43:11 +0200	[thread overview]
Message-ID: <jwvzkvp99lz.fsf-monnier+emacs@gnu.org> (raw)
In-Reply-To: <m31v939cbb.fsf@quimbies.gnus.org> (Lars Magne Ingebrigtsen's message of "Thu, 09 Sep 2010 17:16:56 +0200")

> Would anyone mind if I implemented the `gnus-range-*' functions in C for
> Emacs 24?  Gnus spends significant time on group entry/exit doing range
> handling/compressing/etc, and I think the functions are (slightly)
> generally useful.

I wouldn't rule it out, but I'm reluctant to move Elisp code to C for
the same kinds of reason Andy just gave.  Especially for such a thing as
range/interval algorithms where the best algorithm depends a fair bit on
the particular shape of your data.
OTOH, speeding up Elisp is not something I expect to happen soon
(although moving to lexical bindings is a step in the right direction).

Maybe once we have dyn-loading in place, Gnus can provide its own
C functions outside of Emacs's own C code.

> Gnus addresses articles by their number, so you have things like the
> "marked" list of articles that looks like
> (3 4 5 6 7 11 14 15 16 17 18)

What algorithm does Gnus use currently?  I guess you call `sort' and
then scan the list looking for contiguous points?  That would make it
O(n log n), which isn't too bad, but it also means that the C part of
the code is O(n log n) and the Elisp part is O(n), so the speed of Elisp
should not be a big issue.

> (or something).  To save loading/saving time, these are stored in the
> .newsrc.eld file as range structures, which look like this:

> ((3 . 7) 11 (14 . 18))

> To handle this, Gnus has a set of functions for computing
> intersections/differences/etc on the range structures.

Ah, so you don't just convert to/from lists of points to intervals, but
you also work directly on intervals.  What algorithms do you use there?
These should be O(n), right?  What do you know about the usual shape of
your data?  E.g. what's the expected difference between the smallest and
the largest element (if it's not too large, we could store them in
bitvectors and then provide bitwise or/and on bitvectors)?

> However, Emacs Lisp isn't really fast at doing this,

It's not fast at other things either ;-)


        Stefan



  parent reply	other threads:[~2010-09-10 10:43 UTC|newest]

Thread overview: 48+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-09-09 15:16 Pushing the `gnus-range-*' functions down into the C layer Lars Magne Ingebrigtsen
2010-09-09 19:01 ` Ted Zlatanov
2010-09-09 21:58   ` Lars Magne Ingebrigtsen
2010-09-09 22:25     ` Ted Zlatanov
2010-09-10  3:24     ` Stephen J. Turnbull
2010-09-10 13:53       ` Ted Zlatanov
2010-09-10 14:01         ` Lars Magne Ingebrigtsen
2010-09-10 14:08           ` Leo
2010-09-10 14:15             ` Lars Magne Ingebrigtsen
2010-09-10 14:19               ` Wojciech Meyer
2010-09-11  9:44             ` Stefan Monnier
2010-09-10 14:18           ` Ted Zlatanov
2010-09-10 14:28             ` Lars Magne Ingebrigtsen
2010-09-10 14:38               ` bignums (was: Pushing the `gnus-range-*' functions down into the C layer) Ted Zlatanov
2010-09-10 15:16               ` Pushing the `gnus-range-*' functions down into the C layer Andreas Schwab
2010-09-10 15:22                 ` David Kastrup
2010-09-10 15:26                   ` Lars Magne Ingebrigtsen
2010-09-11  9:48                     ` Stefan Monnier
2010-09-11 11:57                       ` Lars Magne Ingebrigtsen
2010-09-11 15:36                         ` Stephen J. Turnbull
2010-09-11 15:51                           ` Lars Magne Ingebrigtsen
2010-09-11 16:15                             ` Wojciech Meyer
2010-09-12  9:57                               ` Stefan Monnier
2010-09-10 19:28             ` Tom Tromey
2010-09-14 15:52               ` Ted Zlatanov
2010-09-11  5:52           ` Stephen J. Turnbull
2010-09-13 11:45       ` Eli Zaretskii
2010-09-09 22:21 ` Wojciech Meyer
2010-09-09 23:48   ` Ted Zlatanov
2010-09-09 23:56     ` Wojciech Meyer
2010-09-10  0:07       ` Lars Magne Ingebrigtsen
2010-09-10  0:17         ` Wojciech Meyer
2010-09-10  8:06 ` Andy Wingo
2010-09-10 10:20   ` Wojciech Meyer
2010-09-10 10:43 ` Stefan Monnier [this message]
2010-09-10 12:35   ` Lars Magne Ingebrigtsen
2010-09-10 12:49     ` rfc2047-decode-string in C? Lars Magne Ingebrigtsen
2010-09-10 13:47       ` Stefan Monnier
2010-09-10 13:51         ` Lars Magne Ingebrigtsen
2010-09-11 16:10           ` Lars Magne Ingebrigtsen
2010-09-10 13:07     ` Pushing the `gnus-range-*' functions down into the C layer joakim
2010-09-10 13:22       ` Lars Magne Ingebrigtsen
2010-09-10 13:45     ` Stefan Monnier
2010-09-10 14:01       ` Ted Zlatanov
2010-09-10 14:09         ` Lars Magne Ingebrigtsen
2010-09-11  9:36         ` Stefan Monnier
2010-09-10 14:06       ` Lars Magne Ingebrigtsen
2010-09-11  3:18     ` Daniel Pittman

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

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=jwvzkvp99lz.fsf-monnier+emacs@gnu.org \
    --to=monnier@iro.umontreal.ca \
    --cc=emacs-devel@gnu.org \
    /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 external index

	https://git.savannah.gnu.org/cgit/emacs.git
	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.