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') |
| 18 options.AppendExtraBrowserArg('--no-sandbox') |
| 19 |
| 20 def MeasureMemory(self, tab, results): |
| 21 memory = tab.browser.memory_stats |
| 22 if not memory['Browser']: |
| 23 return |
| 24 |
| 25 metric = 'rss' |
| 26 if sys.platform == 'win32': |
| 27 metric = 'ws' |
| 28 |
| 29 # Browser |
| 30 if 'VM' in memory['Browser']: |
| 31 results.Add('vm_size_f_b', 'bytes', memory['Browser']['VM'], |
| 32 chart_name='vm_size_final_b', data_type='unimportant') |
| 33 if 'VMPeak' in memory['Browser']: |
| 34 results.Add('vm_peak_b', 'bytes', memory['Browser']['VMPeak'], |
| 35 chart_name='vm_pk_b', data_type='unimportant') |
| 36 if 'WorkingSetSize' in memory['Browser']: |
| 37 results.Add('vm_%s_f_b' % metric, 'bytes', |
| 38 memory['Browser']['WorkingSetSize'], |
| 39 chart_name='vm_%s_final_b' % metric, data_type='unimportant') |
| 40 if 'WorkingSetSizePeak' in memory['Browser']: |
| 41 results.Add('%s_peak_b' % metric, 'bytes', |
| 42 memory['Browser']['WorkingSetSizePeak'], |
| 43 chart_name='%s_pk_b' % metric, data_type='unimportant') |
| 44 if 'PrivateDirty' in memory['Browser']: |
| 45 results.Add('vm_private_dirty_f_b', 'bytes', |
| 46 memory['Browser']['PrivateDirty'], |
| 47 chart_name='vm_private_dirty_final_b', |
| 48 data_type='unimportant') |
| 49 if 'ProportionalSetSize' in memory['Browser']: |
| 50 results.Add('vm_pss_f_b', 'bytes', |
| 51 memory['Browser']['ProportionalSetSize'], |
| 52 chart_name='vm_pss_final_b', data_type='unimportant') |
| 53 |
| 54 # Renderer |
| 55 if 'VM' in memory['Renderer']: |
| 56 results.Add('vm_size_f_r', 'bytes', memory['Renderer']['VM'], |
| 57 chart_name='vm_size_final_r', data_type='unimportant') |
| 58 if 'VMPeak' in memory['Renderer']: |
| 59 results.Add('vm_peak_r', 'bytes', memory['Browser']['VMPeak'], |
| 60 chart_name='vm_pk_r', data_type='unimportant') |
| 61 if 'WorkingSetSize' in memory['Renderer']: |
| 62 results.Add('vm_%s_f_r' % metric, 'bytes', |
| 63 memory['Renderer']['WorkingSetSize'], |
| 64 chart_name='vm_%s_final_r' % metric, data_type='unimportant') |
| 65 if 'WorkingSetSizePeak' in memory['Renderer']: |
| 66 results.Add('%s_peak_r' % metric, 'bytes', |
| 67 memory['Browser']['WorkingSetSizePeak'], |
| 68 chart_name='%s_pk_r' % metric, data_type='unimportant') |
| 69 if 'PrivateDirty' in memory['Renderer']: |
| 70 results.Add('vm_private_dirty_f_r', 'bytes', |
| 71 memory['Renderer']['PrivateDirty'], |
| 72 chart_name='vm_private_dirty_final_r', |
| 73 data_type='unimportant') |
| 74 if 'ProportionalSetSize' in memory['Renderer']: |
| 75 results.Add('vm_pss_f_r', 'bytes', |
| 76 memory['Renderer']['ProportionalSetSize'], |
| 77 chart_name='vm_pss_final_r', data_type='unimportant') |
| 78 |
| 79 # Total |
| 80 if 'VM' in memory['Browser'] and 'WM' in memory['Renderer']: |
| 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 ('WorkingSetSize' in memory['Browser'] and |
| 85 'WorkingSetSize' in memory['Renderer']): |
| 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 ('PrivateDirty' in memory['Browser'] and |
| 91 'PrivateDirty' in memory['Renderer']): |
| 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 ('ProportionalSetSize' in memory['Browser'] and |
| 98 'ProportionalSetSize' in memory['Renderer']): |
| 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') |
16 | 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 |