OLD | NEW |
---|---|
1 # Copyright 2013 The Chromium Authors. All rights reserved. | 1 # Copyright 2013 The Chromium Authors. All rights reserved. |
2 # Use of this source code is governed by a BSD-style license that can be | 2 # Use of this source code is governed by a BSD-style license that can be |
3 # found in the LICENSE file. | 3 # found in the LICENSE file. |
4 | 4 |
5 from metrics import v8_object_stats | |
5 from telemetry.page import page_measurement | 6 from telemetry.page import page_measurement |
6 | 7 |
7 import optparse | 8 import optparse |
8 import time | 9 import time |
9 | 10 |
11 _V8_BYTES_COMMITED = [ | |
12 'V8.MemoryNewSpaceBytesCommitted', | |
13 'V8.MemoryOldPointerSpaceBytesCommitted', | |
14 'V8.MemoryOldDataSpaceBytesCommitted', | |
15 'V8.MemoryCodeSpaceBytesCommitted', | |
16 'V8.MemoryMapSpaceBytesCommitted', | |
17 'V8.MemoryCellSpaceBytesCommitted', | |
18 'V8.MemoryPropertyCellSpaceBytesCommitted', | |
19 'V8.MemoryLoSpaceBytesCommitted' | |
20 ] | |
21 _V8_BYTES_USED = [ | |
22 'V8.MemoryNewSpaceBytesUsed', | |
23 'V8.MemoryOldPointerSpaceBytesUsed', | |
24 'V8.MemoryOldDataSpaceBytesUsed', | |
25 'V8.MemoryCodeSpaceBytesUsed', | |
26 'V8.MemoryMapSpaceBytesUsed', | |
27 'V8.MemoryCellSpaceBytesUsed', | |
28 'V8.MemoryPropertyCellSpaceBytesUsed', | |
29 'V8.MemoryLoSpaceBytesUsed' | |
30 ] | |
31 _V8_MEMORY_ALLOCATED = [ | |
32 'V8.OsMemoryAllocated' | |
33 ] | |
10 | 34 |
11 class Endure(page_measurement.PageMeasurement): | 35 class Endure(page_measurement.PageMeasurement): |
12 def __init__(self): | 36 def __init__(self): |
13 super(Endure, self).__init__('endure') | 37 super(Endure, self).__init__('endure') |
38 self._browser = None | |
14 self._test_start_time = None | 39 self._test_start_time = None |
40 self._v8_object_stats_metric = None | |
15 | 41 |
16 # Timestamp of the last memory retrieval. | 42 # Timestamp of the last memory retrieval. |
17 self._last_mem_dump = 0 | 43 self._last_mem_dump = 0 |
18 | 44 |
19 def AddCommandLineOptions(self, parser): | 45 def AddCommandLineOptions(self, parser): |
20 group = optparse.OptionGroup(parser, 'Endure options') | 46 group = optparse.OptionGroup(parser, 'Endure options') |
21 group.add_option('--perf-stats-interval', | 47 group.add_option('--perf-stats-interval', |
22 dest='perf_stats_interval', | 48 dest='perf_stats_interval', |
23 default=20, | 49 default=20, |
24 type='int', | 50 type='int', |
25 help='Time interval between perf dumps (secs)') | 51 help='Time interval between perf dumps (secs)') |
26 parser.add_option_group(group) | 52 parser.add_option_group(group) |
27 | 53 |
54 def DidStartBrowser(self, browser): | |
55 # Save the browser for memory_stats. | |
56 self._browser = browser | |
57 self._v8_object_stats_metric = v8_object_stats.V8ObjectStatsMetric() | |
58 | |
59 def CustomizeBrowserOptions(self, options): | |
60 # TODO(edmundyan): Remove --no-sandbox once v8_object_stats can run | |
61 # independetly | |
62 options.AppendExtraBrowserArg('--no-sandbox') | |
tonyg
2013/09/04 17:47:38
If the metric needs this, the metric should be res
edmundyan
2013/09/05 20:32:11
Done.
| |
63 v8_object_stats.V8ObjectStatsMetric.CustomizeBrowserOptions(options) | |
64 | |
28 def CanRunForPage(self, page): | 65 def CanRunForPage(self, page): |
29 return hasattr(page, 'endure') | 66 return hasattr(page, 'endure') |
30 | 67 |
31 def WillRunPageRepeats(self, page, tab): | 68 def WillRunPageRepeats(self, page, tab): |
32 """Reset the starting time for each new page.""" | 69 """Reset the starting time for each new page.""" |
33 self._test_start_time = time.time() | 70 self._test_start_time = time.time() |
34 | 71 |
35 def MeasurePage(self, page, tab, results): | 72 def MeasurePage(self, page, tab, results): |
36 """Dump perf information if we have gone past our interval time.""" | 73 """Dump perf information if we have gone past our interval time.""" |
37 now = time.time() | 74 now = time.time() |
38 if int(round(now - self._last_mem_dump)) > self.options.perf_stats_interval: | 75 if int(round(now - self._last_mem_dump)) > self.options.perf_stats_interval: |
39 self._last_mem_dump = now | 76 self._last_mem_dump = now |
40 self._GetPerformanceStats(tab, results, now) | 77 self._GetPerformanceStats(page, tab, results, now) |
41 | 78 |
42 def _GetPerformanceStats(self, tab, results, now): | 79 def _GetPerformanceStats(self, page, tab, results, now): |
43 """Record all memory information.""" | 80 """Record all memory information.""" |
44 elapsed_time = int(round(now - self._test_start_time)) | 81 elapsed_time = int(round(now - self._test_start_time)) |
45 | 82 |
83 # Grab all metrics at the beginning | |
84 _dom_stats = tab.dom_stats | |
tonyg
2013/09/04 17:47:38
No need to _ prefix local variables.
edmundyan
2013/09/05 20:32:11
Done.
| |
85 _memory_stats = self._browser.memory_stats | |
86 self._v8_object_stats_metric.Stop(page, tab) | |
87 _v8_info = self._v8_object_stats_metric._results | |
88 | |
89 | |
46 # DOM Nodes | 90 # DOM Nodes |
47 dom_node_count = tab.dom_stats['node_count'] | 91 dom_node_count = _dom_stats['node_count'] |
48 self._SaveToResults(results, 'TotalDOMNodeCount_X', | 92 self._SaveToResults(results, 'TotalDOMNodeCount_X', |
49 'seconds', elapsed_time) | 93 'seconds', elapsed_time) |
50 self._SaveToResults(results, 'TotalDOMNodeCount_Y', | 94 self._SaveToResults(results, 'TotalDOMNodeCount_Y', |
51 'nodes', dom_node_count) | 95 'nodes', dom_node_count) |
52 | 96 |
53 # Event Listeners | 97 # Event Listeners |
54 event_listener_count = tab.dom_stats['event_listener_count'] | 98 event_listener_count = _dom_stats['event_listener_count'] |
55 self._SaveToResults(results, 'EventListenerCount_X', | 99 self._SaveToResults(results, 'EventListenerCount_X', |
56 'seconds', elapsed_time) | 100 'seconds', elapsed_time) |
57 self._SaveToResults(results, 'EventListenerCount_Y', | 101 self._SaveToResults(results, 'EventListenerCount_Y', |
58 'listeners', event_listener_count) | 102 'listeners', event_listener_count) |
59 | 103 |
104 # Memory stats | |
105 browser_vm = _memory_stats['Browser'].get('VM', 0) / 1024.0 | |
106 self._SaveToResults(results, 'BrowserVirtualMemory_X', | |
107 'seconds', elapsed_time) | |
108 self._SaveToResults(results, 'BrowserVirtualMemory_Y', | |
109 'KB', browser_vm) | |
110 renderer_vm = _memory_stats['Renderer'].get('VM', 0) / 1024.0 | |
111 self._SaveToResults(results, 'RendererVirtualMemory_X', | |
112 'seconds', elapsed_time) | |
113 self._SaveToResults(results, 'RendererVirtualMemory_Y', | |
114 'KB', renderer_vm) | |
115 | |
116 # V8 stats | |
117 v8_bytes_commited = self._SumDictFromKeys(_v8_info, | |
118 _V8_BYTES_COMMITED) / 1024.0 | |
119 self._SaveToResults(results, 'V8BytesCommited_X', | |
120 'seconds', elapsed_time) | |
121 self._SaveToResults(results, 'V8BytesCommited_Y', | |
122 'KB', v8_bytes_commited) | |
123 | |
124 v8_bytes_used = self._SumDictFromKeys(_v8_info, | |
125 _V8_BYTES_USED) / 1024.0 | |
126 self._SaveToResults(results, 'V8BytesUsed_X', | |
127 'seconds', elapsed_time) | |
128 self._SaveToResults(results, 'V8BytesUsed_Y', | |
129 'KB', v8_bytes_used) | |
130 | |
131 v8_mem_allocated = self._SumDictFromKeys(_v8_info, | |
132 _V8_MEMORY_ALLOCATED) / 1024.0 | |
133 self._SaveToResults(results, 'V8MemoryAllocated_X', | |
134 'seconds', elapsed_time) | |
135 self._SaveToResults(results, 'V8MemoryAllocated_Y', | |
136 'KB', v8_mem_allocated) | |
137 | |
138 def _SumDictFromKeys(self, d, keys_list): | |
139 return sum([v for k, v in d.iteritems() if k in keys_list]) | |
Michael Achenbach
2013/09/05 11:57:23
How about:
[d[k] for k in keys_list]
or can there
edmundyan
2013/09/05 20:32:11
There won't be missing keys. If v8 can't find the
| |
140 | |
60 def _SaveToResults(self, results, trace_name, units, value, | 141 def _SaveToResults(self, results, trace_name, units, value, |
61 chart_name=None, data_type='default'): | 142 chart_name=None, data_type='default'): |
62 results.Add(trace_name, units, value, chart_name, data_type) | 143 results.Add(trace_name, units, value, chart_name, data_type) |
OLD | NEW |