Commit 2b57a1f8 authored by Matthew Rothenberg's avatar Matthew Rothenberg
Browse files

import from mroth dotfiles repo

parents
# 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`.
## Installation
TODO: installation instructions for OMZ, antigen, prezto etc
# Caches the output of a binary initialization command, to avoid the time to
# execute it in the future.
#
# Usage: _evalcache <command> <generation args...>
# default cache directory
export ZSH_EVALCACHE_DIR=${ZSH_EVALCACHE_DIR:-"$HOME/.zsh-evalcache"}
function _evalcache () {
local cacheFile="$ZSH_EVALCACHE_DIR/init-$1.sh"
if [ "$ZSH_EVALCACHE_DISABLE" = "true" ]; then
eval "$("$@")"
elif [ -s "$cacheFile" ]; then
source "$cacheFile"
else
if type "$1" > /dev/null; then
(>&2 echo "$1 initialization not cached, caching output of: $*")
mkdir -p "$ZSH_EVALCACHE_DIR"
"$@" > "$cacheFile"
source "$cacheFile"
else
echo "evalcache ERROR: $1 is not installed or in PATH"
fi
fi
}
function _evalcache_clear () {
rm -i "$ZSH_EVALCACHE_DIR"/init-*.sh
}
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment