diff options
author | jeremy@chromium.org <jeremy@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-01-25 07:59:43 +0000 |
---|---|---|
committer | jeremy@chromium.org <jeremy@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-01-25 07:59:43 +0000 |
commit | 6744b4f2f21028ebd268fc1158f5e38b2ee9c087 (patch) | |
tree | d2e3c76b17644b53b18883aba73880b4a3d8416e | |
parent | fee3a7815a064db00553075a647fb2ee69c13ffb (diff) | |
download | chromium_src-6744b4f2f21028ebd268fc1158f5e38b2ee9c087.zip chromium_src-6744b4f2f21028ebd268fc1158f5e38b2ee9c087.tar.gz chromium_src-6744b4f2f21028ebd268fc1158f5e38b2ee9c087.tar.bz2 |
[Telemetry] Add power usage metric
* Add a power usage metric and add sample usage in startup test.
* OS X: Only print power metrics stderr output when passing -v to Telemetry due to console spew.
BUG=336565,336672,336555
Review URL: https://codereview.chromium.org/144543007
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@247100 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | tools/perf/measurements/smoothness.py | 20 | ||||
-rw-r--r-- | tools/perf/metrics/power.py | 48 | ||||
-rw-r--r-- | tools/perf/unit-info.json | 4 | ||||
-rw-r--r-- | tools/telemetry/telemetry/core/platform/mac_platform_backend.py | 11 |
4 files changed, 75 insertions, 8 deletions
diff --git a/tools/perf/measurements/smoothness.py b/tools/perf/measurements/smoothness.py index 4715afa..a84a4ac 100644 --- a/tools/perf/measurements/smoothness.py +++ b/tools/perf/measurements/smoothness.py @@ -2,29 +2,37 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. +from metrics import power from metrics import smoothness from telemetry.page import page_measurement + class Smoothness(page_measurement.PageMeasurement): def __init__(self): super(Smoothness, self).__init__('smoothness') - self._metric = None + self._smoothness_metric = None + self._power_metric = None def CustomizeBrowserOptions(self, options): options.AppendExtraBrowserArgs('--enable-gpu-benchmarking') + power.PowerMetric.CustomizeBrowserOptions(options) def CanRunForPage(self, page): return hasattr(page, 'smoothness') def WillRunActions(self, page, tab): - self._metric = smoothness.SmoothnessMetric() - self._metric.Start(page, tab) + self._power_metric = power.PowerMetric() + self._power_metric.Start(page, tab) + self._smoothness_metric = smoothness.SmoothnessMetric() + self._smoothness_metric.Start(page, tab) def DidRunAction(self, page, tab, action): - self._metric.AddActionToIncludeInMetric(action) + self._smoothness_metric.AddActionToIncludeInMetric(action) def DidRunActions(self, page, tab): - self._metric.Stop(page, tab) + self._power_metric.Stop(page, tab) + self._smoothness_metric.Stop(page, tab) def MeasurePage(self, page, tab, results): - self._metric.AddResults(tab, results) + self._power_metric.AddResults(tab, results) + self._smoothness_metric.AddResults(tab, results) diff --git a/tools/perf/metrics/power.py b/tools/perf/metrics/power.py new file mode 100644 index 0000000..32461ce --- /dev/null +++ b/tools/perf/metrics/power.py @@ -0,0 +1,48 @@ +# Copyright 2014 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +import logging + +from metrics import Metric + + +class PowerMetric(Metric): + """A metric for measuring power usage.""" + + _enabed = True + + def __init__(self): + super(PowerMetric, self).__init__() + self._results = None + + @classmethod + def CustomizeBrowserOptions(cls, options): + PowerMetric._enabed = options.report_root_metrics + + def Start(self, _, tab): + if not PowerMetric._enabed: + return + + if not tab.browser.platform.CanMonitorPowerAsync(): + logging.warning("System doesn't support async power monitoring.") + return + + tab.browser.platform.StartMonitoringPowerAsync() + + def Stop(self, _, tab): + if not PowerMetric._enabed: + return + + if not tab.browser.platform.CanMonitorPowerAsync(): + return + + self._results = tab.browser.platform.StopMonitoringPowerAsync() + + def AddResults(self, _, results): + if not self._results: + return + + energy_consumption_mwh = self._results['energy_consumption_mwh'] + results.Add('energy_consumption_mwh', 'mWh', energy_consumption_mwh) + self._results = None diff --git a/tools/perf/unit-info.json b/tools/perf/unit-info.json index 0986211a..b5f5150 100644 --- a/tools/perf/unit-info.json +++ b/tools/perf/unit-info.json @@ -68,6 +68,10 @@ "milliseconds-per-frame": { "improvement_direction": "down" }, + "mWh": { + "improvement_direction": "down", + "why": "Fewer milliwatt-hours means less energy consumed." + }, "objects (bigger is better)": { "improvement_direction": "up", "why": "Used in spaceport benchmark." diff --git a/tools/telemetry/telemetry/core/platform/mac_platform_backend.py b/tools/telemetry/telemetry/core/platform/mac_platform_backend.py index fbf519c..5f27c35 100644 --- a/tools/telemetry/telemetry/core/platform/mac_platform_backend.py +++ b/tools/telemetry/telemetry/core/platform/mac_platform_backend.py @@ -3,6 +3,7 @@ # found in the LICENSE file. import ctypes +import logging import os import plistlib import signal @@ -35,9 +36,15 @@ class MacPlatformBackend(posix_platform_backend.PosixPlatformBackend): self._powermetrics_output_file = tempfile.NamedTemporaryFile().name args = [self.binary_path, '-f', 'plist', '-i', '%d' % SAMPLE_INTERVAL_MS, '-u', self._powermetrics_output_file] - # TODO(jeremy): Need to ensure command is run as root user. + + # powermetrics writes lots of output to stderr, don't echo unless verbose + # logging enabled. + stderror_destination = subprocess.PIPE + if logging.getLogger().isEnabledFor(logging.DEBUG): + stderror_destination = None + self._powermetrics_process = subprocess.Popen(args, - stdout=subprocess.PIPE) + stdout=subprocess.PIPE, stderr=stderror_destination) def StopMonitoringPowerAsync(self): assert self._powermetrics_process, ( |