summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjeremy@chromium.org <jeremy@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-01-25 07:59:43 +0000
committerjeremy@chromium.org <jeremy@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-01-25 07:59:43 +0000
commit6744b4f2f21028ebd268fc1158f5e38b2ee9c087 (patch)
treed2e3c76b17644b53b18883aba73880b4a3d8416e
parentfee3a7815a064db00553075a647fb2ee69c13ffb (diff)
downloadchromium_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.py20
-rw-r--r--tools/perf/metrics/power.py48
-rw-r--r--tools/perf/unit-info.json4
-rw-r--r--tools/telemetry/telemetry/core/platform/mac_platform_backend.py11
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, (