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:
parent
9741291fe9
commit
e0835c9cda
86
src/node.js
86
src/node.js
@ -340,52 +340,59 @@
|
|||||||
function _tickCallback() {
|
function _tickCallback() {
|
||||||
var callback, threw, tock;
|
var callback, threw, tock;
|
||||||
|
|
||||||
scheduleMicrotasks();
|
do {
|
||||||
|
while (tickInfo[kIndex] < tickInfo[kLength]) {
|
||||||
while (tickInfo[kIndex] < tickInfo[kLength]) {
|
tock = nextTickQueue[tickInfo[kIndex]++];
|
||||||
tock = nextTickQueue[tickInfo[kIndex]++];
|
callback = tock.callback;
|
||||||
callback = tock.callback;
|
threw = true;
|
||||||
threw = true;
|
try {
|
||||||
try {
|
callback();
|
||||||
callback();
|
threw = false;
|
||||||
threw = false;
|
} finally {
|
||||||
} finally {
|
if (threw)
|
||||||
if (threw)
|
tickDone();
|
||||||
|
}
|
||||||
|
if (1e4 < tickInfo[kIndex])
|
||||||
tickDone();
|
tickDone();
|
||||||
}
|
}
|
||||||
if (1e4 < tickInfo[kIndex])
|
tickDone();
|
||||||
tickDone();
|
_runMicrotasks();
|
||||||
}
|
emitPendingUnhandledRejections();
|
||||||
|
} while (tickInfo[kLength] !== 0);
|
||||||
tickDone();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function _tickDomainCallback() {
|
function _tickDomainCallback() {
|
||||||
var callback, domain, threw, tock;
|
var callback, domain, threw, tock;
|
||||||
|
|
||||||
scheduleMicrotasks();
|
do {
|
||||||
|
while (tickInfo[kIndex] < tickInfo[kLength]) {
|
||||||
while (tickInfo[kIndex] < tickInfo[kLength]) {
|
tock = nextTickQueue[tickInfo[kIndex]++];
|
||||||
tock = nextTickQueue[tickInfo[kIndex]++];
|
callback = tock.callback;
|
||||||
callback = tock.callback;
|
domain = tock.domain;
|
||||||
domain = tock.domain;
|
if (domain)
|
||||||
if (domain)
|
domain.enter();
|
||||||
domain.enter();
|
threw = true;
|
||||||
threw = true;
|
try {
|
||||||
try {
|
callback();
|
||||||
callback();
|
threw = false;
|
||||||
threw = false;
|
} finally {
|
||||||
} finally {
|
if (threw)
|
||||||
if (threw)
|
tickDone();
|
||||||
|
}
|
||||||
|
if (1e4 < tickInfo[kIndex])
|
||||||
tickDone();
|
tickDone();
|
||||||
|
if (domain)
|
||||||
|
domain.exit();
|
||||||
}
|
}
|
||||||
if (1e4 < tickInfo[kIndex])
|
tickDone();
|
||||||
tickDone();
|
_runMicrotasks();
|
||||||
if (domain)
|
emitPendingUnhandledRejections();
|
||||||
domain.exit();
|
} while (tickInfo[kLength] !== 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
tickDone();
|
function TickObject(c) {
|
||||||
|
this.callback = c;
|
||||||
|
this.domain = process.domain || null;
|
||||||
}
|
}
|
||||||
|
|
||||||
function nextTick(callback) {
|
function nextTick(callback) {
|
||||||
@ -393,12 +400,7 @@
|
|||||||
if (process._exiting)
|
if (process._exiting)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
var obj = {
|
nextTickQueue.push(new TickObject(callback));
|
||||||
callback: callback,
|
|
||||||
domain: process.domain || null
|
|
||||||
};
|
|
||||||
|
|
||||||
nextTickQueue.push(obj);
|
|
||||||
tickInfo[kLength]++;
|
tickInfo[kLength]++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -8,5 +8,5 @@ setTimeout(function() {
|
|||||||
var ms = (hr[0] * 1e3) + (hr[1] / 1e6);
|
var ms = (hr[0] * 1e3) + (hr[1] / 1e6);
|
||||||
var delta = ms - TIMEOUT;
|
var delta = ms - TIMEOUT;
|
||||||
console.log('timer fired in', delta);
|
console.log('timer fired in', delta);
|
||||||
assert.ok(delta > 0, 'Timer fired early');
|
assert.ok(delta > -0.5, 'Timer fired early');
|
||||||
}, TIMEOUT);
|
}, TIMEOUT);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user