Chromium Code Reviews| Index: tools/perf/metrics/histogram.py |
| diff --git a/tools/perf/metrics/histogram.py b/tools/perf/metrics/histogram.py |
| index 147ae966321606dcb6b47a2863b47311dfa55021..6a45b1cb3cd29de8a99e9b974dd10ba77d8cf2d4 100644 |
| --- a/tools/perf/metrics/histogram.py |
| +++ b/tools/perf/metrics/histogram.py |
| @@ -1,40 +1,72 @@ |
| # Copyright 2013 The Chromium Authors. All rights reserved. |
|
qyearsley
2013/08/08 17:35:52
This module contains basically what was just in 'h
|
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| -from metrics import histogram_util |
| + |
| +"""This is a helper module to get and manipulate histogram data. |
| + |
| +The histogram data is the same data as is visible from "chrome://histograms". |
| +More information can be found at: chromium/src/base/metrics/histogram.h |
| + |
| +Histogram data is collected with either the window.statsCollectionController |
| +object or the window.domAutomationController object. |
| +""" |
| + |
| +import json |
| +import logging |
| BROWSER_HISTOGRAM = 'browser_histogram' |
| RENDERER_HISTOGRAM = 'renderer_histogram' |
| -class HistogramMetric(object): |
| - def __init__(self, histogram, histogram_type): |
| - self.name = histogram['name'] |
| - self.units = histogram['units'] |
| - self.histogram_type = histogram_type |
| - self._start_values = dict() |
| - |
| - def Start(self, page, tab): |
| - """Get the starting value for the histogram. This value will then be |
| - subtracted from the actual measurement.""" |
| - data = self._GetHistogramFromDomAutomation(tab) |
| - if data: |
| - self._start_values[page.url + self.name] = data |
| - |
| - def GetValue(self, page, tab, results): |
| - data = self._GetHistogramFromDomAutomation(tab) |
| - if not data: |
| - return |
| - new_histogram = histogram_util.SubtractHistogram( |
| - data, self._start_values[page.url + self.name]) |
| - results.Add(self.name, self.units, new_histogram, |
| - data_type='unimportant-histogram') |
| - |
| - @property |
| - def histogram_function(self): |
| - if self.histogram_type == BROWSER_HISTOGRAM: |
| - return 'getBrowserHistogram' |
| - return 'getHistogram' |
| - |
| - def _GetHistogramFromDomAutomation(self, tab): |
| - return histogram_util.GetHistogramFromDomAutomation( |
| - self.histogram_function, self.name, tab) |
| +def GetHistogramData(histogram_type, histogram_name, tab): |
|
qyearsley
2013/08/08 17:35:52
I renamed GetHistogramFromDomAutomation to GetHist
|
| + """Get a json serialization of a histogram.""" |
| + assert histogram_type in [BROWSER_HISTOGRAM, RENDERER_HISTOGRAM] |
| + function = 'getHistogram' |
| + if histogram_type == BROWSER_HISTOGRAM: |
| + function = 'getBrowserHistogram' |
| + # TODO(jeremy): Remove references to |
| + # domAutomationController when we update the reference builds. |
| + return tab.EvaluateJavaScript( |
| + '(window.statsCollectionController ? ' |
| + 'statsCollectionController : ' |
| + 'domAutomationController).%s("%s")' % |
| + (function, histogram_name)) |
| + |
| + |
| +def SubtractHistogram(histogram_json, start_histogram_json): |
| + """Subtracts a previous histogram from a histogram. |
| + |
| + Both parameters and the returned result are json serializations. |
| + """ |
| + start_histogram = json.loads(start_histogram_json) |
| + # It's ok if the start histogram is empty (we had no data, maybe even no |
| + # histogram at all, at the start of the test). |
| + if 'buckets' not in start_histogram: |
| + return histogram_json |
| + |
| + histogram = json.loads(histogram_json) |
| + if ('pid' in start_histogram and 'pid' in histogram |
| + and start_histogram['pid'] != histogram['pid']): |
| + raise Exception( |
| + 'Trying to compare histograms from different processes (%d and %d)' |
| + % (start_histogram['pid'], histogram['pid'])) |
| + |
| + start_histogram_buckets = dict() |
| + for b in start_histogram['buckets']: |
| + start_histogram_buckets[b['low']] = b['count'] |
| + |
| + new_buckets = [] |
| + for b in histogram['buckets']: |
| + new_bucket = b |
| + low = b['low'] |
| + if low in start_histogram_buckets: |
| + new_bucket['count'] = b['count'] - start_histogram_buckets[low] |
| + if new_bucket['count'] < 0: |
| + logging.error('Histogram subtraction error, starting histogram most ' |
| + 'probably invalid.') |
| + if new_bucket['count']: |
| + new_buckets.append(new_bucket) |
| + histogram['buckets'] = new_buckets |
| + histogram['count'] -= start_histogram['count'] |
| + |
| + return json.dumps(histogram) |
| + |