Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
112 changes: 66 additions & 46 deletions test/sequential/test-performance-eventloopdelay.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@

const common = require('../common');
const assert = require('assert');
const os = require('os');
const {
monitorEventLoopDelay,
} = require('perf_hooks');
Expand Down Expand Up @@ -52,59 +51,80 @@ const { sleep } = require('internal/util');
}

{
const s390x = os.arch() === 's390x';
const histogram = monitorEventLoopDelay({ resolution: 1 });
histogram.enable();
let m = 5;
if (s390x) {
m = m * 2;

// Check if histogram has recorded valid samples (min > 0 indicates real delays measured)
function hasValidSamples() {
return histogram.count > 0 && histogram.min > 0 && histogram.max > 0;
}

// Final assertions - call this when ready to verify histogram values
function runAssertions() {
setImmediate(common.mustCall(() => {
histogram.disable();
// The values are non-deterministic, so we just check that a value is
// present, as opposed to a specific value.
assert(histogram.count > 0, `Expected samples to be recorded, got count=${histogram.count}`);
assert(histogram.min > 0, `Expected min > 0, got ${histogram.min}`);
assert(histogram.max > 0);
assert(histogram.stddev > 0);
assert(histogram.mean > 0);
assert(histogram.percentiles.size > 0);
for (let n = 1; n < 100; n = n + 0.1) {
assert(histogram.percentile(n) >= 0);
}
histogram.reset();
assert.strictEqual(histogram.min, 9223372036854776000);
assert.strictEqual(histogram.max, 0);
assert(Number.isNaN(histogram.stddev));
assert(Number.isNaN(histogram.mean));
assert.strictEqual(histogram.percentiles.size, 1);

['a', false, {}, []].forEach((i) => {
assert.throws(
() => histogram.percentile(i),
{
name: 'TypeError',
code: 'ERR_INVALID_ARG_TYPE',
}
);
});
[-1, 0, 101, NaN].forEach((i) => {
assert.throws(
() => histogram.percentile(i),
{
name: 'RangeError',
code: 'ERR_OUT_OF_RANGE',
}
);
});
}));
}

// Spin the event loop with blocking work to generate measurable delays.
// Some configurations (s390x, sharedlibs) need more iterations.
let spinsRemaining = 5;
const maxRetries = 3;
let retries = 0;

function spinAWhile() {
sleep(1000);
if (--m > 0) {
if (--spinsRemaining > 0) {
setTimeout(spinAWhile, common.platformTimeout(500));
} else {
// Give the histogram a chance to record final samples before disabling.
// This helps on slower systems where sampling may be delayed.
setImmediate(common.mustCall(() => {
histogram.disable();
// The values are non-deterministic, so we just check that a value is
// present, as opposed to a specific value.
assert(histogram.count > 0, `Expected samples to be recorded, got count=${histogram.count}`);
assert(histogram.min > 0);
assert(histogram.max > 0);
assert(histogram.stddev > 0);
assert(histogram.mean > 0);
assert(histogram.percentiles.size > 0);
for (let n = 1; n < 100; n = n + 0.1) {
assert(histogram.percentile(n) >= 0);
// Give the histogram a chance to record final samples before checking.
setImmediate(() => {
// If we have valid samples or exhausted retries, run assertions.
// Otherwise retry with more spinning for slower configurations.
if (hasValidSamples() || retries >= maxRetries) {
runAssertions();
} else {
retries++;
spinsRemaining = 5;
setTimeout(spinAWhile, common.platformTimeout(500));
}
histogram.reset();
assert.strictEqual(histogram.min, 9223372036854776000);
assert.strictEqual(histogram.max, 0);
assert(Number.isNaN(histogram.stddev));
assert(Number.isNaN(histogram.mean));
assert.strictEqual(histogram.percentiles.size, 1);

['a', false, {}, []].forEach((i) => {
assert.throws(
() => histogram.percentile(i),
{
name: 'TypeError',
code: 'ERR_INVALID_ARG_TYPE',
}
);
});
[-1, 0, 101, NaN].forEach((i) => {
assert.throws(
() => histogram.percentile(i),
{
name: 'RangeError',
code: 'ERR_OUT_OF_RANGE',
}
);
});
}));
});
}
}
spinAWhile();
Expand Down
Loading