08b8b39a5d
Add some basic statistics for allocated memory based on mallinfo(), and use that to define two metrics: usedAfterOverview: bytes used after the overview is shown once leakedAfterOverview: additional bytes used when the overview is shown a second time. https://bugzilla.gnome.org/show_bug.cgi?id=618189
94 lines
2.8 KiB
JavaScript
94 lines
2.8 KiB
JavaScript
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
|
|
|
|
const Main = imports.ui.main;
|
|
const Scripting = imports.ui.scripting;
|
|
|
|
// This performance script measure the most important (core) performance
|
|
// metrics for the shell. By looking at the output metrics of this script
|
|
// someone should be able to get an idea of how well the shell is performing
|
|
// on a particular system.
|
|
|
|
let METRIC_DESCRIPTIONS = {
|
|
overviewLatencyFirst: "Time to first frame after triggering overview, first time",
|
|
overviewFramesFirst: "Frames displayed when going to overview, first time",
|
|
overviewLatencySubsequent: "Time to first frame after triggering overview, second time",
|
|
overviewFramesSubsequent: "Frames displayed when going to overview, second time",
|
|
usedAfterOverview: "Malloc'ed bytes after the overview is shown once",
|
|
leakedAfterOverview: "Additional malloc'ed bytes the second time the overview is shown"
|
|
};
|
|
|
|
let METRICS = {
|
|
};
|
|
|
|
function run() {
|
|
Scripting.defineScriptEvent("overviewShowStart", "Starting to show the overview");
|
|
Scripting.defineScriptEvent("overviewShowDone", "Overview finished showing");
|
|
Scripting.defineScriptEvent("afterShowHide", "After a show/hide cycle for the overview");
|
|
|
|
yield Scripting.sleep(1000);
|
|
yield Scripting.waitLeisure();
|
|
for (let i = 0; i < 2; i++) {
|
|
Scripting.scriptEvent('overviewShowStart');
|
|
Main.overview.show();
|
|
yield Scripting.waitLeisure();
|
|
Scripting.scriptEvent('overviewShowDone');
|
|
|
|
Main.overview.hide();
|
|
yield Scripting.waitLeisure();
|
|
|
|
global.gc();
|
|
yield Scripting.sleep(1000);
|
|
Scripting.collectStatistics();
|
|
Scripting.scriptEvent('afterShowHide');
|
|
}
|
|
}
|
|
|
|
let showingOverview = false;
|
|
let overviewShowStart;
|
|
let overviewFrames;
|
|
let overviewLatency;
|
|
let mallocUsedSize = 0;
|
|
let overviewShowCount = 0;
|
|
let firstOverviewUsedSize;
|
|
|
|
function script_overviewShowStart(time) {
|
|
showingOverview = true;
|
|
overviewShowStart = time;
|
|
overviewFrames = 0;
|
|
}
|
|
|
|
function script_overviewShowDone(time) {
|
|
showingOverview = false;
|
|
|
|
overviewShowCount++;
|
|
|
|
if (overviewShowCount == 1) {
|
|
METRICS.overviewLatencyFirst = overviewLatency;
|
|
METRICS.overviewFramesFirst = overviewFrames;
|
|
} else {
|
|
METRICS.overviewLatencySubsequent = overviewLatency;
|
|
METRICS.overviewFramesSubsequent = overviewFrames;
|
|
}
|
|
}
|
|
|
|
function script_afterShowHide(time) {
|
|
if (overviewShowCount == 1) {
|
|
METRICS.usedAfterOverview = mallocUsedSize;
|
|
} else {
|
|
METRICS.leakedAfterOverview = mallocUsedSize - METRICS.usedAfterOverview;
|
|
}
|
|
}
|
|
|
|
function malloc_usedSize(time, bytes) {
|
|
mallocUsedSize = bytes;
|
|
}
|
|
|
|
function clutter_stagePaintDone(time) {
|
|
if (showingOverview) {
|
|
if (overviewFrames == 0)
|
|
overviewLatency = time - overviewShowStart;
|
|
|
|
overviewFrames++;
|
|
}
|
|
}
|