summaryrefslogtreecommitdiffstats
path: root/unit_trace/gedf_inversion_stat_printer.py
diff options
context:
space:
mode:
Diffstat (limited to 'unit_trace/gedf_inversion_stat_printer.py')
-rw-r--r--unit_trace/gedf_inversion_stat_printer.py83
1 files changed, 83 insertions, 0 deletions
diff --git a/unit_trace/gedf_inversion_stat_printer.py b/unit_trace/gedf_inversion_stat_printer.py
new file mode 100644
index 0000000..c314389
--- /dev/null
+++ b/unit_trace/gedf_inversion_stat_printer.py
@@ -0,0 +1,83 @@
1###############################################################################
2# Description
3###############################################################################
4# Compute and print G-EDF inversion statistics
5
6
7###############################################################################
8# Public Functions
9###############################################################################
10
11def gedf_inversion_stat_printer(stream,num):
12
13 # State
14 min_inversion = -1
15 max_inversion = -1
16 sum_inversions = 0
17 num_inversions = 0
18 longest_inversions = []
19
20 # Iterate over records, updating state
21 for record in stream:
22 if record.type_name == 'inversion_end':
23 length = record.job.inversion_end - record.job.inversion_start
24 if length > 0:
25 num_inversions += 1
26 if length > max_inversion:
27 max_inversion = length
28 if length < min_inversion or min_inversion == -1:
29 min_inversion = 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
44 # We've seen all records.
45 # Further update state
46 if num_inversions > 0:
47 avg_inversion = int(sum_inversions / num_inversions)
48 else:
49 avg_inversion = 0
50
51 # Print out our information
52 print "Num inversions: %d" % (num_inversions)
53 print "Min inversion: %d" % (min_inversion)
54 print "Max inversion: %d" % (max_inversion)
55 print "Avg inversion: %d" % (avg_inversion)
56 for inv in longest_inversions:
57 print ""
58 print "Inversion record IDs: (%d, %d)" % (inv.inversion_start_id,
59 inv.id)
60 print("Triggering Event IDs: (%d, %d)" %
61 (inv.inversion_start_triggering_event_id,
62 inv.triggering_event_id))
63 print "Time: %d" % (inv.job.inversion_end)
64 print "Duration: %d" % (
65 inv.job.inversion_end - inv.job.inversion_start)
66 print "Job: %d.%d" % (inv.job.pid,inv.job.job)
67 print "Deadline: %d" % (inv.job.deadline)
68 print "Eligible: ",
69 for job in inv.eligible:
70 print str(job) + " ",
71 print
72 print "On CPU: ",
73 for job in inv.on_cpu:
74 print str(job) + " ",
75 print ""
76
77
78def _sort_longest_inversions(longest_inversions):
79 """ Sort longest inversions"""
80 def sortkey(x):
81 return x.job.inversion_end - x.job.inversion_start
82 longest_inversions.sort(key=sortkey)
83 return longest_inversions