[object-stats] Add histogram
No-try: true Bug: v8:7266 Change-Id: I8b8ec94c1909e7404774afd576968cf843c043ff Reviewed-on: https://chromium-review.googlesource.com/873033 Reviewed-by: Camillo Bruni <cbruni@chromium.org> Commit-Queue: Michael Lippautz <mlippautz@chromium.org> Cr-Commit-Position: refs/heads/master@{#50673}
This commit is contained in:
parent
27905a33f5
commit
8888d5e48b
@ -86,7 +86,6 @@ class GlobalTimeline extends HTMLElement {
|
|||||||
}
|
}
|
||||||
|
|
||||||
getInstanceTypeData() {
|
getInstanceTypeData() {
|
||||||
const categories = Object.keys(this.selection.categories);
|
|
||||||
const instance_types =
|
const instance_types =
|
||||||
Object.values(this.selection.categories)
|
Object.values(this.selection.categories)
|
||||||
.reduce((accu, current) => accu.concat(current), []);
|
.reduce((accu, current) => accu.concat(current), []);
|
||||||
|
16
tools/heap-stats/histogram-viewer.html
Normal file
16
tools/heap-stats/histogram-viewer.html
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
<!-- Copyright 2018 the V8 project authors. All rights reserved.
|
||||||
|
Use of this source code is governed by a BSD-style license that can be
|
||||||
|
found in the LICENSE file. -->
|
||||||
|
<template id="histogram-viewer-template">
|
||||||
|
<style>
|
||||||
|
#chart {
|
||||||
|
width: 100%;
|
||||||
|
height: 800px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<div id="container" style="display: none;">
|
||||||
|
<h2>Details</h2>
|
||||||
|
<div id="chart"></div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<script type="text/javascript" src="histogram-viewer.js"></script>
|
124
tools/heap-stats/histogram-viewer.js
Normal file
124
tools/heap-stats/histogram-viewer.js
Normal file
@ -0,0 +1,124 @@
|
|||||||
|
// Copyright 2018 the V8 project authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style license that can be
|
||||||
|
// found in the LICENSE file.
|
||||||
|
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
const histogram_viewer_template =
|
||||||
|
document.currentScript.ownerDocument.querySelector(
|
||||||
|
'#histogram-viewer-template');
|
||||||
|
|
||||||
|
class HistogramViewer extends HTMLElement {
|
||||||
|
constructor() {
|
||||||
|
super();
|
||||||
|
const shadowRoot = this.attachShadow({mode: 'open'});
|
||||||
|
shadowRoot.appendChild(histogram_viewer_template.content.cloneNode(true));
|
||||||
|
}
|
||||||
|
|
||||||
|
$(id) {
|
||||||
|
return this.shadowRoot.querySelector(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
set data(value) {
|
||||||
|
this._data = value;
|
||||||
|
this.stateChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
get data() {
|
||||||
|
return this._data;
|
||||||
|
}
|
||||||
|
|
||||||
|
set selection(value) {
|
||||||
|
this._selection = value;
|
||||||
|
this.stateChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
get selection() {
|
||||||
|
return this._selection;
|
||||||
|
}
|
||||||
|
|
||||||
|
isValid() {
|
||||||
|
return this.data && this.selection;
|
||||||
|
}
|
||||||
|
|
||||||
|
hide() {
|
||||||
|
this.$('#container').style.display = 'none';
|
||||||
|
}
|
||||||
|
|
||||||
|
show() {
|
||||||
|
this.$('#container').style.display = 'block';
|
||||||
|
}
|
||||||
|
|
||||||
|
stateChanged() {
|
||||||
|
if (this.isValid()) {
|
||||||
|
this.drawChart();
|
||||||
|
} else {
|
||||||
|
this.hide();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
get selectedData() {
|
||||||
|
console.assert(this.data, 'invalid data');
|
||||||
|
console.assert(this.selection, 'invalid selection');
|
||||||
|
return this.data[this.selection.isolate]
|
||||||
|
.gcs[this.selection.gc][this.selection.data_set];
|
||||||
|
}
|
||||||
|
|
||||||
|
getCategoryData() {
|
||||||
|
const labels = [
|
||||||
|
'Bucket',
|
||||||
|
...Object.keys(this.selection.categories)
|
||||||
|
.map(k => this.selection.category_names.get(k))
|
||||||
|
];
|
||||||
|
const data = this.selectedData.bucket_sizes.map(
|
||||||
|
(bucket_size, index) =>
|
||||||
|
[`<${bucket_size}`,
|
||||||
|
...Object.values(this.selection.categories)
|
||||||
|
.map(
|
||||||
|
instance_types =>
|
||||||
|
instance_types
|
||||||
|
.map(
|
||||||
|
instance_type =>
|
||||||
|
this.selectedData
|
||||||
|
.instance_type_data[instance_type]
|
||||||
|
.histogram[index])
|
||||||
|
.reduce((accu, current) => accu + current, 0))]);
|
||||||
|
// Adjust last histogram bucket label.
|
||||||
|
data[data.length - 1][0] = 'rest';
|
||||||
|
return [labels, ...data];
|
||||||
|
}
|
||||||
|
|
||||||
|
getInstanceTypeData() {
|
||||||
|
const instance_types =
|
||||||
|
Object.values(this.selection.categories)
|
||||||
|
.reduce((accu, current) => accu.concat(current), []);
|
||||||
|
const labels = ['Bucket', ...instance_types];
|
||||||
|
const data = this.selectedData.bucket_sizes.map(
|
||||||
|
(bucket_size, index) =>
|
||||||
|
[`<${bucket_size}`,
|
||||||
|
...instance_types.map(
|
||||||
|
instance_type =>
|
||||||
|
this.selectedData.instance_type_data[instance_type]
|
||||||
|
.histogram[index])]);
|
||||||
|
// Adjust last histogram bucket label.
|
||||||
|
data[data.length - 1][0] = 'rest';
|
||||||
|
return [labels, ...data];
|
||||||
|
}
|
||||||
|
|
||||||
|
drawChart() {
|
||||||
|
const chart_data = (this.selection.merge_categories) ?
|
||||||
|
this.getCategoryData() :
|
||||||
|
this.getInstanceTypeData();
|
||||||
|
const data = google.visualization.arrayToDataTable(chart_data);
|
||||||
|
const options = {
|
||||||
|
legend: {position: 'top', maxLines: '1'},
|
||||||
|
chartArea: {width: '85%', height: '85%'},
|
||||||
|
bar: {groupWidth: '80%'},
|
||||||
|
};
|
||||||
|
const chart = new google.visualization.BarChart(this.$('#chart'));
|
||||||
|
this.show();
|
||||||
|
chart.draw(data, options);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
customElements.define('histogram-viewer', HistogramViewer);
|
@ -13,6 +13,7 @@ found in the LICENSE file. -->
|
|||||||
|
|
||||||
<link rel="import" href="details-selection.html">
|
<link rel="import" href="details-selection.html">
|
||||||
<link rel="import" href="global-timeline.html">
|
<link rel="import" href="global-timeline.html">
|
||||||
|
<link rel="import" href="histogram-viewer.html">
|
||||||
<link rel="import" href="trace-file-reader.html">
|
<link rel="import" href="trace-file-reader.html">
|
||||||
|
|
||||||
<style type="text/css">
|
<style type="text/css">
|
||||||
@ -28,7 +29,7 @@ body {
|
|||||||
|
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
google.charts.load('current', {'packages':['line', 'corechart']});
|
google.charts.load('current', {'packages':['line', 'corechart', 'bar']});
|
||||||
|
|
||||||
function $(id) { return document.querySelector(id); }
|
function $(id) { return document.querySelector(id); }
|
||||||
|
|
||||||
@ -47,15 +48,16 @@ function globalDataChanged(e) {
|
|||||||
state.selection = null;
|
state.selection = null;
|
||||||
$('#global-timeline').selection = state.selection;
|
$('#global-timeline').selection = state.selection;
|
||||||
$('#global-timeline').data = state.data;
|
$('#global-timeline').data = state.data;
|
||||||
$('#type-details').selection = state.selection;
|
$('#histogram-viewer').selection = state.selection;
|
||||||
$('#type-details').data = state.data;
|
$('#histogram-viewer').data = state.data;
|
||||||
$('#details-selection').data = state.data;
|
$('#details-selection').data = state.data;
|
||||||
}
|
}
|
||||||
|
|
||||||
function globalSelectionChangedA(e) {
|
function globalSelectionChangedA(e) {
|
||||||
state.selection = e.detail;
|
state.selection = e.detail;
|
||||||
|
console.log(state.selection);
|
||||||
$('#global-timeline').selection = state.selection;
|
$('#global-timeline').selection = state.selection;
|
||||||
$('#type-details').selection = state.selection;
|
$('#histogram-viewer').selection = state.selection;
|
||||||
}
|
}
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
@ -82,7 +84,7 @@ function globalSelectionChangedA(e) {
|
|||||||
</p>
|
</p>
|
||||||
<details-selection id="details-selection" onchange="globalSelectionChangedA(event)"></details-selection>
|
<details-selection id="details-selection" onchange="globalSelectionChangedA(event)"></details-selection>
|
||||||
<global-timeline id="global-timeline"></global-timeline>
|
<global-timeline id="global-timeline"></global-timeline>
|
||||||
<type-details id="type-details"></type-details>
|
<histogram-viewer id="histogram-viewer"></histogram-viewer>
|
||||||
</body>
|
</body>
|
||||||
|
|
||||||
</html>
|
</html>
|
||||||
|
Loading…
Reference in New Issue
Block a user