[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
bug#50777: Dropping EIEIO from xref (for performance)
From: |
Dmitry Gutov |
Subject: |
bug#50777: Dropping EIEIO from xref (for performance) |
Date: |
Fri, 24 Sep 2021 16:28:38 +0300 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.13.0 |
X-Debbugs-CC: Eli Zaretskii <eliz@gnu.org>, Lars Ingebrigtsen
<larsi@gnus.org>, Stefan Monnier <monnier@iro.umontreal.ca>, Daniel
Martín <mardani29@yahoo.es>, Mattias Engdegård <mattiase@acm.org>
With the recent discussion about our Lisp overhead when the search
returns many matches, I went a couple more rounds to try to identify the
hotspots.
My main benchmark for that is
(benchmark 1 '(project-find-regexp "list"))
in the Emacs repo. The 3 recent commits have reduced that time from 8s
to 6.5s on my machine (under best conditions: warm disk cache and fresh
Emacs session). The machine is pretty fast, so I figure we can multiply
that timing by 2x, to imagine the average user experience.
Having exhausted the obvious steps, I have looked at the difference
between defclass and cl-defstruct in this respect. Earlier quick tests
indicated there would be little to no difference, but now that I've
wrote the full patch, it's significant.
The attached patch drops the timing of the above benchmark further down
to 4.1s here.
Both allocation ('make-instance' vs auto-generated 'xref-make-*' struct
constructors) and accessing the fields show increased performance, with
the former showing the most improvement: I guess EIEIO's type checking
added some extra overhead.
That creates some incompatibility (third-party packages can't inherit
from 'xref-location' anymore, or use 'make-instance', 'oref' or
'with-slots' with our values), but OTOH a quick survey of existing
packages that integrate with Xref shows they wisely don't do that
already. Not the largest, popular ones I have reviewed, at least.
The ones that do can be updated to rely on the recommended public
interface: the xref-make-* constructors and the generic functions to
access the data. This will keep the code compatible with both new and
previous versions of Xref.
I'd like to push it soon, so users of Emacs 28 can enjoy the speedup.
What do people think?
xref-from-defclass-to-defstruct.diff
Description: Text Data
- bug#50777: Dropping EIEIO from xref (for performance),
Dmitry Gutov <=
bug#50777: Dropping EIEIO from xref (for performance), Arthur Miller, 2021/09/24
bug#50777: Dropping EIEIO from xref (for performance), Lars Ingebrigtsen, 2021/09/24