OLD | NEW |
| (Empty) |
1 # Copyright 2014 The Chromium Authors. All rights reserved. | |
2 # Use of this source code is governed by a BSD-style license that can be | |
3 # found in the LICENSE file. | |
4 | |
5 import logging | |
6 | |
7 from telemetry.timeline import bounds | |
8 from telemetry.value import scalar | |
9 from telemetry.web_perf import timeline_interaction_record as tir_module | |
10 from telemetry.web_perf.metrics import timeline_based_metric | |
11 from telemetry.web_perf.metrics import v8_stats as v8_stats_module | |
12 | |
13 | |
14 class FastMetric(timeline_based_metric.TimelineBasedMetric): | |
15 def __init__(self): | |
16 super(FastMetric, self).__init__() | |
17 | |
18 def AddResults(self, model, renderer_thread, interaction_records, results): | |
19 """Add 11 results: duration, cpu_time, and idle_time, | |
20 incremental_marking, incremental_marking_outside_idle, | |
21 scavenger, scavenger_outside_idle, | |
22 mark_compactor, mark_compactor_outside_idle, | |
23 total_garbage_collection, | |
24 total_garbage_collection_outside_idle | |
25 | |
26 duration is the total wall time for |interaction_records|. | |
27 cpu_time is the renderer thread time that intersects |interaction_records|. | |
28 idle time is wall time for |interaction_records| for which renderer slices | |
29 do not overlap. Note that unscheduled renderer thread time is not | |
30 counted. Idle time is time for which there was nothing to do. | |
31 incremental_marking is the total thread duration spent in incremental | |
32 marking steps. | |
33 incremental_marking_outside_idle is the thread duration spent in incremental | |
34 marking steps outside of idle notifications. | |
35 scavenger is the total thread duration spent in scavenges. | |
36 scavenger_outside_idle is the thread duration spent in scavenges outside of | |
37 idle notifications. | |
38 mark_compactor is the total thread duration spent in mark-sweep-compactor. | |
39 mark_compactor_outside_idle is the thread duration spent in | |
40 mark-sweep-compactor outside of idle notifications. | |
41 total_garbage_collection is the total thread duration spend in garbage | |
42 collection | |
43 total_garbage_collection_outside_idle is the total thread duration spend in | |
44 garbage collection outside of idle notification. | |
45 | |
46 Args: | |
47 model: a TimelineModule instance | |
48 renderer_thread: a telemetry.timeline.thread.Thread() instance | |
49 interaction_records: an iterable of TimelineInteractionRecord instances | |
50 results: an instance of page.PageTestResults | |
51 """ | |
52 self.VerifyNonOverlappedRecords(interaction_records) | |
53 | |
54 duration = sum(r.end - r.start for r in interaction_records) | |
55 results.AddValue(scalar.ScalarValue( | |
56 results.current_page, 'fast-duration', 'ms', duration)) | |
57 | |
58 try: | |
59 cpu_time = sum( | |
60 r.GetOverlappedThreadTimeForSlice(s) | |
61 for r in interaction_records | |
62 for s in renderer_thread.toplevel_slices) | |
63 except tir_module.NoThreadTimeDataException: | |
64 logging.warning( | |
65 'Main thread cpu_time cannot be computed for records %s since ' | |
66 'trace does not contain thread time data.', | |
67 repr(interaction_records)) | |
68 else: | |
69 results.AddValue(scalar.ScalarValue( | |
70 results.current_page, 'fast-cpu_time', 'ms', cpu_time)) | |
71 | |
72 idle_time = duration - sum( | |
73 bounds.Bounds.GetOverlap(r.start, r.end, s.start, s.end) | |
74 for r in interaction_records | |
75 for s in renderer_thread.toplevel_slices) | |
76 results.AddValue(scalar.ScalarValue( | |
77 results.current_page, 'fast-idle_time', 'ms', idle_time)) | |
78 | |
79 v8_stats = v8_stats_module.V8Stats(renderer_thread, interaction_records) | |
80 | |
81 for event_stats in v8_stats.all_event_stats: | |
82 results.AddValue(scalar.ScalarValue( | |
83 results.current_page, 'fast-' + event_stats.result_name, 'ms', | |
84 event_stats.thread_duration, | |
85 event_stats.result_description)) | |
86 results.AddValue(scalar.ScalarValue( | |
87 results.current_page, | |
88 'fast-' + event_stats.result_name + '_outside_idle', 'ms', | |
89 event_stats.thread_duration_outside_idle, | |
90 event_stats.result_description + 'outside of idle notifications')) | |
91 | |
92 results.AddValue(scalar.ScalarValue( | |
93 results.current_page, 'fast-total_garbage_collection', 'ms', | |
94 v8_stats.total_gc_thread_duration, | |
95 'Total thread duration of all garbage collection events')) | |
96 | |
97 results.AddValue(scalar.ScalarValue( | |
98 results.current_page, 'fast-total_garbage_collection_outside_idle', | |
99 'ms', v8_stats.total_gc_thread_duration_outside_idle, | |
100 'Total thread duration of all garbage collection events outside of idle' | |
101 'notifications')) | |
OLD | NEW |