Chromium Code Reviews| 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 |