node: improve performance of nextTick

Couple micro optimizations to improve performance of process.nextTick().
Removes ~60ns of execution time.

Also added small threshold to test that allows timer to fire early on
the order if microseconds.

PR-URL: https://github.com/iojs/io.js/pull/985
Reviewed-By: Vladimir Kurchatkin <vladimir.kurchatkin@gmail.com>
This commit is contained in:
Trevor Norris 2015-02-26 22:41:54 -07:00
parent 9741291fe9
commit e0835c9cda
2 changed files with 45 additions and 43 deletions

View File

@ -340,8 +340,7 @@
function _tickCallback() {
var callback, threw, tock;
scheduleMicrotasks();
do {
while (tickInfo[kIndex] < tickInfo[kLength]) {
tock = nextTickQueue[tickInfo[kIndex]++];
callback = tock.callback;
@ -356,15 +355,16 @@
if (1e4 < tickInfo[kIndex])
tickDone();
}
tickDone();
_runMicrotasks();
emitPendingUnhandledRejections();
} while (tickInfo[kLength] !== 0);
}
function _tickDomainCallback() {
var callback, domain, threw, tock;
scheduleMicrotasks();
do {
while (tickInfo[kIndex] < tickInfo[kLength]) {
tock = nextTickQueue[tickInfo[kIndex]++];
callback = tock.callback;
@ -384,8 +384,15 @@
if (domain)
domain.exit();
}
tickDone();
_runMicrotasks();
emitPendingUnhandledRejections();
} while (tickInfo[kLength] !== 0);
}
function TickObject(c) {
this.callback = c;
this.domain = process.domain || null;
}
function nextTick(callback) {
@ -393,12 +400,7 @@
if (process._exiting)
return;
var obj = {
callback: callback,
domain: process.domain || null
};
nextTickQueue.push(obj);
nextTickQueue.push(new TickObject(callback));
tickInfo[kLength]++;
}

View File

@ -8,5 +8,5 @@ setTimeout(function() {
var ms = (hr[0] * 1e3) + (hr[1] / 1e6);
var delta = ms - TIMEOUT;
console.log('timer fired in', delta);
assert.ok(delta > 0, 'Timer fired early');
assert.ok(delta > -0.5, 'Timer fired early');
}, TIMEOUT);