From: "Mattias Engdegård" <mattiase@acm.org>
To: Ihor Radchenko <yantar92@gmail.com>
Cc: 52753@debbugs.gnu.org
Subject: bug#52753: 29.0.50; Printing long list-like structures fails
Date: Sun, 23 Jan 2022 17:28:06 +0100 [thread overview]
Message-ID: <E83DB1F5-7A5B-4E71-94F0-BC1128D6578D@acm.org> (raw)
In-Reply-To: <8735le7ha7.fsf@localhost>
23 jan. 2022 kl. 13.44 skrev Ihor Radchenko <yantar92@gmail.com>:
> I tried to understand the printer code, but it appears to be too complex
> for me. Maybe I am just not familiar enough with the C part of Emacs.
It's complex partly because of its age, but also because we ask a lot it. While it would be nice to extend it and the reader to handle arbitrarily complex structures, I'm not sure your case is a motivation strong enough since the complexity of your data structure is more accidental than essential.
> While I understand how the illustrated example is difficult for the
> reader, note that recursion is _not_ in the car slot. Each list element
> is a structure like (key . forward-vector) with key being the stored
> value and forward-vector storing forward references to the next
> elements. Conceptually, ordinary list is just a degenerate case of skip
> list with forward-vector storing a single forward-reference to the next
> element in the list.
Sorry, my mistake -- the recursion is through the stacked conses and vectors in the cdr position, which changes absolutely nothing at all. Your data structure is not a list in the Lisp sense, which is the only recursion that the reader and printer can handle without consuming stack.
> Since your last message, I have dived into the more recent literature on
> data structures.
That's the spirit!
> It looks like skip lists are not that bad - similar to
> even older AVL-tree they got updated with finger search facilities and
> auto-adjustments to non-random data [1,2]. However, a systematic
> comparison between AVL-trees, skip lists, and splay trees reveals that
> insertion into skip lists perform up to 2x worse compared to AVL-trees,
> especially for random insertion [3]. Ref. [3] generally agrees with my
> measurements. On the other hand, Ref. [3] showed that average lookup
> time should be 2x faster in skip lists - very different from my
> implementation. I may be doing something wrong.
Emacs Lisp as an implementation environment comes with its own set of constraints, data structures and primitives that strongly affect what algorithms will be practical and is very different from C, say.
> we have to insert a new element and shift the :begin keys of all the
> elements below:
>
> (:begin 1 "headline 1" ...)
> (:begin 13 "new" ...)
> (:begin 13+7 "subheadline" ...)
> (:begin 28+7 "headline 2" ...)
Forgive my ignorance, but wouldn't this call for some sort of interval tree where the children's offset are relative to their parents? Then shifting keys in an interval only requires modifying a few upper nodes.
> B-trees may be an option, but I do not
> see how they would be advantageous compared to AVL trees. We do
> everything in memory.
Locality matters in memory too! Well-implemented B-trees are usually competitive with binary trees even in RAM. I have no idea how easy that would be to pull off in Elisp, though.
(I've rarely had good experience with splay trees but I suppose they can be useful in the right circumstances.)
> This is really counter-intuitive. I am wondering how much can be the
> difference in practice. At least by orders of magnitude.
Did you expect a difference in orders of magnitude? Implementation choices do not often come that clear-cut.
C primitives can often be faster than ones implemented in Lisp even if using a less clever algorithm (for example, try comparing `memq` against a set implemented as a balanced binary tree lookup in Lisp).
We also have to contend with a rather antique garbage collector.
next prev parent reply other threads:[~2022-01-23 16:28 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-12-23 11:07 bug#52753: 29.0.50; Printing long list-like structures fails Ihor Radchenko
2021-12-23 16:11 ` Mattias Engdegård
2021-12-24 10:56 ` Ihor Radchenko
2021-12-24 16:54 ` Mattias Engdegård
2021-12-25 11:15 ` Mattias Engdegård
2022-01-23 12:44 ` Ihor Radchenko
2022-01-23 16:28 ` Mattias Engdegård [this message]
2022-01-30 9:16 ` Ihor Radchenko
2022-01-30 10:16 ` Mattias Engdegård
2022-05-31 10:31 ` Mattias Engdegård
2022-06-02 13:12 ` Ihor Radchenko
2022-06-02 16:10 ` Mattias Engdegård
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=E83DB1F5-7A5B-4E71-94F0-BC1128D6578D@acm.org \
--to=mattiase@acm.org \
--cc=52753@debbugs.gnu.org \
--cc=yantar92@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).