In cases where libraries create AsyncResources which may be emitting more events depending on usage, the only way to ensure that destroy is called properly is by calling it when the resource gets garbage collected. Fixes: https://github.com/nodejs/node/issues/16153 PR-URL: https://github.com/nodejs/node/pull/16998 Fixes: https://github.com/nodejs/node/issues/16153 Reviewed-By: Andreas Madsen <amwebdk@gmail.com> Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: James M Snell <jasnell@gmail.com>
46 lines
881 B
JavaScript
46 lines
881 B
JavaScript
'use strict';
|
|
const common = require('../common.js');
|
|
const { AsyncResource } = require('async_hooks');
|
|
|
|
const bench = common.createBenchmark(main, {
|
|
n: [1e6],
|
|
method: [
|
|
'trackingEnabled',
|
|
'trackingDisabled',
|
|
]
|
|
}, {
|
|
flags: ['--expose-gc']
|
|
});
|
|
|
|
function endAfterGC(n) {
|
|
setImmediate(() => {
|
|
global.gc();
|
|
setImmediate(() => {
|
|
bench.end(n);
|
|
});
|
|
});
|
|
}
|
|
|
|
function main(conf) {
|
|
const n = +conf.n;
|
|
|
|
switch (conf.method) {
|
|
case 'trackingEnabled':
|
|
bench.start();
|
|
for (let i = 0; i < n; i++) {
|
|
new AsyncResource('foobar');
|
|
}
|
|
endAfterGC(n);
|
|
break;
|
|
case 'trackingDisabled':
|
|
bench.start();
|
|
for (let i = 0; i < n; i++) {
|
|
new AsyncResource('foobar', { requireManualDestroy: true });
|
|
}
|
|
endAfterGC(n);
|
|
break;
|
|
default:
|
|
throw new Error('Unsupported method');
|
|
}
|
|
}
|