generate results for GC counts
authorSimon Marlow <marlowsd@gmail.com>
Tue, 5 Apr 2011 09:07:50 +0000 (10:07 +0100)
committerSimon Marlow <marlowsd@gmail.com>
Tue, 5 Apr 2011 09:21:34 +0000 (10:21 +0100)
nofib-analyse/Main.hs
nofib-analyse/Slurp.hs

index 07cb191..138a2b2 100644 (file)
@@ -125,8 +125,10 @@ muttime_spec = SpecP "Mutator Time" "MutTime" "mutator-time" (mean mut_time) run
 mutetime_spec = SpecP "Mutator Elapsed Time" "MutETime" "mutator-elapsed-time" (mean mut_elapsed_time) run_status time_ok
 gctime_spec  = SpecP "GC Time" "GCTime" "gc-time" (mean gc_time) run_status time_ok
 gcelap_spec  = SpecP "GC Elapsed Time" "GCETime" "gc-elapsed-time" (mean gc_elapsed_time) run_status time_ok
+gc0count_spec  = SpecP "GC(0) Count" "GC0Count" "gc0-count" (meanInt gc0_count) run_status always_ok
 gc0time_spec  = SpecP "GC(0) Time" "GC0Time" "gc0-time" (mean gc0_time) run_status time_ok
 gc0elap_spec  = SpecP "GC(0) Elapsed Time" "GC0ETime" "gc0-elapsed-time" (mean gc0_elapsed_time) run_status time_ok
+gc1count_spec  = SpecP "GC(1) Count" "GC1Count" "gc1-count" (meanInt gc1_count) run_status always_ok
 gc1time_spec  = SpecP "GC(1) Time" "GC1Time" "gc1-time" (mean gc1_time) run_status time_ok
 gc1elap_spec  = SpecP "GC(1) Elapsed Time" "GC1ETime" "gc1-elapsed-time" (mean gc1_elapsed_time) run_status time_ok
 balance_spec  = SpecP "GC work balance" "Balance" "balance" (mean balance) run_status time_ok
@@ -147,8 +149,10 @@ all_specs = [
   mutetime_spec,
   gctime_spec,
   gcelap_spec,
+  gc0count_spec,
   gc0time_spec,
   gc0elap_spec,
+  gc1count_spec,
   gc1time_spec,
   gc1elap_spec,
   balance_spec,
index dbadb0f..9c4e12a 100644 (file)
@@ -42,8 +42,10 @@ data Results = Results {
         gc_work         :: Maybe Integer,
         gc_time         :: [Float],
         gc_elapsed_time :: [Float],
+        gc0_count        :: [Int],
         gc0_time         :: [Float],
         gc0_elapsed_time :: [Float],
+        gc1_count        :: [Int],
         gc1_time         :: [Float],
         gc1_elapsed_time :: [Float],
         balance         :: [Float],
@@ -69,8 +71,10 @@ emptyResults = Results {
         cache_misses    = Nothing,
         gc_time         = [],
         gc_elapsed_time = [],
+        gc0_count        = [],
         gc0_time         = [],
         gc0_elapsed_time = [],
+        gc1_count        = [],
         gc1_time         = [],
         gc1_elapsed_time = [],
         balance         = [],
@@ -140,6 +144,7 @@ ghc1_re = pre GHC 4.02
 ghc2_re = GHC 4.02 (includes "xxM in use")
 ghc3_re = GHC 4.03 (includes "xxxx bytes GC work")
 ghc5_re = GHC 6.9 (includes GC(0) and GC(1) times)
+ghc6_re = GHC 7.2 (includes GC counts)
 -}
 
 ghc1_re :: String -> Maybe (Integer, Integer, Integer, Integer, Integer, Integer, Float, Float, Float, Float, Float, Float)
@@ -182,6 +187,14 @@ ghc5_re s = case matchRegex re s of
                 Nothing -> Nothing
     where re = mkRegex "^<<ghc:[ \t]+([0-9]+)[ \t]+bytes,[ \t]*([0-9]+)[ \t]+GCs,[ \t]*([0-9]+)/([0-9]+)[ \t]+avg/max bytes residency \\(([0-9]+) samples\\), ([0-9]+) bytes GC work, ([0-9]+)M in use, ([0-9.]+) INIT \\(([0-9.]+) elapsed\\), ([0-9.]+) MUT \\(([0-9.]+) elapsed\\), ([0-9.]+) GC \\(([0-9.]+) elapsed\\), ([0-9.]+) GC\\(0\\) \\(([0-9.]+) elapsed\\), ([0-9.]+) GC\\(1\\) \\(([0-9.]+) elapsed\\), ([0-9.]+) balance :ghc>>"
 
+ghc6_re :: String -> Maybe (Integer, Integer, Integer, Integer, Integer, Integer, Integer, Float, Float, Float, Float, Float, Float,Int,Float,Float,Int,Float,Float,Float)
+ghc6_re s = case matchRegex re s of
+                Just [allocations, gcs, gc0_count, gc1_count, avg_residency, max_residency, samples, gc_work', in_use, initialisation, initialisation_elapsed, mut, mut_elapsed, gc, gc_elapsed, gc0, gc0_elapsed, gc1, gc1_elapsed, bal] ->
+                    Just (read allocations, read gcs, read avg_residency, read max_residency, read samples, read gc_work', 1048576 * read in_use, read initialisation, read initialisation_elapsed, read mut, read mut_elapsed, read gc, read gc_elapsed, read gc0_count, read gc0, read gc0_elapsed, read gc1_count, read gc1, read gc1_elapsed, read bal)
+                Just _ -> error "ghc3_re: Can't happen"
+                Nothing -> Nothing
+    where re = mkRegex "^<<ghc:[ \t]+([0-9]+)[ \t]+bytes,[ \t]*([0-9]+)[ \t]+GCs\\(([0-9]+)[ \t]*\\+[ \t]*([0-9]+)\\),[ \t]*([0-9]+)/([0-9]+)[ \t]+avg/max bytes residency \\(([0-9]+) samples\\), ([0-9]+) bytes GC work, ([0-9]+)M in use, ([0-9.]+) INIT \\(([0-9.]+) elapsed\\), ([0-9.]+) MUT \\(([0-9.]+) elapsed\\), ([0-9.]+) GC \\(([0-9.]+) elapsed\\), ([0-9.]+) GC\\(0\\) \\(([0-9.]+) elapsed\\), ([0-9.]+) GC\\(1\\) \\(([0-9.]+) elapsed\\), ([0-9.]+) balance :ghc>>"
+
 wrong_exit_status, wrong_output, out_of_heap, out_of_stack :: Regex
 wrong_exit_status = mkRegex "^\\**[ \t]*expected exit status ([0-9]+) not seen ; got ([0-9]+)"
 wrong_output      = mkRegex "^expected (stdout|stderr) not matched by reality$"
@@ -211,8 +224,8 @@ combine2Results
                       instrs = is1, mem_reads = mr1, mem_writes = mw1,
                       cache_misses = cm1,
                       gc_time = gt1, gc_elapsed_time = ge1, gc_work = gw1,
-                      gc0_time = g0t1, gc0_elapsed_time = g0e1, 
-                      gc1_time = g1t1, gc1_elapsed_time = g1e1, 
+                      gc0_count = g0c1, gc0_time = g0t1, gc0_elapsed_time = g0e1,
+                      gc1_count = g1c1, gc1_time = g1t1, gc1_elapsed_time = g1e1,
                       balance = b1,
                       binary_size = bs1, allocs = al1,
                       run_status = rs1, compile_status = cs1,
@@ -224,8 +237,8 @@ combine2Results
                       instrs = is2, mem_reads = mr2, mem_writes = mw2,
                       cache_misses = cm2,
                       gc_time = gt2, gc_elapsed_time = ge2, gc_work = gw2,
-                      gc0_time = g0t2, gc0_elapsed_time = g0e2, 
-                      gc1_time = g1t2, gc1_elapsed_time = g1e2, 
+                      gc0_count = g0c2, gc0_time = g0t2, gc0_elapsed_time = g0e2,
+                      gc1_count = g1c2, gc1_time = g1t2, gc1_elapsed_time = g1e2,
                       balance = b2,
                       binary_size = bs2, allocs = al2,
                       run_status = rs2, compile_status = cs2,
@@ -243,8 +256,10 @@ combine2Results
                       cache_misses   = cm1 `mplus` cm2,
                       gc_time        = gt1 ++ gt2,
                       gc_elapsed_time= ge1 ++ ge2,
+                      gc0_count       = g0c1 ++ g0c2,
                       gc0_time        = g0t1 ++ g0t2,
                       gc0_elapsed_time= g0e1 ++ g0e2,
+                      gc1_count       = g1c1 ++ g1c2,
                       gc1_time        = g1t1 ++ g1t2,
                       gc1_elapsed_time= g1e1 ++ g1e2,
                       balance        = b1 ++ b2,
@@ -356,27 +371,27 @@ parse_run_time prog [] res ex = [(prog, res{run_status=ex})]
 parse_run_time prog (l:ls) res ex =
         case ghc1_re l of {
            Just (allocations, _, _, _, _, _, initialisation, init_elapsed, mut, mut_elapsed, gc, gc_elapsed) ->
-                got_run_result allocations initialisation init_elapsed mut mut_elapsed gc gc_elapsed [] [] [] [] []
+                got_run_result allocations initialisation init_elapsed mut mut_elapsed gc gc_elapsed [] [] [] [] [] [] []
                         Nothing Nothing Nothing Nothing Nothing [];
            Nothing ->
 
         case ghc2_re l of {
            Just (allocations, _, _, _, _, in_use, initialisation, init_elapsed, mut, mut_elapsed, gc, gc_elapsed) ->
-                got_run_result allocations initialisation init_elapsed mut mut_elapsed gc gc_elapsed [] [] [] [] []
+                got_run_result allocations initialisation init_elapsed mut mut_elapsed gc gc_elapsed [] [] [] [] [] [] []
                         Nothing Nothing Nothing Nothing Nothing [in_use];
 
             Nothing ->
 
         case ghc3_re l of {
            Just (allocations, _, _, _, _, gc_work', in_use, initialisation, init_elapsed, mut, mut_elapsed, gc, gc_elapsed) ->
-                got_run_result allocations initialisation init_elapsed mut mut_elapsed gc gc_elapsed [] [] [] [] []
+                got_run_result allocations initialisation init_elapsed mut mut_elapsed gc gc_elapsed [] [] [] [] [] [] []
                         (Just gc_work') Nothing Nothing Nothing Nothing [in_use];
 
             Nothing ->
 
         case ghc4_re l of {
            Just (allocations, _, _, _, _, gc_work', in_use, initialisation, init_elapsed, mut, mut_elapsed, gc, gc_elapsed, is, mem_rs, mem_ws, cache_misses') ->
-                got_run_result allocations initialisation init_elapsed mut mut_elapsed gc gc_elapsed [] [] [] [] []
+                got_run_result allocations initialisation init_elapsed mut mut_elapsed gc gc_elapsed [] [] [] [] [] [] []
                         (Just gc_work') (Just is) (Just mem_rs)
                         (Just mem_ws) (Just cache_misses') [in_use];
 
@@ -385,7 +400,15 @@ parse_run_time prog (l:ls) res ex =
         case ghc5_re l of {
            Just (allocations, _, _, _, _, gc_work', in_use, initialisation, init_elapsed, mut, mut_elapsed, gc, gc_elapsed, gc0, gc0_elapsed, gc1, gc1_elapsed, bal) ->
                 got_run_result allocations initialisation init_elapsed mut mut_elapsed gc gc_elapsed
-                        [gc0] [gc0_elapsed] [gc1] [gc1_elapsed] [bal]
+                        [] [gc0] [gc0_elapsed] [] [gc1] [gc1_elapsed] [bal]
+                        (Just gc_work') Nothing Nothing Nothing Nothing [in_use];
+
+            Nothing ->
+
+        case ghc6_re l of {
+           Just (allocations, _, _, _, _, gc_work', in_use, initialisation, init_elapsed, mut, mut_elapsed, gc, gc_elapsed, gc0_count, gc0, gc0_elapsed, gc1_count, gc1, gc1_elapsed, bal) ->
+                got_run_result allocations initialisation init_elapsed mut mut_elapsed gc gc_elapsed
+                        [gc0_count] [gc0] [gc0_elapsed] [gc1_count] [gc1] [gc1_elapsed] [bal]
                         (Just gc_work') Nothing Nothing Nothing Nothing [in_use];
 
             Nothing ->
@@ -415,9 +438,9 @@ parse_run_time prog (l:ls) res ex =
             Nothing ->
                 parse_run_time prog ls res ex;
 
-        }}}}}}}}}
+        }}}}}}}}}}
   where
-  got_run_result allocations initialisation init_elapsed mut mut_elapsed gc gc_elapsed gc0 gc0_elapsed gc1 gc1_elapsed bal gc_work' instrs' mem_rs mem_ws cache_misses' in_use
+  got_run_result allocations initialisation init_elapsed mut mut_elapsed gc gc_elapsed gc0_count gc0 gc0_elapsed gc1_count gc1 gc1_elapsed bal gc_work' instrs' mem_rs mem_ws cache_misses' in_use
       = -- trace ("got_run_result: " ++ initialisation ++ ", " ++ mut ++ ", " ++ gc) $
         let
           time = initialisation + mut + gc
@@ -429,8 +452,10 @@ parse_run_time prog (l:ls) res ex =
                                         mut_elapsed_time   = [mut_elapsed],
                                         gc_time    = [gc],
                                         gc_elapsed_time = [gc_elapsed],
+                                        gc0_count   = gc0_count,
                                         gc0_time    = gc0,
                                         gc0_elapsed_time = gc0_elapsed,
+                                        gc1_count   = gc1_count,
                                         gc1_time    = gc1,
                                         gc1_elapsed_time = gc1_elapsed,
                                         balance    = bal,