aboutsummaryrefslogtreecommitdiff
path: root/test/parallel
diff options
context:
space:
mode:
authorJames M Snell <jasnell@gmail.com>2018-02-14 11:06:32 -0800
committerJames M Snell <jasnell@gmail.com>2018-02-26 13:55:33 -0800
commit9e509b622bbdc14b7153d006f57043f268017138 (patch)
tree0a01cc2665342046c8c198bdff76eed869263978 /test/parallel
parentaca8e764da444a9a5eb67812db2317c1c32215d9 (diff)
downloadandroid-node-v8-9e509b622bbdc14b7153d006f57043f268017138.tar.gz
android-node-v8-9e509b622bbdc14b7153d006f57043f268017138.tar.bz2
android-node-v8-9e509b622bbdc14b7153d006f57043f268017138.zip
perf_hooks: emit trace events for marks, measures, and timerify
Adds the `node.perf.usertiming` trace events category for recording usertiming marks and measures (e.g. `perf_hooks.performance.mark()`) in the trace events timeline. Adds the `node.perf.function` trace events category for recording `perf_hooks.performance.timerify()` durations in the trace events timeline. PR-URL: https://github.com/nodejs/node/pull/18789 Reviewed-By: Ali Ijaz Sheikh <ofrobots@google.com> Reviewed-By: Matteo Collina <matteo.collina@gmail.com>
Diffstat (limited to 'test/parallel')
-rw-r--r--test/parallel/test-trace-events-perf.js82
1 files changed, 82 insertions, 0 deletions
diff --git a/test/parallel/test-trace-events-perf.js b/test/parallel/test-trace-events-perf.js
new file mode 100644
index 0000000000..e73579f87e
--- /dev/null
+++ b/test/parallel/test-trace-events-perf.js
@@ -0,0 +1,82 @@
+'use strict';
+const common = require('../common');
+const assert = require('assert');
+const cp = require('child_process');
+const path = require('path');
+const fs = require('fs');
+const tmpdir = require('../common/tmpdir');
+
+if (process.argv[2] === 'child') {
+ const { performance } = require('perf_hooks');
+
+ // Will emit mark and measure trace events
+ performance.mark('A');
+ setTimeout(() => {
+ performance.mark('B');
+ performance.measure('A to B', 'A', 'B');
+ }, 1);
+
+ // Intentional non-op, part of the test
+ function f() {}
+ const ff = performance.timerify(f);
+ ff(); // Will emit a timerify trace event
+} else {
+ tmpdir.refresh();
+ process.chdir(tmpdir.path);
+
+ const expectedMarks = ['A', 'B'];
+ const expectedBegins = [
+ { cat: 'node.perf,node.perf.timerify', name: 'f' },
+ { cat: 'node.perf,node.perf.usertiming', name: 'A to B' }
+ ];
+ const expectedEnds = [
+ { cat: 'node.perf,node.perf.timerify', name: 'f' },
+ { cat: 'node.perf,node.perf.usertiming', name: 'A to B' }
+ ];
+
+ const proc = cp.fork(__filename,
+ [
+ 'child'
+ ], {
+ execArgv: [
+ '--trace-events-enabled',
+ '--trace-event-categories',
+ 'node.perf'
+ ]
+ });
+
+ proc.once('exit', common.mustCall(() => {
+ const file = path.join(tmpdir.path, 'node_trace.1.log');
+
+ assert(common.fileExists(file));
+ fs.readFile(file, common.mustCall((err, data) => {
+ const traces = JSON.parse(data.toString()).traceEvents;
+ assert.strictEqual(traces.length,
+ expectedMarks.length +
+ expectedBegins.length +
+ expectedEnds.length);
+
+ traces.forEach((trace) => {
+ assert.strictEqual(trace.pid, proc.pid);
+ switch (trace.ph) {
+ case 'R':
+ assert.strictEqual(trace.cat, 'node.perf,node.perf.usertiming');
+ assert.strictEqual(trace.name, expectedMarks.shift());
+ break;
+ case 'b':
+ const expectedBegin = expectedBegins.shift();
+ assert.strictEqual(trace.cat, expectedBegin.cat);
+ assert.strictEqual(trace.name, expectedBegin.name);
+ break;
+ case 'e':
+ const expectedEnd = expectedEnds.shift();
+ assert.strictEqual(trace.cat, expectedEnd.cat);
+ assert.strictEqual(trace.name, expectedEnd.name);
+ break;
+ default:
+ assert.fail('Unexpected trace event phase');
+ }
+ });
+ }));
+ }));
+}