bug-gnu-emacs
[Top][All Lists]
Advanced

[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:37:25 +0300
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.13.0

Resending with the intended recipients (except for the maintainers who are automatically subscribed anyway, to spare the inboxes).

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?

Attachment: xref-from-defclass-to-defstruct.diff
Description: Text Data


reply via email to

[Prev in Thread] Current Thread [Next in Thread]