| 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 | 4 |
| 5 import re | 5 import re |
| 6 import sys | 6 import sys |
| 7 | 7 |
| 8 import android_commands | 8 import android_commands |
| 9 import cache_control |
| 10 import perf_control |
| 9 import json | 11 import json |
| 10 import logging | 12 import logging |
| 11 import math | 13 import math |
| 12 | 14 |
| 13 # Valid values of result type. | 15 # Valid values of result type. |
| 14 RESULT_TYPES = {'unimportant': 'RESULT ', | 16 RESULT_TYPES = {'unimportant': 'RESULT ', |
| 15 'default': '*RESULT ', | 17 'default': '*RESULT ', |
| 16 'informational': '', | 18 'informational': '', |
| 17 'unimportant-histogram': 'HISTOGRAM ', | 19 'unimportant-histogram': 'HISTOGRAM ', |
| 18 'histogram': '*HISTOGRAM '} | 20 'histogram': '*HISTOGRAM '} |
| (...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 139 if avg: | 141 if avg: |
| 140 output += '\nAvg %s: %f%s' % (measurement, avg, units) | 142 output += '\nAvg %s: %f%s' % (measurement, avg, units) |
| 141 if sd: | 143 if sd: |
| 142 output += '\nSd %s: %f%s' % (measurement, sd, units) | 144 output += '\nSd %s: %f%s' % (measurement, sd, units) |
| 143 if print_to_stdout: | 145 if print_to_stdout: |
| 144 print output | 146 print output |
| 145 sys.stdout.flush() | 147 sys.stdout.flush() |
| 146 return output | 148 return output |
| 147 | 149 |
| 148 | 150 |
| 149 class CacheControl(object): | 151 # TODO(bulach): remove once all references to PerfControl are fixed. |
| 150 _DROP_CACHES = '/proc/sys/vm/drop_caches' | 152 class CacheControl(cache_control.CacheControl): |
| 153 def __init__(self, adb): |
| 154 super(CacheControl, self).__init__(adb) |
| 151 | 155 |
| 156 class PerfControl(perf_control.PerfControl): |
| 152 def __init__(self, adb): | 157 def __init__(self, adb): |
| 153 self._adb = adb | 158 super(PerfControl, self).__init__(adb) |
| 154 | |
| 155 def DropRamCaches(self): | |
| 156 """Drops the filesystem ram caches for performance testing.""" | |
| 157 self._adb.RunShellCommand('su -c sync') | |
| 158 self._adb.SetProtectedFileContents(CacheControl._DROP_CACHES, '3') | |
| 159 | |
| 160 | |
| 161 class PerfControl(object): | |
| 162 """Provides methods for setting the performance mode of a device.""" | |
| 163 _SCALING_GOVERNOR_FMT = ( | |
| 164 '/sys/devices/system/cpu/cpu%d/cpufreq/scaling_governor') | |
| 165 | |
| 166 def __init__(self, adb): | |
| 167 self._adb = adb | |
| 168 kernel_max = self._adb.GetFileContents('/sys/devices/system/cpu/kernel_max', | |
| 169 log_result=False) | |
| 170 assert kernel_max, 'Unable to find /sys/devices/system/cpu/kernel_max' | |
| 171 self._kernel_max = int(kernel_max[0]) | |
| 172 logging.info('Maximum CPU index: %d' % self._kernel_max) | |
| 173 self._original_scaling_governor = self._adb.GetFileContents( | |
| 174 PerfControl._SCALING_GOVERNOR_FMT % 0, | |
| 175 log_result=False)[0] | |
| 176 | |
| 177 def SetHighPerfMode(self): | |
| 178 """Sets the highest possible performance mode for the device.""" | |
| 179 self._SetScalingGovernorInternal('performance') | |
| 180 | |
| 181 def SetDefaultPerfMode(self): | |
| 182 """Sets the performance mode for the device to its default mode.""" | |
| 183 product_model = self._adb.GetProductModel() | |
| 184 governor_mode = { | |
| 185 "GT-I9300" : 'pegasusq', | |
| 186 "Galaxy Nexus" : 'interactive', | |
| 187 "Nexus 4" : 'ondemand', | |
| 188 "Nexus 7" : 'interactive', | |
| 189 "Nexus 10": 'interactive' | |
| 190 }.get(product_model, 'ondemand') | |
| 191 self._SetScalingGovernorInternal(governor_mode) | |
| 192 | |
| 193 def RestoreOriginalPerfMode(self): | |
| 194 """Resets the original performance mode of the device.""" | |
| 195 self._SetScalingGovernorInternal(self._original_scaling_governor) | |
| 196 | |
| 197 def _SetScalingGovernorInternal(self, value): | |
| 198 for cpu in range(self._kernel_max + 1): | |
| 199 scaling_governor_file = PerfControl._SCALING_GOVERNOR_FMT % cpu | |
| 200 if self._adb.FileExistsOnDevice(scaling_governor_file): | |
| 201 logging.info('Writing scaling governor mode \'%s\' -> %s' % | |
| 202 (value, scaling_governor_file)) | |
| 203 self._adb.SetProtectedFileContents(scaling_governor_file, value) | |
| OLD | NEW |