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 |
15 | 40 |
16 # Timestamp of the last memory retrieval. | 41 # Timestamp of the last memory retrieval. |
17 self._last_mem_dump = 0 | 42 self._last_mem_dump = 0 |
18 | 43 |
19 def AddCommandLineOptions(self, parser): | 44 def AddCommandLineOptions(self, parser): |
20 group = optparse.OptionGroup(parser, 'Endure options') | 45 group = optparse.OptionGroup(parser, 'Endure options') |
21 group.add_option('--perf-stats-interval', | 46 group.add_option('--perf-stats-interval', |
22 dest='perf_stats_interval', | 47 dest='perf_stats_interval', |
23 default=20, | 48 default=20, |
24 type='int', | 49 type='int', |
25 help='Time interval between perf dumps (secs)') | 50 help='Time interval between perf dumps (secs)') |
26 parser.add_option_group(group) | 51 parser.add_option_group(group) |
27 | 52 |
| 53 def DidStartBrowser(self, browser): |
| 54 # Save the browser for memory_stats. |
| 55 self._browser = browser |
| 56 |
| 57 def CustomizeBrowserOptions(self, options): |
| 58 v8_object_stats.V8ObjectStatsMetric.CustomizeBrowserOptions(options) |
| 59 |
28 def CanRunForPage(self, page): | 60 def CanRunForPage(self, page): |
29 return hasattr(page, 'endure') | 61 return hasattr(page, 'endure') |
30 | 62 |
31 def WillRunPageRepeats(self, page, tab): | 63 def WillRunPageRepeats(self, page, tab): |
32 """Reset the starting time for each new page.""" | 64 """Reset the starting time for each new page.""" |
33 self._test_start_time = time.time() | 65 self._test_start_time = time.time() |
34 | 66 |
35 def MeasurePage(self, page, tab, results): | 67 def MeasurePage(self, page, tab, results): |
36 """Dump perf information if we have gone past our interval time.""" | 68 """Dump perf information if we have gone past our interval time.""" |
37 now = time.time() | 69 now = time.time() |
38 if int(round(now - self._last_mem_dump)) > self.options.perf_stats_interval: | 70 if int(round(now - self._last_mem_dump)) > self.options.perf_stats_interval: |
39 self._last_mem_dump = now | 71 self._last_mem_dump = now |
40 self._GetPerformanceStats(tab, results, now) | 72 self._GetPerformanceStats(tab, results, now) |
41 | 73 |
42 def _GetPerformanceStats(self, tab, results, now): | 74 def _GetPerformanceStats(self, tab, results, now): |
43 """Record all memory information.""" | 75 """Record all memory information.""" |
44 elapsed_time = int(round(now - self._test_start_time)) | 76 elapsed_time = int(round(now - self._test_start_time)) |
45 | 77 |
46 # DOM Nodes | 78 # DOM Nodes |
47 dom_node_count = tab.dom_stats['node_count'] | 79 dom_stats = tab.dom_stats |
| 80 dom_node_count = dom_stats['node_count'] |
48 self._SaveToResults(results, 'TotalDOMNodeCount_X', | 81 self._SaveToResults(results, 'TotalDOMNodeCount_X', |
49 'seconds', elapsed_time) | 82 'seconds', elapsed_time) |
50 self._SaveToResults(results, 'TotalDOMNodeCount_Y', | 83 self._SaveToResults(results, 'TotalDOMNodeCount_Y', |
51 'nodes', dom_node_count) | 84 'nodes', dom_node_count) |
52 | 85 |
53 # Event Listeners | 86 # Event Listeners |
54 event_listener_count = tab.dom_stats['event_listener_count'] | 87 event_listener_count = dom_stats['event_listener_count'] |
55 self._SaveToResults(results, 'EventListenerCount_X', | 88 self._SaveToResults(results, 'EventListenerCount_X', |
56 'seconds', elapsed_time) | 89 'seconds', elapsed_time) |
57 self._SaveToResults(results, 'EventListenerCount_Y', | 90 self._SaveToResults(results, 'EventListenerCount_Y', |
58 'listeners', event_listener_count) | 91 'listeners', event_listener_count) |
59 | 92 |
| 93 # Memory stats |
| 94 memory_stats = self._browser.memory_stats |
| 95 browser_vm = memory_stats['Browser'].get('VM', 0) / 1024.0 |
| 96 self._SaveToResults(results, 'BrowserVirtualMemory_X', |
| 97 'seconds', elapsed_time) |
| 98 self._SaveToResults(results, 'BrowserVirtualMemory_Y', |
| 99 'KB', browser_vm) |
| 100 renderer_vm = memory_stats['Renderer'].get('VM', 0) / 1024.0 |
| 101 self._SaveToResults(results, 'RendererVirtualMemory_X', |
| 102 'seconds', elapsed_time) |
| 103 self._SaveToResults(results, 'RendererVirtualMemory_Y', |
| 104 'KB', renderer_vm) |
| 105 |
| 106 # V8 stats |
| 107 v8_bytes_commited = v8_object_stats.V8ObjectStatsMetric.GetV8StatsTable( |
| 108 tab, _V8_BYTES_COMMITED) |
| 109 v8_bytes_commited = sum(v8_bytes_commited.values()) / 1024.0 |
| 110 self._SaveToResults(results, 'V8BytesCommited_X', |
| 111 'seconds', elapsed_time) |
| 112 self._SaveToResults(results, 'V8BytesCommited_Y', |
| 113 'KB', v8_bytes_commited) |
| 114 |
| 115 v8_bytes_used = v8_object_stats.V8ObjectStatsMetric.GetV8StatsTable( |
| 116 tab, _V8_BYTES_USED) |
| 117 print v8_bytes_used |
| 118 v8_bytes_used = sum(v8_bytes_used.values()) / 1024.0 |
| 119 self._SaveToResults(results, 'V8BytesUsed_X', |
| 120 'seconds', elapsed_time) |
| 121 self._SaveToResults(results, 'V8BytesUsed_Y', |
| 122 'KB', v8_bytes_used) |
| 123 |
| 124 v8_mem_allocated = v8_object_stats.V8ObjectStatsMetric.GetV8StatsTable( |
| 125 tab, _V8_MEMORY_ALLOCATED) |
| 126 v8_mem_allocated = sum(v8_mem_allocated.values()) / 1024.0 |
| 127 self._SaveToResults(results, 'V8MemoryAllocated_X', |
| 128 'seconds', elapsed_time) |
| 129 self._SaveToResults(results, 'V8MemoryAllocated_Y', |
| 130 'KB', v8_mem_allocated) |
| 131 |
60 def _SaveToResults(self, results, trace_name, units, value, | 132 def _SaveToResults(self, results, trace_name, units, value, |
61 chart_name=None, data_type='default'): | 133 chart_name=None, data_type='default'): |
62 results.Add(trace_name, units, value, chart_name, data_type) | 134 results.Add(trace_name, units, value, chart_name, data_type) |
OLD | NEW |