blob: 090390e81e80c1bdd818b28dca0195b167140482 [file] [edit]
<!DOCTYPE html>
<!--
Copyright 2016 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.
-->
<link rel="import" href="/tracing/base/xhr.html">
<link rel="import" href="/tracing/value/histogram_set.html">
<script>
'use strict';
/* eslint-disable no-console */
function findGrouping(key) {
const grouping = tr.v.HistogramGrouping.BY_KEY.get(key);
if (grouping === undefined) {
throw new Error(`Could not find grouping "${key}"`);
}
return grouping;
}
function findMergeable(hist, candidates) {
for (const candidate of candidates) {
if (candidate.canAddHistogram(hist)) return candidate;
}
return undefined;
}
function mergeLeafHistograms(groupedHistograms, mergedHistograms) {
for (const [name, histograms] of groupedHistograms) {
if (histograms instanceof Map) {
mergeLeafHistograms(histograms, mergedHistograms);
continue;
}
if (histograms.length === 1) {
mergedHistograms.addHistogram(histograms[0].clone());
continue;
}
// Merge Histograms in this leaf array and return the merged Histograms to
// mergedHistograms.
// If it isn't possible to merge all Histograms in |histograms| together,
// then merge them into as few merged Histograms as possible.
const merged = [histograms.shift().clone()];
for (const hist of histograms) {
const candidate = findMergeable(hist, merged);
if (candidate !== undefined) {
candidate.addHistogram(hist);
continue;
}
merged.push(hist.clone());
}
for (const hist of merged) {
mergedHistograms.addHistogram(hist);
}
}
}
function stripInternalDiagnostics(mergedHistograms) {
for (const hist of mergedHistograms) {
hist.diagnostics.delete(tr.v.d.RESERVED_NAMES.TEST_PATH);
}
}
function mergeHistograms(histogramsPath, groupingKeys) {
const histograms = new tr.v.HistogramSet();
histograms.importDicts(JSON.parse(tr.b.getSync('file://' + histogramsPath)));
histograms.buildGroupingsFromTags([tr.v.d.RESERVED_NAMES.STORY_TAGS]);
const groupings = groupingKeys.map(findGrouping);
const groupedHistograms = histograms.groupHistogramsRecursively(groupings);
const mergedHistograms = new tr.v.HistogramSet();
mergeLeafHistograms(groupedHistograms, mergedHistograms);
mergedHistograms.deduplicateDiagnostics();
stripInternalDiagnostics(mergedHistograms);
return mergedHistograms;
}
if (tr.isHeadless) {
const mergedHistograms = mergeHistograms(sys.argv[1], sys.argv.slice(2));
console.log(JSON.stringify(mergedHistograms.asDicts()));
}
</script>