Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 # Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 # Copyright (c) 2012 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 import sys | |
| 5 | |
| 4 from telemetry.core import util | 6 from telemetry.core import util |
| 5 from telemetry.page import page_benchmark | 7 from telemetry.page import page_benchmark |
| 6 | 8 |
| 7 MEMORY_HISTOGRAMS = [ | 9 MEMORY_HISTOGRAMS = [ |
| 8 {'name': 'V8.MemoryExternalFragmentationTotal', 'units': 'percent'}, | 10 {'name': 'V8.MemoryExternalFragmentationTotal', 'units': 'percent'}, |
| 9 {'name': 'V8.MemoryHeapSampleTotalCommitted', 'units': 'kb'}, | 11 {'name': 'V8.MemoryHeapSampleTotalCommitted', 'units': 'kb'}, |
| 10 {'name': 'V8.MemoryHeapSampleTotalUsed', 'units': 'kb'}] | 12 {'name': 'V8.MemoryHeapSampleTotalUsed', 'units': 'kb'}] |
| 11 | 13 |
| 12 class PageCycler(page_benchmark.PageBenchmark): | 14 class PageCycler(page_benchmark.PageBenchmark): |
| 13 def CustomizeBrowserOptions(self, options): | 15 def CustomizeBrowserOptions(self, options): |
| 14 options.AppendExtraBrowserArg('--dom-automation') | 16 options.AppendExtraBrowserArg('--dom-automation') |
| 15 options.AppendExtraBrowserArg('--js-flags=--expose_gc') | 17 options.AppendExtraBrowserArg('--js-flags=--expose_gc') |
| 16 | 18 |
| 19 def MeasureMemory(self, tab, results): | |
| 20 memory = tab.browser.memory_stats | |
| 21 if not memory['Browser']: | |
| 22 return | |
| 23 | |
| 24 metric = 'rss' | |
| 25 if sys.platform == 'win32': | |
| 26 metric = 'ws' | |
| 27 | |
| 28 # Browser | |
| 29 if memory['Browser'].has_key('VM'): | |
|
dtu
2013/03/04 23:26:15
if 'VM' in memory['Browser']:
has_key is deprecate
| |
| 30 results.Add('vm_size_f_b', 'bytes', memory['Browser']['VM'], | |
| 31 chart_name='vm_size_final_b', data_type='unimportant') | |
| 32 if memory['Browser'].has_key('VMPeak'): | |
| 33 results.Add('vm_peak_b', 'bytes', memory['Browser']['VMPeak'], | |
| 34 chart_name='vm_pk_b', data_type='unimportant') | |
| 35 if memory['Browser'].has_key('WorkingSetSize'): | |
| 36 results.Add('vm_%s_f_b' % metric, 'bytes', | |
| 37 memory['Browser']['WorkingSetSize'], | |
| 38 chart_name='vm_%s_final_b' % metric, data_type='unimportant') | |
| 39 if memory['Browser'].has_key('WorkingSetSizePeak'): | |
| 40 results.Add('%s_peak_b' % metric, 'bytes', | |
| 41 memory['Browser']['WorkingSetSizePeak'], | |
| 42 chart_name='%s_pk_b' % metric, data_type='unimportant') | |
| 43 if memory['Browser'].has_key('PrivateDirty'): | |
| 44 results.Add('vm_private_dirty_f_b', 'bytes', | |
| 45 memory['Browser']['PrivateDirty'], | |
| 46 chart_name='vm_private_dirty_final_b', | |
| 47 data_type='unimportant') | |
| 48 if memory['Browser'].has_key('ProportionalSetSize'): | |
| 49 results.Add('vm_pss_f_b', 'bytes', | |
| 50 memory['Browser']['ProportionalSetSize'], | |
| 51 chart_name='vm_pss_final_b', data_type='unimportant') | |
| 52 | |
| 53 # Renderer | |
| 54 if memory['Renderer'].has_key('VM'): | |
| 55 results.Add('vm_size_f_r', 'bytes', memory['Renderer']['VM'], | |
| 56 chart_name='vm_size_final_r', data_type='unimportant') | |
| 57 if memory['Renderer'].has_key('VMPeak'): | |
| 58 results.Add('vm_peak_r', 'bytes', memory['Browser']['VMPeak'], | |
| 59 chart_name='vm_pk_r', data_type='unimportant') | |
| 60 if memory['Renderer'].has_key('WorkingSetSize'): | |
| 61 results.Add('vm_%s_f_r' % metric, 'bytes', | |
| 62 memory['Renderer']['WorkingSetSize'], | |
| 63 chart_name='vm_%s_final_r' % metric, data_type='unimportant') | |
| 64 if memory['Renderer'].has_key('WorkingSetSizePeak'): | |
| 65 results.Add('%s_peak_r' % metric, 'bytes', | |
| 66 memory['Browser']['WorkingSetSizePeak'], | |
| 67 chart_name='%s_pk_r' % metric, data_type='unimportant') | |
| 68 if memory['Renderer'].has_key('PrivateDirty'): | |
| 69 results.Add('vm_private_dirty_f_r', 'bytes', | |
| 70 memory['Renderer']['PrivateDirty'], | |
| 71 chart_name='vm_private_dirty_final_r', | |
| 72 data_type='unimportant') | |
| 73 if memory['Renderer'].has_key('ProportionalSetSize'): | |
| 74 results.Add('vm_pss_f_r', 'bytes', | |
| 75 memory['Renderer']['ProportionalSetSize'], | |
| 76 chart_name='vm_pss_final_r', data_type='unimportant') | |
| 77 | |
| 78 # Total | |
| 79 if (memory['Browser'].has_key('VM') and | |
| 80 memory['Renderer'].has_key('VM')): | |
| 81 results.Add('vm_size_f_t', 'bytes', | |
| 82 memory['Browser']['VM'] + memory['Renderer']['VM'], | |
| 83 chart_name='vm_size_final_t', data_type='unimportant') | |
| 84 if (memory['Browser'].has_key('WorkingSetSize') and | |
| 85 memory['Renderer'].has_key('WorkingSetSize')): | |
| 86 results.Add('vm_%s_f_t' % metric, 'bytes', | |
| 87 memory['Browser']['WorkingSetSize'] + | |
| 88 memory['Renderer']['WorkingSetSize'], | |
| 89 chart_name='vm_%s_final_t' % metric, data_type='unimportant') | |
| 90 if (memory['Browser'].has_key('PrivateDirty') and | |
| 91 memory['Renderer'].has_key('PrivateDirty')): | |
| 92 results.Add('vm_private_dirty_f_t', 'bytes', | |
| 93 memory['Browser']['PrivateDirty'] + | |
| 94 memory['Renderer']['PrivateDirty'], | |
| 95 chart_name='vm_private_dirty_final_t', | |
| 96 data_type='unimportant') | |
| 97 if (memory['Browser'].has_key('ProportionalSetSize') and | |
| 98 memory['Renderer'].has_key('ProportionalSetSize')): | |
| 99 results.Add('vm_pss_f_t', 'bytes', | |
| 100 memory['Browser']['ProportionalSetSize'] + | |
| 101 memory['Renderer']['ProportionalSetSize'], | |
| 102 chart_name='vm_pss_final_t', data_type='unimportant') | |
| 103 | |
| 104 results.Add('cc', 'kb', memory['SystemCommitCharge'], | |
| 105 chart_name='commit_charge', data_type='unimportant') | |
| 106 results.Add('proc_', 'count', memory['ProcessCount'], | |
| 107 chart_name='processes', data_type='unimportant') | |
| 108 | |
| 109 def MeasureIO(self, tab, results): | |
| 110 io_stats = tab.browser.io_stats | |
| 111 if not io_stats['Browser']: | |
| 112 return | |
| 113 results.Add('r_op_b', '', io_stats['Browser']['ReadOperationCount'], | |
| 114 chart_name='read_op_b', data_type='unimportant') | |
| 115 results.Add('w_op_b', '', io_stats['Browser']['WriteOperationCount'], | |
| 116 chart_name='write_op_b', data_type='unimportant') | |
| 117 results.Add('r_b', 'kb', io_stats['Browser']['ReadTransferCount'], | |
| 118 chart_name='read_byte_b', data_type='unimportant') | |
| 119 results.Add('w_b', 'kb', io_stats['Browser']['WriteTransferCount'], | |
| 120 chart_name='write_byte_b', data_type='unimportant') | |
| 121 results.Add('r_op_r', '', io_stats['Renderer']['ReadOperationCount'], | |
| 122 chart_name='read_op_r', data_type='unimportant') | |
| 123 results.Add('w_op_r', '', io_stats['Renderer']['WriteOperationCount'], | |
| 124 chart_name='write_op_r', data_type='unimportant') | |
| 125 results.Add('r_r', 'kb', io_stats['Renderer']['ReadOperationCount'], | |
| 126 chart_name='read_byte_r', data_type='unimportant') | |
| 127 results.Add('w_r', 'kb', io_stats['Renderer']['WriteOperationCount'], | |
| 128 chart_name='write_byte_r', data_type='unimportant') | |
| 129 | |
| 17 def MeasurePage(self, _, tab, results): | 130 def MeasurePage(self, _, tab, results): |
| 18 def _IsDone(): | 131 def _IsDone(): |
| 19 return tab.GetCookieByName('__pc_done') == '1' | 132 return tab.GetCookieByName('__pc_done') == '1' |
| 20 util.WaitFor(_IsDone, 1200, poll_interval=5) | 133 util.WaitFor(_IsDone, 1200, poll_interval=5) |
| 21 print 'Pages: [%s]' % tab.GetCookieByName('__pc_pages') | 134 print 'Pages: [%s]' % tab.GetCookieByName('__pc_pages') |
| 22 | 135 |
| 23 # TODO(tonyg): Get IO and memory statistics. | 136 self.MeasureMemory(tab, results) |
| 137 self.MeasureIO(tab, results) | |
| 24 | 138 |
| 25 for histogram in MEMORY_HISTOGRAMS: | 139 for histogram in MEMORY_HISTOGRAMS: |
| 26 name = histogram['name'] | 140 name = histogram['name'] |
| 27 data = tab.EvaluateJavaScript( | 141 data = tab.EvaluateJavaScript( |
| 28 'window.domAutomationController.getHistogram("%s")' % name) | 142 'window.domAutomationController.getHistogram("%s")' % name) |
| 29 results.Add(name, histogram['units'], data, data_type='histogram') | 143 results.Add(name, histogram['units'], data, data_type='histogram') |
| 30 | 144 |
| 31 def _IsNavigatedToReport(): | 145 def _IsNavigatedToReport(): |
| 32 return tab.GetCookieByName('__navigated_to_report') == '1' | 146 return tab.GetCookieByName('__navigated_to_report') == '1' |
| 33 util.WaitFor(_IsNavigatedToReport, 60, poll_interval=5) | 147 util.WaitFor(_IsNavigatedToReport, 60, poll_interval=5) |
| 34 timings = tab.EvaluateJavaScript('__get_timings()').split(',') | 148 timings = tab.EvaluateJavaScript('__get_timings()').split(',') |
| 35 results.Add('t', 'ms', [int(t) for t in timings], chart_name='times') | 149 results.Add('t', 'ms', [int(t) for t in timings], chart_name='times') |
| 36 | 150 |
| 37 # TODO(tonyg): Add version that runs with extension profile. | 151 # TODO(tonyg): Add version that runs with extension profile. |
| OLD | NEW |