Skip to content

Files

Latest commit

aae9f67 · Jan 16, 2017

History

History
62 lines (46 loc) · 1.14 KB

README.md

File metadata and controls

62 lines (46 loc) · 1.14 KB

Add to the script to be profiled:

Start:

PS4=$'\\\011%D{%s%6.}\011%x\011%I\011%N\011%e\011'
exec 3>&2 2>/tmp/zshprof.$$.log
setopt xtrace prompt_subst

End:

unsetopt xtrace
exec 2>&3 3>&-

setup ocaml on osx:

brew install ocaml
brew install opam
brew info opam
eval `opam config env`
source ~/.opam/opam-init/init.zsh
opam update
opam install ocamlfind

Compile the tool:

ocamlfind ocamlopt -linkpkg -thread -package str Callgrind.ml ZshXtrace.ml ZshXtraceToCallgrind.ml -o "zshprof.bin"

run the zshprof tool on your trace output file

./zshprof.bin < /tmp/zshprof.57612.log > /tmp/zshprof.57612.callgrind

View the result:

#on linux
kcachegrind zsh.callgrind
# on osx
brew install qcachegrind --with-graphviz
qcachegrind /tmp/zshprof.57612.callgrind

Limitations:

  • This approach is utterly broken when there is any parallellism. You'll have to fall back to zprof when that is the case.
  • It seems kcachegrind doesn't like it when you use the same filename for different traces.. careful.

A quick check

time bash -li -c 'echo hi; exit;'
time zsh -li -c 'echo hi; exit;'