blob: 1ae15e021fe9123097525a8272f6650720c45fca [file] [log] [blame]
<!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/core/test_utils.html">
<link rel="import" href="/tracing/extras/importer/trace_event_importer.html">
<link rel="import" href="/tracing/metrics/v8/gc_metric.html">
<link rel="import" href="/tracing/model/slice_group.html">
<link rel="import" href="/tracing/value/value_set.html">
<script>
'use strict';
tr.b.unittest.testSuite(function() {
function createModel(start, end, slices) {
var opts = {
customizeModelCallback: function(model) {
var process = model.getOrCreateProcess(1);
var thread = process.getOrCreateThread(2);
var group = thread.sliceGroup;
slices.forEach(function(slice) {
group.pushSlice(tr.c.TestUtils.newSliceEx(slice));
});
group.createSubSlices();
}
};
var model = tr.c.TestUtils.newModelWithEvents([], opts);
return model;
}
function constructName(name, suffix) {
return name + '_' + suffix;
}
function run(slices) {
var values = new tr.v.ValueSet();
var startTime = slices.reduce((acc, slice) => (Math.min(acc, slice.start)));
var endTime = slices.reduce((acc, slice) => (Math.max(acc, slice.end)));
var model = createModel(startTime - 1, endTime + 1, slices);
tr.metrics.v8.gcMetric(values, model);
return values;
}
test('topEvents', function() {
var events = {
'V8.GCCompactor': 'v8-gc-full-mark-compactor',
'V8.GCFinalizeMC': 'v8-gc-latency-mark-compactor',
'V8.GCFinalizeMCReduceMemory': 'v8-gc-memory-mark-compactor',
'V8.GCIncrementalMarking': 'v8-gc-incremental-step',
'V8.GCIncrementalMarkingFinalize': 'v8-gc-incremental-finalize',
'V8.GCIncrementalMarkingStart': 'v8-gc-incremental-start',
'V8.GCPhantomHandleProcessingCallback' : 'v8-gc-phantom-handle-callback',
'V8.GCScavenger': 'v8-gc-scavenger'
};
tr.b.iterItems(events, function(timelineName, telemetryName) {
var slices = [
{
title: timelineName, args: {}, start: 100, end: 200,
cpuStart: 100, cpuEnd: 200
}
];
var actual = run(slices);
var value = tr.b.getOnlyElement(actual.getValuesNamed(telemetryName));
assert.strictEqual(value.running.sum, 100);
assert.strictEqual(value.numValues, 1);
assert.strictEqual(value.average, 100);
assert.strictEqual(value.running.max, 100);
assert.closeTo(value.getApproximatePercentile(0.90), 100, 1);
value = tr.b.getOnlyElement(actual.getValuesNamed(
telemetryName + '_idle_deadline_overrun'));
assert.strictEqual(value.running.sum, 0);
assert.strictEqual(value.numValues, 1);
assert.strictEqual(value.average, 0);
assert.strictEqual(value.running.max, 0);
value = tr.b.getOnlyElement(actual.getValuesNamed(
telemetryName + '_outside_idle'));
assert.strictEqual(value.running.sum, 100);
assert.strictEqual(value.numValues, 1);
assert.strictEqual(value.average, 100);
value = tr.b.getOnlyElement(actual.getValuesNamed(
telemetryName + '_percentage_idle'));
assert.strictEqual(value.average, 0);
});
});
test('idleTimes', function() {
var values = new tr.v.ValueSet();
var slices = [
{
title: 'SingleThreadIdleTaskRunner::RunTask',
args: {'allotted_time_ms' : 100}, start: 100, end: 200,
cpuStart: 100, cpuEnd: 200
},
{
title: 'V8.GCFinalizeMC', args: {}, start: 110, end: 190,
cpuStart: 110, cpuEnd: 190
}
];
var actual = run(slices);
var value = tr.b.getOnlyElement(actual.getValuesNamed(
'v8-gc-latency-mark-compactor'));
assert.strictEqual(value.running.sum, 80);
assert.strictEqual(value.numValues, 1);
assert.strictEqual(value.average, 80);
assert.strictEqual(value.running.max, 80);
value = tr.b.getOnlyElement(actual.getValuesNamed(
'v8-gc-latency-mark-compactor_idle_deadline_overrun'));
assert.strictEqual(value.running.sum, 0);
assert.strictEqual(value.average, 0);
assert.strictEqual(value.running.max, 0);
value = tr.b.getOnlyElement(actual.getValuesNamed(
'v8-gc-latency-mark-compactor_outside_idle'));
assert.strictEqual(value.running.sum, 0);
assert.strictEqual(value.average, 0);
assert.strictEqual(value.running.max, 0);
value = tr.b.getOnlyElement(actual.getValuesNamed(
'v8-gc-latency-mark-compactor_percentage_idle'));
assert.strictEqual(value.average, 1);
});
test('idleTimeOverrun', function() {
var values = new tr.v.ValueSet();
var slices = [
{
title: 'SingleThreadIdleTaskRunner::RunTask',
args: {'allotted_time_ms' : 10}, start: 100, end: 200,
cpuStart: 100, cpuEnd: 200
},
{
title: 'V8.GCFinalizeMC', args: {}, start: 110, end: 190,
cpuStart: 110, cpuEnd: 190
}
];
var actual = run(slices);
var value = tr.b.getOnlyElement(actual.getValuesNamed(
'v8-gc-latency-mark-compactor'));
assert.strictEqual(value.running.sum, 80);
assert.strictEqual(value.numValues, 1);
assert.strictEqual(value.average, 80);
assert.strictEqual(value.running.max, 80);
value = tr.b.getOnlyElement(actual.getValuesNamed(
'v8-gc-latency-mark-compactor_idle_deadline_overrun'));
assert.strictEqual(value.running.sum, 70);
assert.strictEqual(value.average, 70);
assert.strictEqual(value.running.max, 70);
value = tr.b.getOnlyElement(actual.getValuesNamed(
'v8-gc-latency-mark-compactor_outside_idle'));
assert.strictEqual(value.running.sum, 70);
assert.strictEqual(value.average, 70);
assert.strictEqual(value.running.max, 70);
value = tr.b.getOnlyElement(actual.getValuesNamed(
'v8-gc-latency-mark-compactor_percentage_idle'));
assert.closeTo(value.average, 1 / 8, 1e-6);
});
test('subEvents', function() {
var values = new tr.v.ValueSet();
var slices = [
{
title: 'V8.GCFinalizeMC', args: {}, start: 100, end: 200,
cpuStart: 100, cpuEnd: 200
},
{
title: 'V8.GC_MC_MARK', args: {}, start: 110, end: 190,
cpuStart: 110, cpuEnd: 190
},
];
var actual = run(slices);
var telemetryName = 'v8-gc-latency-mark-compactor-mark';
var value = tr.b.getOnlyElement(actual.getValuesNamed(telemetryName));
assert.strictEqual(value.average, 80);
assert.strictEqual(value.running.max, 80);
assert.closeTo(value.getApproximatePercentile(0.90), 80, 1);
});
test('total', function() {
var values = new tr.v.ValueSet();
var slices = [
{
title: 'V8.GCFinalizeMC', args: {}, start: 100, end: 200,
cpuStart: 100, cpuEnd: 200
},
{
title: 'V8.GCIncrementalMarking', args: {}, start: 210, end: 290,
cpuStart: 210, cpuEnd: 290
}
];
var actual = run(slices);
var value = tr.b.getOnlyElement(actual.getValuesNamed('v8-gc-total'));
assert.strictEqual(value.running.sum, 180);
assert.strictEqual(value.numValues, 2);
assert.strictEqual(value.average, 90);
assert.strictEqual(value.running.max, 100);
value = tr.b.getOnlyElement(actual.getValuesNamed(
'v8-gc-total_idle_deadline_overrun'));
assert.strictEqual(value.running.sum, 0);
assert.strictEqual(value.average, 0);
assert.strictEqual(value.running.max, 0);
value = tr.b.getOnlyElement(actual.getValuesNamed(
'v8-gc-total_outside_idle'));
assert.strictEqual(value.running.sum, 180);
assert.strictEqual(value.average, 90);
assert.strictEqual(value.running.max, 100);
value = tr.b.getOnlyElement(actual.getValuesNamed(
'v8-gc-total_percentage_idle'));
assert.strictEqual(value.average, 0);
});
test('percentageInV8Execute', function() {
var values = new tr.v.ValueSet();
var slices = [
{
title: 'V8.Execute',
args: {}, start: 100, end: 200,
cpuStart: 100, cpuEnd: 200
},
{
title: 'V8.GCFinalizeMC', args: {}, start: 110, end: 190,
cpuStart: 110, cpuEnd: 190
},
{
title: 'V8.GCFinalizeMC', args: {}, start: 210, end: 220,
cpuStart: 210, cpuEnd: 220
}
];
var actual = run(slices);
var value = tr.b.getOnlyElement(actual.getValuesNamed(
'v8-gc-latency-mark-compactor_percentage_in_v8_execute'));
assert.strictEqual(value.average,
(190 - 110) / ((190 - 110) + (220 - 210)));
});
test('mutatorUtilization', function() {
var values = new tr.v.ValueSet();
var slices = [
{
title: 'V8.Execute', args: {}, start: 100, end: 200,
cpuStart: 100, cpuEnd: 200
},
{
title: 'V8.GCFinalizeMC', args: {}, start: 150, end: 160,
cpuStart: 150, cpuEnd: 160
},
{
title: 'V8.Execute', args: {}, start: 1000, end: 1200,
cpuStart: 1000, cpuEnd: 1200
},
{
title: 'V8.GCIncrementalMarking', args: {}, start: 1010, end: 1020,
cpuStart: 1010, cpuEnd: 1020
}
];
var mutatorUtilization = tr.metrics.v8.utils.mutatorUtilization(
0, 300, tr.metrics.v8.WINDOW_SIZE_MS,
[{start: 50, end: 60}, {start: 110, end: 120}]);
var actual = run(slices);
var value = tr.b.getOnlyElement(actual.getValuesNamed(
'v8-execute-mutator-utilization_pct_095'));
assert.closeTo(value.average,
mutatorUtilization.percentile(1 - 0.95), 1e-2);
value = tr.b.getOnlyElement(actual.getValuesNamed(
'v8-execute-mutator-utilization_pct_099'));
assert.closeTo(value.average,
mutatorUtilization.percentile(1 - 0.99), 1e-2);
});
});
</script>