setInterval定时器有效率更好一点的替代方法嘛?
发布于 2年前 作者 mercurylanded 1970 次浏览
13 回复

setInterval 效率很差么? 不过我一般喜欢用 setTimeout 自己去递归…

真巧,晚上刚翻译完Node.js高级编程第六章,讲的就是setInterval和setTimeout,不知道你说的“效率更好”指的什么,作者用setInterval代替setTimeout的目的是为了确保回调函数的串行执行,估计1楼neuront用setTimeout递归替代setInterval就是这个目的。,可以去看看第六章pdf的倒数第2页,不知道对你有用没。

貌似看到过说 setTimout 即便指定 0 也有几十毫秒才触发, 不知道 process.nextTick 性能会不能高一点

《node.js高级编程》上说process.nextTick会快不少,因为nextTick基于事件循环,而setTimeout基于JavaScript运行时内部的事件队列。

nodejs 是单进程的,所以callback的执行一定有延迟。 如果对时间要求很高(RTOS),nodejs 就不是一个很适合的工具。

毫秒数参数的有效范围是 1~0x7FFFFFFF, 不在这个范围内都会被置为 1.

另外, setTimeout 不是一个 Javascript 版的 Thread.sleep 函数. 它将无参函数加入事件队列, 并在至少 X 毫秒后执行. js 是单线程的, 因此在设定的时间如果有其它函数还在运作那么被设定延迟执行的函数只能等待了.

@JackYao setTimeout(callback,0) 我一直不是很面白,在什么时候情况下这样用。

@hades 一个过程优先级不很高, 但是又可能占用太长时间, 可能要停下来看看有没有别的需要执行的函数, 可以调这个. 其它场景没怎么考虑过. 话说这种场景似乎也很少见.

@hades jQuery源码里很多地方都用到了setTimeout(callback)可以去看看。打个比方:

   function read_data(){
        read_file();
        write_log();
        //setTimeout(write_log,0);
   }
   read_data();
   show_data();

假设write_log()花费1秒,那么read_data()得多等1秒才能返回,然后show_data()才能把数据展示给用户。但是用户根本不关心你的日志,让用户为此多等1秒其实毫无意义,这种场景就可以用setTimeout(callback,0)来调用write_log,让read_data()立刻返回并将数据展示给用户。node里可以用nextTick,会更快一些。

@JackYao @neuront 谢谢你们的例子,不错不错。

@neurontprocess.nextTick 中间停下来看的么?

@jiyinyiyong node 文档给的解释是这等价于 setTimeout(callback, 1) 但是更有效率因为底层实现不一样. 可以用来做异步递归, 如

function factorial(n) {
    if (n < 2) return 1;
    return n * factorial(n - 1)
}

n 特别大的时候会导致进程阻塞所以可以改写成下面的异步版本

function factorial(n, fac, cb) {
    if (n < 2) return cb(fac);
    process.nextTick(function() {
        factorial(n - 1, fac * n, cb);
    });
}

但不管怎么说我觉得这样还是太奇葩了, 肯定是什么地方不该用 js 的用了 js.

回到顶部