diff options
author | Ömer Sinan Ağacan <omeragacan@gmail.com> | 2016-06-08 09:30:32 -0400 |
---|---|---|
committer | Ömer Sinan Ağacan <omeragacan@gmail.com> | 2016-06-08 09:35:41 -0400 |
commit | d7933cbc28f4f094eba3d128bc147920f68c965b (patch) | |
tree | 762f62356a9cdab54d2d28ef4d68f8ae2dacbbcb /testsuite/driver/testlib.py | |
parent | 80cf4cf0b7ff1513811d985726714c654ef7f032 (diff) | |
download | haskell-d7933cbc28f4f094eba3d128bc147920f68c965b.tar.gz |
Show sources of cost centers in .prof
This fixes the problem with duplicate cost-centre names that was
reported a couple of times before. When a module implements a typeclass
multiple times for different types, methods of different implementations
get same cost-centre names and are reported like this:
COST CENTRE MODULE %time %alloc
CAF GHC.IO.Handle.FD 0.0 32.8
CAF GHC.Read 0.0 1.0
CAF GHC.IO.Encoding 0.0 1.8
showsPrec Main 0.0 1.2
readPrec Main 0.0 19.4
readPrec Main 0.0 20.5
main Main 0.0 20.2
individual inherited
COST CENTRE MODULE no. entries %time %alloc %time %alloc
MAIN MAIN 53 0 0.0 0.2 0.0 100.0
CAF Main 105 0 0.0 0.3 0.0 62.5
readPrec Main 109 1 0.0 0.6 0.0 0.6
readPrec Main 107 1 0.0 0.6 0.0 0.6
main Main 106 1 0.0 20.2 0.0 61.0
== Main 114 1 0.0 0.0 0.0 0.0
== Main 113 1 0.0 0.0 0.0 0.0
showsPrec Main 112 2 0.0 1.2 0.0 1.2
showsPrec Main 111 2 0.0 0.9 0.0 0.9
readPrec Main 110 0 0.0 18.8 0.0 18.8
readPrec Main 108 0 0.0 19.9 0.0 19.9
It's not possible to tell from the report which `==` took how long. This
patch adds one more column at the cost of making outputs wider. The
report now looks like this:
COST CENTRE MODULE SRC %time %alloc
CAF GHC.IO.Handle.FD <entire-module> 0.0 32.9
CAF GHC.IO.Encoding <entire-module> 0.0 1.8
CAF GHC.Read <entire-module> 0.0 1.0
showsPrec Main Main_1.hs:7:19-22 0.0 1.2
readPrec Main Main_1.hs:7:13-16 0.0 19.5
readPrec Main Main_1.hs:4:13-16 0.0 20.5
main Main Main_1.hs:(10,1)-(20,20) 0.0 20.2
individual inherited
COST CENTRE MODULE SRC no. entries %time %alloc %time %alloc
MAIN MAIN <built-in> 53 0 0.0 0.2 0.0 100.0
CAF Main <entire-module> 105 0 0.0 0.3 0.0 62.5
readPrec Main Main_1.hs:7:13-16 109 1 0.0 0.6 0.0 0.6
readPrec Main Main_1.hs:4:13-16 107 1 0.0 0.6 0.0 0.6
main Main Main_1.hs:(10,1)-(20,20) 106 1 0.0 20.2 0.0 61.0
== Main Main_1.hs:7:25-26 114 1 0.0 0.0 0.0 0.0
== Main Main_1.hs:4:25-26 113 1 0.0 0.0 0.0 0.0
showsPrec Main Main_1.hs:7:19-22 112 2 0.0 1.2 0.0 1.2
showsPrec Main Main_1.hs:4:19-22 111 2 0.0 0.9 0.0 0.9
readPrec Main Main_1.hs:7:13-16 110 0 0.0 18.8 0.0 18.8
readPrec Main Main_1.hs:4:13-16 108 0 0.0 19.9 0.0 19.9
CAF Text.Read.Lex <entire-module> 102 0 0.0 0.5 0.0 0.5
To fix failing test cases because of different orderings of cost centres
(e.g. optimized and non-optimized build printing in different order),
with this patch we also start sorting cost centres before printing. The
order depends on 1) entries (more entered cost centres come first) 2)
names (using strcmp() on cost centre names).
Reviewers: simonmar, austin, erikd, bgamari
Reviewed By: simonmar, bgamari
Subscribers: thomie
Differential Revision: https://phabricator.haskell.org/D2282
GHC Trac Issues: #11543, #8473, #7105
Diffstat (limited to 'testsuite/driver/testlib.py')
-rw-r--r-- | testsuite/driver/testlib.py | 47 |
1 files changed, 32 insertions, 15 deletions
diff --git a/testsuite/driver/testlib.py b/testsuite/driver/testlib.py index 53f342371e..fb93721ae3 100644 --- a/testsuite/driver/testlib.py +++ b/testsuite/driver/testlib.py @@ -1763,21 +1763,38 @@ def normalise_prof (str): str = re.sub('[ \t]*main[ \t]+Main.*\n','',str) # We have somthing like this: - - # MAIN MAIN 101 0 0.0 0.0 100.0 100.0 - # k Main 204 1 0.0 0.0 0.0 0.0 - # foo Main 205 1 0.0 0.0 0.0 0.0 - # foo.bar Main 207 1 0.0 0.0 0.0 0.0 - - # then we remove all the specific profiling data, leaving only the - # cost centre name, module, and entries, to end up with this: - - # MAIN MAIN 0 - # k Main 1 - # foo Main 1 - # foo.bar Main 1 - - str = re.sub('\n([ \t]*[^ \t]+)([ \t]+[^ \t]+)([ \t]+\\d+)([ \t]+\\d+)[ \t]+([\\d\\.]+)[ \t]+([\\d\\.]+)[ \t]+([\\d\\.]+)[ \t]+([\\d\\.]+)','\n\\1 \\2 \\4',str) + # + # MAIN MAIN <built-in> 53 0 0.0 0.2 0.0 100.0 + # CAF Main <entire-module> 105 0 0.0 0.3 0.0 62.5 + # readPrec Main Main_1.hs:7:13-16 109 1 0.0 0.6 0.0 0.6 + # readPrec Main Main_1.hs:4:13-16 107 1 0.0 0.6 0.0 0.6 + # main Main Main_1.hs:(10,1)-(20,20) 106 1 0.0 20.2 0.0 61.0 + # == Main Main_1.hs:7:25-26 114 1 0.0 0.0 0.0 0.0 + # == Main Main_1.hs:4:25-26 113 1 0.0 0.0 0.0 0.0 + # showsPrec Main Main_1.hs:7:19-22 112 2 0.0 1.2 0.0 1.2 + # showsPrec Main Main_1.hs:4:19-22 111 2 0.0 0.9 0.0 0.9 + # readPrec Main Main_1.hs:7:13-16 110 0 0.0 18.8 0.0 18.8 + # readPrec Main Main_1.hs:4:13-16 108 0 0.0 19.9 0.0 19.9 + # + # then we remove all the specific profiling data, leaving only the cost + # centre name, module, src, and entries, to end up with this: (modulo + # whitespace between columns) + # + # MAIN MAIN <built-in> 0 + # readPrec Main Main_1.hs:7:13-16 1 + # readPrec Main Main_1.hs:4:13-16 1 + # == Main Main_1.hs:7:25-26 1 + # == Main Main_1.hs:4:25-26 1 + # showsPrec Main Main_1.hs:7:19-22 2 + # showsPrec Main Main_1.hs:4:19-22 2 + # readPrec Main Main_1.hs:7:13-16 0 + # readPrec Main Main_1.hs:4:13-16 0 + + # Split 9 whitespace-separated groups, take columns 1 (cost-centre), 2 + # (module), 3 (src), and 5 (entries). SCC names can't have whitespace, so + # this works fine. + str = re.sub(r'\s*(\S+)\s*(\S+)\s*(\S+)\s*(\S+)\s*(\S+)\s*(\S+)\s*(\S+)\s*(\S+)\s*(\S+)\s*', + '\\1 \\2 \\3 \\5\n', str) return str def normalise_slashes_( str ): |