From e798db14e87fd4bbb5c0068fb5052ba3e5f92d4b Mon Sep 17 00:00:00 2001 From: John MacFarlane Date: Fri, 26 Feb 2021 23:52:28 -0800 Subject: Add tools/parseTimings.pl. A script to help pin down which modules take the most time and memory to compile. --- tools/parseTimings.pl | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 tools/parseTimings.pl (limited to 'tools') diff --git a/tools/parseTimings.pl b/tools/parseTimings.pl new file mode 100644 index 000000000..aa12bfabb --- /dev/null +++ b/tools/parseTimings.pl @@ -0,0 +1,33 @@ +#!/usr/bin/env perl + +# Breaks down compilation time and memory usage by module. +# To use this script, do +# +# stack clean +# stack build --ghc-options='-dshow-passes' 2>output.txt +# perl parseTimings.pl output.txt + +while (<>) { + if (/!!! (.*) \[(.*)\]: finished in (.*) milliseconds, allocated (.*) megabytes/) { + $phase = $1; + $module = $2; + $milliseconds = $3; + $megabytes = $4; + if (!$timings{$module}) { + $timings{$module} = {'milliseconds' => 0, 'megabytes' => 0}; + }; + $timings{$module}{'milliseconds'} += $milliseconds; + $timings{$module}{'megabytes'} += $megabytes; + } + } + printf("%10s %10s %s\n", "Time (ms)", "Alloc (Mb)", "LOC", "Module"); + for (keys %timings) { + $path = $_; + $path =~ s/\./\//g; + $path = "src/$path.hs"; + $loc = `wc -l $path 2>/dev/null`; + if ($loc) { + $loc =~ s/^\s*(\d+).*/\1/; + printf("%10d %10d %6d %s\n", $timings{$_}{'milliseconds'}, $timings{$_}{'megabytes'}, $loc, $_); + } +} -- cgit v1.2.3