[gnome-shell] Add a new hwtest script
- From: Owen Taylor <otaylor src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-shell] Add a new hwtest script
- Date: Wed, 16 Jul 2014 14:57:56 +0000 (UTC)
commit 4e56af39daac3acec0907ca130e5d244aaedc9c4
Author: Owen W. Taylor <otaylor fishsoup net>
Date: Thu Jun 5 15:18:25 2014 -0400
Add a new hwtest script
Add a performance test script that is used by the GNOME Hardware Testing
Project to measure metrics to be reported to perf.gnome.org.
https://bugzilla.gnome.org/show_bug.cgi?id=732350
js/js-resources.gresource.xml | 1 +
js/perf/hwtest.js | 310 +++++++++++++++++++++++++++++++++++++++++
2 files changed, 311 insertions(+), 0 deletions(-)
---
diff --git a/js/js-resources.gresource.xml b/js/js-resources.gresource.xml
index 32df2dd..ffef871 100644
--- a/js/js-resources.gresource.xml
+++ b/js/js-resources.gresource.xml
@@ -25,6 +25,7 @@
<file>misc/util.js</file>
<file>perf/core.js</file>
+ <file>perf/hwtest.js</file>
<file>portalHelper/main.js</file>
diff --git a/js/perf/hwtest.js b/js/perf/hwtest.js
new file mode 100644
index 0000000..1f0b181
--- /dev/null
+++ b/js/perf/hwtest.js
@@ -0,0 +1,310 @@
+const Clutter = imports.gi.Clutter;
+const Gio = imports.gi.Gio;
+const Gtk = imports.gi.Gtk;
+const Meta = imports.gi.Meta;
+const Main = imports.ui.main;
+const Scripting = imports.ui.scripting;
+const Shell = imports.gi.Shell;
+
+let METRICS = {
+ timeToDesktop:
+ { description: "Time from starting graphical.target to desktop showing",
+ units: "us" },
+
+ overviewShowTime:
+ { description: "Time to switch to overview view, first time",
+ units: "us" },
+
+ applicationsShowTime:
+ { description: "Time to switch to applications view, first time",
+ units: "us" },
+
+ mainViewRedrawTime:
+ { description: "Time to redraw the main view, full screen",
+ units: "us" },
+
+ overviewRedrawTime:
+ { description: "Time to redraw the overview, full screen, 5 windows",
+ units: "us" },
+
+ applicationRedrawTime:
+ { description: "Time to redraw frame with a maximized application update",
+ units: "us" },
+
+ geditStartTime:
+ { description: "Time from gedit launch to window drawn",
+ units: "us" },
+}
+
+function waitAndDraw(milliseconds) {
+ let cb;
+
+ let timeline = new Clutter.Timeline({ duration: milliseconds });
+ timeline.start();
+
+ timeline.connect('new-frame',
+ function(timeline, frame) {
+ global.stage.queue_redraw();
+ });
+
+ timeline.connect('completed',
+ function() {
+ timeline.stop();
+ if (cb)
+ cb();
+ });
+
+ return function(callback) {
+ cb = callback;
+ };
+}
+
+function waitSignal(object, signal) {
+ let cb;
+
+ let id = object.connect(signal, function() {
+ object.disconnect(id);
+ if (cb)
+ cb();
+ });
+
+ return function(callback) {
+ cb = callback;
+ };
+}
+
+function extractBootTimestamp() {
+ let sp = Gio.Subprocess.new(['journalctl', '-b',
+ 'MESSAGE_ID=7d4958e842da4a758f6c1cdc7b36dcc5',
+ 'UNIT=graphical.target',
+ '-o',
+ 'json-pretty'],
+ Gio.SubprocessFlags.STDOUT_PIPE);
+ let result = null;
+
+ let datastream = Gio.DataInputStream.new(sp.get_stdout_pipe());
+ while (true) {
+ let [line, length] = datastream.read_line_utf8(null);
+ if (line === null)
+ break;
+
+ let m = /.*"__MONOTONIC_TIMESTAMP".*"([0-9]+)"/.exec(line);
+ if (m) {
+ result = Number(m[1]);
+ }
+ }
+ datastream.close(null);
+ return result;
+}
+
+function run() {
+ Scripting.defineScriptEvent("desktopShown", "Finished initial animation");
+ Scripting.defineScriptEvent("overviewShowStart", "Starting to show the overview");
+ Scripting.defineScriptEvent("overviewShowDone", "Overview finished showing");
+ Scripting.defineScriptEvent("applicationsShowStart", "Starting to switch to applications view");
+ Scripting.defineScriptEvent("applicationsShowDone", "Done switching to applications view");
+ Scripting.defineScriptEvent("mainViewDrawStart", "Drawing main view");
+ Scripting.defineScriptEvent("mainViewDrawDone", "Ending timing main view drawing");
+ Scripting.defineScriptEvent("overviewDrawStart", "Drawing overview");
+ Scripting.defineScriptEvent("overviewDrawDone", "Ending timing overview drawing");
+ Scripting.defineScriptEvent("redrawTestStart", "Drawing application window");
+ Scripting.defineScriptEvent("redrawTestDone", "Ending timing application window drawing");
+ Scripting.defineScriptEvent("collectTimings", "Accumulate frame timings from redraw tests");
+ Scripting.defineScriptEvent("geditLaunch", "gedit application launch");
+ Scripting.defineScriptEvent("geditFirstFrame", "first frame of gedit window drawn");
+
+ yield Scripting.waitLeisure();
+ Scripting.scriptEvent('desktopShown');
+
+ Gtk.Settings.get_default().gtk_enable_animations = false;
+
+ Scripting.scriptEvent('overviewShowStart');
+ Main.overview.show();
+ yield Scripting.waitLeisure();
+ Scripting.scriptEvent('overviewShowDone');
+
+ yield Scripting.sleep(1000);
+
+ Scripting.scriptEvent('applicationsShowStart');
+ Main.overview._dash.showAppsButton.checked = true;
+
+ yield Scripting.waitLeisure();
+ Scripting.scriptEvent('applicationsShowDone');
+
+ yield Scripting.sleep(1000);
+
+ Main.overview.hide();
+ yield Scripting.waitLeisure();
+
+ ////////////////////////////////////////
+ // Tests of redraw speed
+ ////////////////////////////////////////
+
+ global.frame_timestamps = true;
+ global.frame_finish_timestamp = true;
+
+ for (let k = 0; k < 5; k++)
+ yield Scripting.createTestWindow(640, 480,
+ { maximized: true });
+ yield Scripting.waitTestWindows();
+
+ yield Scripting.sleep(1000);
+
+ Scripting.scriptEvent('mainViewDrawStart');
+ yield waitAndDraw(1000);
+ Scripting.scriptEvent('mainViewDrawDone');
+
+ Main.overview.show();
+ Scripting.waitLeisure();
+
+ yield Scripting.sleep(1500);
+
+ Scripting.scriptEvent('overviewDrawStart');
+ yield waitAndDraw(1000);
+ Scripting.scriptEvent('overviewDrawDone');
+
+ yield Scripting.destroyTestWindows();
+ Main.overview.hide();
+
+ yield Scripting.createTestWindow(640, 480,
+ { maximized: true,
+ redraws: true});
+ yield Scripting.waitTestWindows();
+
+ yield Scripting.sleep(1000);
+
+ Scripting.scriptEvent('redrawTestStart');
+ yield Scripting.sleep(1000);
+ Scripting.scriptEvent('redrawTestDone');
+
+ yield Scripting.sleep(1000);
+ Scripting.scriptEvent('collectTimings');
+
+ yield Scripting.destroyTestWindows();
+
+ global.frame_timestamps = false;
+ global.frame_finish_timestamp = false;
+
+ yield Scripting.sleep(1000);
+
+ ////////////////////////////////////////
+
+ let appSys = Shell.AppSystem.get_default();
+ let app = appSys.lookup_app('gedit.desktop');
+
+ Scripting.scriptEvent('geditLaunch');
+ app.activate();
+
+ let windows = app.get_windows();
+ if (windows.length > 0)
+ throw new Error('gedit was already running');
+
+ while (windows.length == 0) {
+ yield waitSignal(global.display, 'window-created');
+ windows = app.get_windows();
+ }
+
+ let actor = windows[0].get_compositor_private();
+ yield waitSignal(actor, 'first-frame');
+ Scripting.scriptEvent('geditFirstFrame');
+
+ yield Scripting.sleep(1000);
+
+ windows[0].delete(global.get_current_time());
+
+ yield Scripting.sleep(1000);
+
+ Gtk.Settings.get_default().gtk_enable_animations = true;
+}
+
+let overviewShowStart;
+let applicationsShowStart;
+let stagePaintStart;
+let redrawTiming;
+let redrawTimes = {};
+let geditLaunchTime;
+
+function script_desktopShown(time) {
+ let bootTimestamp = extractBootTimestamp();
+ METRICS.timeToDesktop.value = time - bootTimestamp;
+}
+
+function script_overviewShowStart(time) {
+ overviewShowStart = time;
+}
+
+function script_overviewShowDone(time) {
+ METRICS.overviewShowTime.value = time - overviewShowStart;
+}
+
+function script_applicationsShowStart(time) {
+ applicationsShowStart = time;
+}
+
+function script_applicationsShowDone(time) {
+ METRICS.applicationsShowTime.value = time - applicationsShowStart;
+}
+
+function script_mainViewDrawStart(time) {
+ redrawTiming = 'mainView';
+}
+
+function script_mainViewDrawDone(time) {
+ redrawTiming = null;
+}
+
+function script_overviewDrawStart(time) {
+ redrawTiming = 'overview';
+}
+
+function script_overviewDrawDone(time) {
+ redrawTiming = null;
+}
+
+function script_redrawTestStart(time) {
+ redrawTiming = 'application';
+}
+
+function script_redrawTestDone(time) {
+ redrawTiming = null;
+}
+
+function script_collectTimings(time) {
+ for (let timing in redrawTimes) {
+ let times = redrawTimes[timing];
+ times.sort();
+
+ let len = times.length;
+ let median;
+
+ if (len == 0)
+ median = -1;
+ else if (len % 2 == 1)
+ median = times[(len - 1)/ 2];
+ else
+ median = Math.round((times[len / 2 - 1] + times[len / 2]) / 2);
+
+ METRICS[timing + 'RedrawTime'].value = median;
+ }
+}
+
+function script_geditLaunch(time) {
+ geditLaunchTime = time;
+}
+
+function script_geditFirstFrame(time) {
+ METRICS.geditStartTime.value = time - geditLaunchTime;
+}
+
+function clutter_stagePaintStart(time) {
+ stagePaintStart = time;
+}
+
+function clutter_paintCompletedTimestamp(time) {
+ if (redrawTiming != null && stagePaintStart != null) {
+ if (!(redrawTiming in redrawTimes))
+ redrawTimes[redrawTiming] = [];
+ redrawTimes[redrawTiming].push(time - stagePaintStart);
+ }
+ stagePaintStart = null;
+}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]