aboutsummaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorRefael Ackermann <refack@gmail.com>2019-04-23 10:13:17 -0400
committerRefael Ackermann <refack@gmail.com>2019-06-06 18:44:21 -0400
commit546d6cdd9e70a9e25b3c43e88d3acac875a478f8 (patch)
tree96d5dde37b0269097eb11763b524655511f83037 /test
parenta8277ddb5505056e3d66d02051c9195310c5c715 (diff)
downloadandroid-node-v8-546d6cdd9e70a9e25b3c43e88d3acac875a478f8.tar.gz
android-node-v8-546d6cdd9e70a9e25b3c43e88d3acac875a478f8.tar.bz2
android-node-v8-546d6cdd9e70a9e25b3c43e88d3acac875a478f8.zip
test,v8: skip less and stabilize test-linux-perf.js
Co-authored-by: Matheus Marchini <mat@mmarchini.me> PR-URL: https://github.com/nodejs/node/pull/27364 Refs: https://github.com/nodejs/build/issues/1774 Reviewed-By: Matheus Marchini <mat@mmarchini.me> Reviewed-By: Ruben Bridgewater <ruben@bridgewater.de>
Diffstat (limited to 'test')
-rw-r--r--test/fixtures/linux-perf.js27
-rw-r--r--test/v8-updates/test-linux-perf.js73
2 files changed, 61 insertions, 39 deletions
diff --git a/test/fixtures/linux-perf.js b/test/fixtures/linux-perf.js
index 011ef19777..90ea2f2e33 100644
--- a/test/fixtures/linux-perf.js
+++ b/test/fixtures/linux-perf.js
@@ -1,26 +1,17 @@
'use strict';
-const crypto = require('crypto');
+const { spawnSync } = require("child_process");
+const sleepTime = new Number(process.argv[2] || "0.1");
+const repeat = new Number(process.argv[3]) || 5;
-// Functions should be complex enough for V8 to run them a few times before
-// compiling, but not complex enough to always stay in interpreted mode. They
-// should also take some time to run, otherwise Linux perf might miss them
-// entirely even when sampling at a high frequency.
-function functionOne(i) {
- for (let j=i; j > 0; j--) {
- crypto.createHash('md5').update(functionTwo(i, j)).digest("hex");
- }
+function functionOne() {
+ functionTwo();
}
-function functionTwo(x, y) {
- let data = ((((x * y) + (x / y)) * y) ** (x + 1)).toString();
- if (x % 2 == 0) {
- return crypto.createHash('md5').update(data.repeat((x % 100) + 1)).digest("hex");
- } else {
- return crypto.createHash('md5').update(data.repeat((y % 100) + 1)).digest("hex");
- }
+function functionTwo() {
+ spawnSync('sleep', [`${sleepTime}`]);
}
-for (let i = 0; i < 1000; i++) {
- functionOne(i);
+for (let i = 0; i < repeat; i++) {
+ functionOne();
}
diff --git a/test/v8-updates/test-linux-perf.js b/test/v8-updates/test-linux-perf.js
index 40823b8e8b..01ebce0ae5 100644
--- a/test/v8-updates/test-linux-perf.js
+++ b/test/v8-updates/test-linux-perf.js
@@ -22,16 +22,53 @@ tmpdir.refresh();
if (process.config.variables.node_shared)
common.skip("can't test Linux perf with shared libraries yet");
-const perfArgs = [
+if (!common.isLinux)
+ common.skip('only testing Linux for now');
+
+const frequency = 99;
+
+const repeat = 5;
+
+// Expected number of samples we'll capture per repeat
+const sampleCount = 10;
+const sleepTime = sampleCount * (1.0 / frequency);
+
+const perfFlags = [
'record',
- '-F999',
+ `-F${frequency}`,
'-g',
- '--',
- process.execPath,
+];
+
+const nodeCommonFlags = [
'--perf-basic-prof',
'--interpreted-frames-native-stack',
'--no-turbo-inlining', // Otherwise simple functions might get inlined.
+];
+
+const perfInterpretedFramesArgs = [
+ ...perfFlags,
+ '--',
+ process.execPath,
+ ...nodeCommonFlags,
+ '--no-opt',
fixtures.path('linux-perf.js'),
+ `${sleepTime}`,
+ `${repeat}`,
+];
+
+const perfCompiledFramesArgs = [
+ ...perfFlags,
+ '--',
+ process.execPath,
+ ...nodeCommonFlags,
+ '--always-opt',
+ fixtures.path('linux-perf.js'),
+ `${sleepTime}`,
+ `${repeat}`,
+];
+
+const perfArgsList = [
+ perfInterpretedFramesArgs, perfCompiledFramesArgs
];
const perfScriptArgs = [
@@ -43,25 +80,20 @@ const options = {
encoding: 'utf-8',
};
-if (!common.isLinux)
- common.skip('only testing Linux for now');
-
-const perf = spawnSync('perf', perfArgs, options);
-
-if (perf.error && perf.error.errno === 'ENOENT')
- common.skip('perf not found on system');
-
-if (perf.status !== 0) {
- common.skip(`Failed to execute perf: ${perf.stderr}`);
-}
+let output = '';
-const perfScript = spawnSync('perf', perfScriptArgs, options);
+for (const perfArgs of perfArgsList) {
+ const perf = spawnSync('perf', perfArgs, options);
+ assert.ifError(perf.error);
+ if (perf.status !== 0)
+ throw new Error(`Failed to execute 'perf': ${perf.stderr}`);
-if (perf.error)
- common.skip(`perf script aborted: ${perf.error.errno}`);
+ const perfScript = spawnSync('perf', perfScriptArgs, options);
+ assert.ifError(perfScript.error);
+ if (perfScript.status !== 0)
+ throw new Error(`Failed to execute perf script: ${perfScript.stderr}`);
-if (perfScript.status !== 0) {
- common.skip(`Failed to execute perf script: ${perfScript.stderr}`);
+ output += perfScript.stdout;
}
const interpretedFunctionOneRe = /InterpretedFunction:functionOne/;
@@ -69,7 +101,6 @@ const compiledFunctionOneRe = /LazyCompile:\*functionOne/;
const interpretedFunctionTwoRe = /InterpretedFunction:functionTwo/;
const compiledFunctionTwoRe = /LazyCompile:\*functionTwo/;
-const output = perfScript.stdout;
assert.ok(output.match(interpretedFunctionOneRe),
"Couldn't find interpreted functionOne()");