summaryrefslogtreecommitdiffstats
path: root/unit_trace
diff options
context:
space:
mode:
authorMac Mollison <mollison@cs.unc.edu>2010-03-26 16:17:42 -0400
committerMac Mollison <mollison@cs.unc.edu>2010-03-26 16:17:42 -0400
commit13b237b07c09942b6229c23a81f200b2565475ca (patch)
tree39a593b0c1fc6ce41fb23e7c60684e23f325eb7d /unit_trace
parentd486ddadacd9e9308e64c251388ff262d4b2d198 (diff)
Improve stats.py to show longest n inversions
Diffstat (limited to 'unit_trace')
-rw-r--r--unit_trace/stats.py34
-rw-r--r--unit_trace/stdout_printer.py3
2 files changed, 36 insertions, 1 deletions
diff --git a/unit_trace/stats.py b/unit_trace/stats.py
index 17c5fc9..4462ef1 100644
--- a/unit_trace/stats.py
+++ b/unit_trace/stats.py
@@ -8,11 +8,16 @@
8# Public Functions 8# Public Functions
9############################################################################### 9###############################################################################
10 10
11def stats(stream): 11def stats(stream,num):
12
13 # State
12 min_inversion = -1 14 min_inversion = -1
13 max_inversion = -1 15 max_inversion = -1
14 sum_inversions = 0 16 sum_inversions = 0
15 num_inversions = 0 17 num_inversions = 0
18 longest_inversions = []
19
20 # Iterate over records, updating state
16 for record in stream: 21 for record in stream:
17 if record.type_name == 'inversion_end': 22 if record.type_name == 'inversion_end':
18 length = record.job.inversion_end - record.job.inversion_start 23 length = record.job.inversion_end - record.job.inversion_start
@@ -23,11 +28,29 @@ def stats(stream):
23 if length < min_inversion or min_inversion == -1: 28 if length < min_inversion or min_inversion == -1:
24 min_inversion = length 29 min_inversion = length
25 sum_inversions += length 30 sum_inversions += length
31 if len(longest_inversions) == num:
32 si = longest_inversions[0]
33 if length > (si.job.inversion_end -
34 si.job.inversion_start):
35 longest_inversions.append(record)
36 longest_inversions = _sort_longest_inversions(
37 longest_inversions)
38 del longest_inversions[0]
39 else:
40 longest_inversions.append(record)
41 longest_inversions = _sort_longest_inversions(
42 longest_inversions)
43
26 yield record 44 yield record
45
46 # We've seen all records.
47 # Further update state
27 if num_inversions > 0: 48 if num_inversions > 0:
28 avg_inversion = int(sum_inversions / num_inversions) 49 avg_inversion = int(sum_inversions / num_inversions)
29 else: 50 else:
30 avg_inversion = 0 51 avg_inversion = 0
52
53 # Produce a meta type record with all our information.
31 class Obj(object): pass 54 class Obj(object): pass
32 rec = Obj() 55 rec = Obj()
33 rec.record_type = "meta" 56 rec.record_type = "meta"
@@ -36,4 +59,13 @@ def stats(stream):
36 rec.min_inversion = min_inversion 59 rec.min_inversion = min_inversion
37 rec.max_inversion = max_inversion 60 rec.max_inversion = max_inversion
38 rec.avg_inversion = avg_inversion 61 rec.avg_inversion = avg_inversion
62 longest_inversions = _sort_longest_inversions(longest_inversions)
63 rec.longest_inversions = longest_inversions
39 yield rec 64 yield rec
65
66def _sort_longest_inversions(longest_inversions):
67 """ Sort longest inversions"""
68 def sortkey(x):
69 return x.job.inversion_end - x.job.inversion_start
70 longest_inversions.sort(key=sortkey)
71 return longest_inversions
diff --git a/unit_trace/stdout_printer.py b/unit_trace/stdout_printer.py
index a56acce..dd1e2bd 100644
--- a/unit_trace/stdout_printer.py
+++ b/unit_trace/stdout_printer.py
@@ -75,3 +75,6 @@ def _print_stats(record):
75 print "Min inversion: %d" % (record.min_inversion) 75 print "Min inversion: %d" % (record.min_inversion)
76 print "Max inversion: %d" % (record.max_inversion) 76 print "Max inversion: %d" % (record.max_inversion)
77 print "Avg inversion: %d" % (record.avg_inversion) 77 print "Avg inversion: %d" % (record.avg_inversion)
78 for inv in record.longest_inversions:
79 print ""
80 _print_inversion_end(inv)