😀

Eval Cache for zsh

🐣 zsh plugin to cache eval loads to improve shell startup time

mroth
|
101 stars
4 forks

evalcache

zsh plugin to cache the output of a binary initialization command, intended to help lower shell startup time.

What it does

There are lots of shell wrapper tools that follow the pattern of asking you to eval a specific init command in your shell startup, for example, rbenv ask

eval "$(hub alias -s)"

While this is very convenient, the reality is there is a small amount of overhead associated with shelling out to this, and the output is almost always actually static in all of the tools I know. So why bear this cost every time you open a new tab in your shell?

Instead, after you load this plugin, you can replace that same command with:

_evalcache hub alias -s

The first time this runs, it will cache the output of the command to a file, which will be sourced in the future instead when it exists.

If you update a tool and expect ifor some reason that t's initialization might have changed, you can simply clear the cache and it will be regenerated.

It also gracefully degrades to a no-op if the tool is no longer installed.

Benchmarks

Some informal benchmarks from my MacBook on my .zshrc:

command without first run subsequent runs savings
rbenv init ~65ms ~65ms ~8ms 88%
hub alias ~30ms ~30ms ~6ms 80%
scmpuff init ~24ms ~25ms ~10ms 58%

The difference isn't huge, but can be handy in shaving down shell startup time, especially if you use a bunch of these tools. Every millisecond counts!

Options

  • $ZSH_EVALCACHE_DIR: cache files storage, default $HOME/.zsh-evalcache.
  • $ZSH_EVALCACHE_DISABLE: set to true if you wish to bypass evalcache.

There is a convenience function to clear the cache called _evalcache_clear.