|
|
|
@ -43,6 +43,7 @@ TIME_FROM_SCOPE_START = object() |
|
|
|
|
TIME_TO_SCOPE_END = object() |
|
|
|
|
TIME_FROM_STACK_START = object() |
|
|
|
|
TIME_TO_STACK_END = object() |
|
|
|
|
TIME_FROM_LAST_IMPORTANT = object() |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
argp = argparse.ArgumentParser(description='Process output of basic_prof builds') |
|
|
|
@ -78,10 +79,14 @@ class ScopeBuilder(object): |
|
|
|
|
self.call_stack_builder.lines.append(line_item) |
|
|
|
|
|
|
|
|
|
def finish(self, line): |
|
|
|
|
assert line['tag'] == self.top_line.tag, 'expected %s, got %s; thread=%s; t0=%f t1=%f' % (self.top_line.tag, line['tag'], line['thd'], self.top_line.start_time, line['t']) |
|
|
|
|
assert line['tag'] == self.top_line.tag, ( |
|
|
|
|
'expected %s, got %s; thread=%s; t0=%f t1=%f' % |
|
|
|
|
(self.top_line.tag, line['tag'], line['thd'], self.top_line.start_time, |
|
|
|
|
line['t'])) |
|
|
|
|
final_time_stamp = line['t'] |
|
|
|
|
assert self.top_line.end_time is None |
|
|
|
|
self.top_line.end_time = final_time_stamp |
|
|
|
|
self.top_line.important = self.top_line.important or line['imp'] |
|
|
|
|
assert SELF_TIME not in self.top_line.times |
|
|
|
|
self.top_line.times[SELF_TIME] = final_time_stamp - self.top_line.start_time |
|
|
|
|
for line in self.call_stack_builder.lines[self.first_child_pos:]: |
|
|
|
@ -101,9 +106,14 @@ class CallStackBuilder(object): |
|
|
|
|
start_time = self.lines[0].start_time |
|
|
|
|
end_time = self.lines[0].end_time |
|
|
|
|
self.signature = self.signature.hexdigest() |
|
|
|
|
last_important = start_time |
|
|
|
|
for line in self.lines: |
|
|
|
|
line.times[TIME_FROM_STACK_START] = line.start_time - start_time |
|
|
|
|
line.times[TIME_TO_STACK_END] = end_time - line.end_time |
|
|
|
|
line.times[TIME_FROM_LAST_IMPORTANT] = line.start_time - last_important |
|
|
|
|
if line.important: |
|
|
|
|
last_important = line.end_time |
|
|
|
|
last_important = end_time |
|
|
|
|
|
|
|
|
|
def add(self, line): |
|
|
|
|
line_type = line['type'] |
|
|
|
@ -113,7 +123,9 @@ class CallStackBuilder(object): |
|
|
|
|
self.stk.append(ScopeBuilder(self, line)) |
|
|
|
|
return False |
|
|
|
|
elif line_type == '}': |
|
|
|
|
assert self.stk, 'expected non-empty stack for closing %s; thread=%s; t=%f' % (line['tag'], line['thd'], line['t']) |
|
|
|
|
assert self.stk, ( |
|
|
|
|
'expected non-empty stack for closing %s; thread=%s; t=%f' % |
|
|
|
|
(line['tag'], line['thd'], line['t'])) |
|
|
|
|
self.stk.pop().finish(line) |
|
|
|
|
if not self.stk: |
|
|
|
|
self.finish() |
|
|
|
@ -216,9 +228,16 @@ def time_format(idx): |
|
|
|
|
return '' |
|
|
|
|
return ent |
|
|
|
|
|
|
|
|
|
BANNER = { |
|
|
|
|
'simple': 'Count: %(count)d', |
|
|
|
|
'html': '<h1>Count: %(count)d</h1>' |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
FORMAT = [ |
|
|
|
|
('TAG', lambda line: '..'*line.indent + tidy_tag(line.tag)), |
|
|
|
|
('LOC', lambda line: '%s:%d' % (line.filename[line.filename.rfind('/')+1:], line.fileline)), |
|
|
|
|
('IMP', lambda line: '*' if line.important else ''), |
|
|
|
|
('FROM_IMP', time_format(TIME_FROM_LAST_IMPORTANT)), |
|
|
|
|
('FROM_STACK_START', time_format(TIME_FROM_STACK_START)), |
|
|
|
|
('SELF', time_format(SELF_TIME)), |
|
|
|
|
('TO_STACK_END', time_format(TIME_TO_STACK_END)), |
|
|
|
@ -227,11 +246,6 @@ FORMAT = [ |
|
|
|
|
('TO_SCOPE_END', time_format(TIME_TO_SCOPE_END)), |
|
|
|
|
] |
|
|
|
|
|
|
|
|
|
BANNER = { |
|
|
|
|
'simple': 'Count: %(count)d', |
|
|
|
|
'html': '<h1>Count: %(count)d</h1>' |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if args.fmt == 'html': |
|
|
|
|
print '<html>' |
|
|
|
|
print '<head>' |
|
|
|
|