Figure out why your builds are slow. This tool analyzes how long it takes GHC to compile your Haskell modules, broken down by phase. It can draw both bar charts and treemaps, of time or space usage.
cd <my-project>
stack clean
stack build --ghc-options "-ddump-to-file -ddump-timings"
# ----- OR -----
cabal clean
cabal build all --ghc-options "-ddump-to-file -ddump-timings"
If you have Nix, you can simply run time-ghc-modules
from Nixpkgs!
nix run nixpkgs#time-ghc-modules
Or, clone the repo first:
git clone git@github.com:codedownio/time-ghc-modules.git /path/to/time-ghc-modules
# If you have Nix, you can use the fully reproducible version
/path/to/time-ghc-modules/time-ghc-modules-nix
# Otherwise, your system needs to have SQLite >= 3.33.0, Python 3, and sed
/path/to/time-ghc-modules/time-ghc-modules
The script will search for all your *.dump-timings
files and analyze them. It will finish by printing out the path to an HTML file:
...
--> Wrote report at file:///tmp/tmp.pvnp4FYmLa/report.html
You can generate the time report below for hledger by running the following commands (assuming you have Nix).
set -e
cd $(mktemp -d)
git clone git@github.com:simonmichael/hledger.git
git clone git@github.com:codedownio/time-ghc-modules.git
cd hledger
stack build --ghc-options "-ddump-to-file -ddump-timings"
../time-ghc-modules/time-ghc-modules-nix
- The script will output its log messages to
stderr
and print the final report path tostdout
(assuming it didn't exit with a failure). This makes it easy to use the output in scripts. For example:
# Build the report and open it in your browser
> firefox $(/path/to/time-ghc-modules/time-ghc-modules)
# Build the report in CI and stash it somewhere
> cp $(/path/to/time-ghc-modules/time-ghc-modules) $MY_CI_ARTIFACTS_DIR/
- You can also look at the timing of individual components, but doing e.g.
stack build some-component:lib
. But, make sure to clean up any old.dump-timings
files from previous runs:
find . -name "*.dump-timings" | xargs rm
- GHC's
-dumpdir
option can be used to consolidate the.dump-timings
files, so they aren't left all over your source tree. For example:
stack build --ghc-options "-ddump-to-file -ddump-timings -dumpdir .ghcdump"
The flag -ddump-timings
is available for GHC >= 8.4.1
.