| OLD | NEW |
| 1 # Copyright 2014 The Chromium Authors. All rights reserved. | 1 # Copyright 2014 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 import time | 5 import time |
| 6 | 6 |
| 7 from metrics import Metric | 7 from metrics import Metric |
| 8 from telemetry.core.platform import process_statistic_timeline_data | 8 from telemetry.core.platform import process_statistic_timeline_data |
| 9 from telemetry.value import improvement_direction |
| 9 from telemetry.value import scalar | 10 from telemetry.value import scalar |
| 10 | 11 |
| 11 | 12 |
| 12 class PowerMetric(Metric): | 13 class PowerMetric(Metric): |
| 13 """A metric for measuring power usage.""" | 14 """A metric for measuring power usage.""" |
| 14 | 15 |
| 15 # System power draw while idle. | 16 # System power draw while idle. |
| 16 _quiescent_power_draw_mwh = 0 | 17 _quiescent_power_draw_mwh = 0 |
| 17 | 18 |
| 18 def __init__(self, platform, quiescent_measurement_time_s=0): | 19 def __init__(self, platform, quiescent_measurement_time_s=0): |
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 105 if (PowerMetric._quiescent_power_draw_mwh and | 106 if (PowerMetric._quiescent_power_draw_mwh and |
| 106 application_energy_consumption_mwh is None and | 107 application_energy_consumption_mwh is None and |
| 107 total_energy_consumption_mwh is not None): | 108 total_energy_consumption_mwh is not None): |
| 108 application_energy_consumption_mwh = max( | 109 application_energy_consumption_mwh = max( |
| 109 total_energy_consumption_mwh - PowerMetric._quiescent_power_draw_mwh, | 110 total_energy_consumption_mwh - PowerMetric._quiescent_power_draw_mwh, |
| 110 0) | 111 0) |
| 111 | 112 |
| 112 if total_energy_consumption_mwh is not None: | 113 if total_energy_consumption_mwh is not None: |
| 113 results.AddValue(scalar.ScalarValue( | 114 results.AddValue(scalar.ScalarValue( |
| 114 results.current_page, 'energy_consumption_mwh', 'mWh', | 115 results.current_page, 'energy_consumption_mwh', 'mWh', |
| 115 total_energy_consumption_mwh)) | 116 total_energy_consumption_mwh, |
| 117 improvement_direction=improvement_direction.DOWN)) |
| 116 | 118 |
| 117 if application_energy_consumption_mwh is not None: | 119 if application_energy_consumption_mwh is not None: |
| 118 results.AddValue(scalar.ScalarValue( | 120 results.AddValue(scalar.ScalarValue( |
| 119 results.current_page, 'application_energy_consumption_mwh', 'mWh', | 121 results.current_page, 'application_energy_consumption_mwh', 'mWh', |
| 120 application_energy_consumption_mwh)) | 122 application_energy_consumption_mwh, |
| 123 improvement_direction=improvement_direction.DOWN)) |
| 121 | 124 |
| 122 component_utilization = self._results.get('component_utilization', {}) | 125 component_utilization = self._results.get('component_utilization', {}) |
| 123 # GPU Frequency. | 126 # GPU Frequency. |
| 124 gpu_power = component_utilization.get('gpu', {}) | 127 gpu_power = component_utilization.get('gpu', {}) |
| 125 gpu_freq_hz = gpu_power.get('average_frequency_hz') | 128 gpu_freq_hz = gpu_power.get('average_frequency_hz') |
| 126 if gpu_freq_hz is not None: | 129 if gpu_freq_hz is not None: |
| 127 results.AddValue(scalar.ScalarValue( | 130 results.AddValue(scalar.ScalarValue( |
| 128 results.current_page, 'gpu_average_frequency_hz', 'hz', gpu_freq_hz, | 131 results.current_page, 'gpu_average_frequency_hz', 'hz', gpu_freq_hz, |
| 129 important=False)) | 132 important=False, improvement_direction=improvement_direction.DOWN)) |
| 130 | 133 |
| 131 # Add idle wakeup numbers for all processes. | 134 # Add idle wakeup numbers for all processes. |
| 132 for (process_type, stats) in self._results.get('cpu_stats', {}).items(): | 135 for (process_type, stats) in self._results.get('cpu_stats', {}).items(): |
| 133 trace_name_for_process = 'idle_wakeups_%s' % (process_type.lower()) | 136 trace_name_for_process = 'idle_wakeups_%s' % (process_type.lower()) |
| 134 results.AddValue(scalar.ScalarValue( | 137 results.AddValue(scalar.ScalarValue( |
| 135 results.current_page, trace_name_for_process, 'count', stats, | 138 results.current_page, trace_name_for_process, 'count', stats, |
| 136 important=False)) | 139 important=False, improvement_direction=improvement_direction.DOWN)) |
| 137 | 140 |
| 138 # Add temperature measurements. | 141 # Add temperature measurements. |
| 139 whole_package_utilization = component_utilization.get('whole_package', {}) | 142 whole_package_utilization = component_utilization.get('whole_package', {}) |
| 140 board_temperature_c = whole_package_utilization.get('average_temperature_c') | 143 board_temperature_c = whole_package_utilization.get('average_temperature_c') |
| 141 if board_temperature_c is not None: | 144 if board_temperature_c is not None: |
| 142 results.AddValue(scalar.ScalarValue( | 145 results.AddValue(scalar.ScalarValue( |
| 143 results.current_page, 'board_temperature', 'celsius', | 146 results.current_page, 'board_temperature', 'celsius', |
| 144 board_temperature_c, important=False)) | 147 board_temperature_c, important=False, |
| 148 improvement_direction=improvement_direction.DOWN)) |
| 145 | 149 |
| 146 # Add CPU frequency measurements. | 150 # Add CPU frequency measurements. |
| 147 frequency_hz = whole_package_utilization.get('frequency_percent') | 151 frequency_hz = whole_package_utilization.get('frequency_percent') |
| 148 if frequency_hz is not None: | 152 if frequency_hz is not None: |
| 149 frequency_sum = 0.0 | 153 frequency_sum = 0.0 |
| 150 for freq, percent in frequency_hz.iteritems(): | 154 for freq, percent in frequency_hz.iteritems(): |
| 151 frequency_sum += freq * (percent / 100.0) | 155 frequency_sum += freq * (percent / 100.0) |
| 152 results.AddValue(scalar.ScalarValue( | 156 results.AddValue(scalar.ScalarValue( |
| 153 results.current_page, 'cpu_average_frequency_hz', 'Hz', | 157 results.current_page, 'cpu_average_frequency_hz', 'Hz', |
| 154 frequency_sum, important=False)) | 158 frequency_sum, important=False, |
| 159 improvement_direction=improvement_direction.DOWN)) |
| 155 | 160 |
| 156 # Add CPU c-state residency measurements. | 161 # Add CPU c-state residency measurements. |
| 157 cstate_percent = whole_package_utilization.get('cstate_residency_percent') | 162 cstate_percent = whole_package_utilization.get('cstate_residency_percent') |
| 158 if cstate_percent is not None: | 163 if cstate_percent is not None: |
| 159 for state, percent in cstate_percent.iteritems(): | 164 for state, percent in cstate_percent.iteritems(): |
| 160 results.AddValue(scalar.ScalarValue( | 165 results.AddValue(scalar.ScalarValue( |
| 161 results.current_page, 'cpu_cstate_%s_residency_percent' % state, | 166 results.current_page, 'cpu_cstate_%s_residency_percent' % state, |
| 162 '%', percent, important=False)) | 167 '%', percent, important=False, |
| 168 improvement_direction=improvement_direction.DOWN)) |
| 163 | 169 |
| 164 self._results = None | 170 self._results = None |
| 165 | 171 |
| 166 def _SubtractCpuStats(cpu_stats, start_cpu_stats): | 172 def _SubtractCpuStats(cpu_stats, start_cpu_stats): |
| 167 """Computes number of idle wakeups that occurred over measurement period. | 173 """Computes number of idle wakeups that occurred over measurement period. |
| 168 | 174 |
| 169 Each of the two cpu_stats arguments is a dict as returned by the | 175 Each of the two cpu_stats arguments is a dict as returned by the |
| 170 Browser.cpu_stats call. | 176 Browser.cpu_stats call. |
| 171 | 177 |
| 172 Returns: | 178 Returns: |
| (...skipping 13 matching lines...) Expand all Loading... |
| 186 continue | 192 continue |
| 187 | 193 |
| 188 assert isinstance(cpu_stats[process_type]['IdleWakeupCount'], | 194 assert isinstance(cpu_stats[process_type]['IdleWakeupCount'], |
| 189 process_statistic_timeline_data.IdleWakeupTimelineData) | 195 process_statistic_timeline_data.IdleWakeupTimelineData) |
| 190 idle_wakeup_delta = (cpu_stats[process_type]['IdleWakeupCount'] - | 196 idle_wakeup_delta = (cpu_stats[process_type]['IdleWakeupCount'] - |
| 191 start_cpu_stats[process_type]['IdleWakeupCount']) | 197 start_cpu_stats[process_type]['IdleWakeupCount']) |
| 192 cpu_delta[process_type] = idle_wakeup_delta.total_sum() | 198 cpu_delta[process_type] = idle_wakeup_delta.total_sum() |
| 193 total = total + cpu_delta[process_type] | 199 total = total + cpu_delta[process_type] |
| 194 cpu_delta['Total'] = total | 200 cpu_delta['Total'] = total |
| 195 return cpu_delta | 201 return cpu_delta |
| OLD | NEW |