timers: optimize timer functions with improved argument handling

PR-URL: https://github.com/nodejs/node/pull/57072
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Yagiz Nizipli <yagiz@nizipli.com>
Reviewed-By: Ruben Bridgewater <ruben@bridgewater.de>
Reviewed-By: Chemi Atlow <chemi@atlow.co.il>
Reviewed-By: Gerhard Stöbich <deb2001-github@yahoo.de>
Reviewed-By: Luigi Pinca <luigipinca@gmail.com>
This commit is contained in:
Gürgün Dayıoğlu 2025-03-24 21:30:52 +01:00 committed by Antoine du Hamel
parent 595e9e5ad6
commit 8f7debcf41
No known key found for this signature in database
GPG Key ID: 21D900FFDB233756
1 changed files with 9 additions and 83 deletions

View File

@ -22,7 +22,6 @@
'use strict';
const {
ArrayPrototypePush,
MathTrunc,
ObjectDefineProperties,
ObjectDefineProperty,
@ -131,38 +130,13 @@ function enroll(item, msecs) {
* after `after` milliseconds.
* @param {Function} callback
* @param {number} [after]
* @param {any} [arg1]
* @param {any} [arg2]
* @param {any} [arg3]
* @param {...any} [args]
* @returns {Timeout}
*/
function setTimeout(callback, after, arg1, arg2, arg3) {
function setTimeout(callback, after, ...args) {
validateFunction(callback, 'callback');
let i, args;
switch (arguments.length) {
// fast cases
case 1:
case 2:
break;
case 3:
args = [arg1];
break;
case 4:
args = [arg1, arg2];
break;
default:
args = [arg1, arg2, arg3];
for (i = 5; i < arguments.length; i++) {
// Extend array dynamically, makes .apply run much faster in v6.0.0
ArrayPrototypePush(args, arguments[i]);
}
break;
}
const timeout = new Timeout(callback, after, args, false, true);
const timeout = new Timeout(callback, after, args.length ? args : undefined, false, true);
insert(timeout, timeout._idleTimeout);
return timeout;
}
@ -200,38 +174,13 @@ function clearTimeout(timer) {
* every `repeat` milliseconds.
* @param {Function} callback
* @param {number} [repeat]
* @param {any} [arg1]
* @param {any} [arg2]
* @param {any} [arg3]
* @param {...any} [args]
* @returns {Timeout}
*/
function setInterval(callback, repeat, arg1, arg2, arg3) {
function setInterval(callback, repeat, ...args) {
validateFunction(callback, 'callback');
let i, args;
switch (arguments.length) {
// fast cases
case 1:
case 2:
break;
case 3:
args = [arg1];
break;
case 4:
args = [arg1, arg2];
break;
default:
args = [arg1, arg2, arg3];
for (i = 5; i < arguments.length; i++) {
// Extend array dynamically, makes .apply run much faster in v6.0.0
ArrayPrototypePush(args, arguments[i]);
}
break;
}
const timeout = new Timeout(callback, repeat, args, true, true);
const timeout = new Timeout(callback, repeat, args.length ? args : undefined, true, true);
insert(timeout, timeout._idleTimeout);
return timeout;
}
@ -273,35 +222,12 @@ Timeout.prototype[SymbolToPrimitive] = function() {
* Schedules the immediate execution of `callback`
* after I/O events' callbacks.
* @param {Function} callback
* @param {any} [arg1]
* @param {any} [arg2]
* @param {any} [arg3]
* @param {...any} [args]
* @returns {Immediate}
*/
function setImmediate(callback, arg1, arg2, arg3) {
function setImmediate(callback, ...args) {
validateFunction(callback, 'callback');
let i, args;
switch (arguments.length) {
// fast cases
case 1:
break;
case 2:
args = [arg1];
break;
case 3:
args = [arg1, arg2];
break;
default:
args = [arg1, arg2, arg3];
for (i = 4; i < arguments.length; i++) {
// Extend array dynamically, makes .apply run much faster in v6.0.0
ArrayPrototypePush(args, arguments[i]);
}
break;
}
return new Immediate(callback, args);
return new Immediate(callback, args.length ? args : undefined);
}
ObjectDefineProperty(setImmediate, customPromisify, {