Skip to content

Package require route cacher component #1190

@errge

Description

@errge

If I strace my emacs setup, there is this part in the middle:

openat(AT_FDCWD, "/home/errge/.emacs.d/straight/build/outli/windmove.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000012>
openat(AT_FDCWD, "/home/errge/.emacs.d/straight/build/outli/windmove.so.gz", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000009>
openat(AT_FDCWD, "/home/errge/.emacs.d/straight/build/outli/windmove.elc", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000008>
openat(AT_FDCWD, "/home/errge/.emacs.d/straight/build/outli/windmove.elc.gz", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000009>
openat(AT_FDCWD, "/home/errge/.emacs.d/straight/build/outli/windmove.el", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000008>
openat(AT_FDCWD, "/home/errge/.emacs.d/straight/build/outli/windmove.el.gz", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000008>
openat(AT_FDCWD, "/home/errge/.emacs.d/straight/build/request/windmove.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000009>
openat(AT_FDCWD, "/home/errge/.emacs.d/straight/build/request/windmove.so.gz", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000009>
openat(AT_FDCWD, "/home/errge/.emacs.d/straight/build/request/windmove.elc", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000008>
openat(AT_FDCWD, "/home/errge/.emacs.d/straight/build/request/windmove.elc.gz", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000012>
openat(AT_FDCWD, "/home/errge/.emacs.d/straight/build/request/windmove.el", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000018>
openat(AT_FDCWD, "/home/errge/.emacs.d/straight/build/request/windmove.el.gz", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000010>
openat(AT_FDCWD, "/home/errge/.emacs.d/straight/build/popup/windmove.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000013>
openat(AT_FDCWD, "/home/errge/.emacs.d/straight/build/popup/windmove.so.gz", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000010>
openat(AT_FDCWD, "/home/errge/.emacs.d/straight/build/popup/windmove.elc", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000009>
openat(AT_FDCWD, "/home/errge/.emacs.d/straight/build/popup/windmove.elc.gz", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000008>
openat(AT_FDCWD, "/home/errge/.emacs.d/straight/build/popup/windmove.el", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000008>
openat(AT_FDCWD, "/home/errge/.emacs.d/straight/build/popup/windmove.el.gz", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000008>
openat(AT_FDCWD, "/home/errge/.emacs.d/straight/build/dash/windmove.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000008>
openat(AT_FDCWD, "/home/errge/.emacs.d/straight/build/dash/windmove.so.gz", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000008>
openat(AT_FDCWD, "/home/errge/.emacs.d/straight/build/dash/windmove.elc", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000008>
openat(AT_FDCWD, "/home/errge/.emacs.d/straight/build/dash/windmove.elc.gz", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000009>
openat(AT_FDCWD, "/home/errge/.emacs.d/straight/build/dash/windmove.el", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000008>
openat(AT_FDCWD, "/home/errge/.emacs.d/straight/build/dash/windmove.el.gz", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000008>
openat(AT_FDCWD, "/home/errge/.emacs.d/straight/build/s/windmove.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000009>
openat(AT_FDCWD, "/home/errge/.emacs.d/straight/build/s/windmove.so.gz", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000009>
openat(AT_FDCWD, "/home/errge/.emacs.d/straight/build/s/windmove.elc", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000008>
openat(AT_FDCWD, "/home/errge/.emacs.d/straight/build/s/windmove.elc.gz", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000009>
openat(AT_FDCWD, "/home/errge/.emacs.d/straight/build/s/windmove.el", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000008>
openat(AT_FDCWD, "/home/errge/.emacs.d/straight/build/s/windmove.el.gz", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000008>
openat(AT_FDCWD, "/home/errge/.emacs.d/straight/build/dumb-jump/windmove.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000009>
openat(AT_FDCWD, "/home/errge/.emacs.d/straight/build/dumb-jump/windmove.so.gz", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000010>
openat(AT_FDCWD, "/home/errge/.emacs.d/straight/build/dumb-jump/windmove.elc", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000009>
openat(AT_FDCWD, "/home/errge/.emacs.d/straight/build/dumb-jump/windmove.elc.gz", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000009>
openat(AT_FDCWD, "/home/errge/.emacs.d/straight/build/dumb-jump/windmove.el", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000008>
openat(AT_FDCWD, "/home/errge/.emacs.d/straight/build/dumb-jump/windmove.el.gz", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000008>
openat(AT_FDCWD, "/home/errge/.emacs.d/straight/build/keypress-multi-event/windmove.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000009>
openat(AT_FDCWD, "/home/errge/.emacs.d/straight/build/keypress-multi-event/windmove.so.gz", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000009>
openat(AT_FDCWD, "/home/errge/.emacs.d/straight/build/keypress-multi-event/windmove.elc", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000008>
openat(AT_FDCWD, "/home/errge/.emacs.d/straight/build/keypress-multi-event/windmove.elc.gz", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000008>
openat(AT_FDCWD, "/home/errge/.emacs.d/straight/build/keypress-multi-event/windmove.el", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000008>
openat(AT_FDCWD, "/home/errge/.emacs.d/straight/build/keypress-multi-event/windmove.el.gz", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000008>
openat(AT_FDCWD, "/home/errge/.emacs.d/straight/build/home-end/windmove.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000008>
openat(AT_FDCWD, "/home/errge/.emacs.d/straight/build/home-end/windmove.so.gz", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000008>
openat(AT_FDCWD, "/home/errge/.emacs.d/straight/build/home-end/windmove.elc", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000008>
openat(AT_FDCWD, "/home/errge/.emacs.d/straight/build/home-end/windmove.elc.gz", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000009>
openat(AT_FDCWD, "/home/errge/.emacs.d/straight/build/home-end/windmove.el", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000008>
openat(AT_FDCWD, "/home/errge/.emacs.d/straight/build/home-end/windmove.el.gz", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000008>
openat(AT_FDCWD, "/home/errge/.emacs.d/straight/build/seq/windmove.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000009>
openat(AT_FDCWD, "/home/errge/.emacs.d/straight/build/seq/windmove.so.gz", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000021>

This is of course working as intended, the counter of load-path * load-suffixes * load-file-rep-suffixes scales like that, it's just math. If someone were to represent this as a bug, it would be more like a bug in GNU Emacs than in straight.

But I just wanted to float the idea, because we already have the build-cache architecture and everything in place to solve this, to add the following to straight: on each require save the found path into the build cache in a new hash table, and reuse that later if possible (or try the normal require, if the cached info proves to be outdated).

It would reduce the number of syscall round trips in the most happy (99%) case of restart emacs + no changes to installation to 1 from 100.

Strictly speaking this could be a feature that is built-in to Emacs or built-in a separate library, but I'm floating it as a straight.el feature, as mentioned, because we already have the infra.

I might work on this if I find the time, but I wanted to ask for input before I get started, to make sure I don't do stuff that is not upstreamable or not liked.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions