求教while和setInterval(,0)的区别
发布于 6 年前 作者 fangker 6702 次浏览 来自 问答

知道我表述有问题,大神别喷,请看下面。我的问题是为什么setInterval面临阻塞情况用时更少。 昨晚用while轮询一个异步过程导致内存炸掉,换了setInterval之后正常。于是有了疑问,开始钻牛角尖 = =。 setInterval是非阻塞的,下面进行的是阻塞操作。 var timer = new Timeout(after); callback.call(timer,arguments[]); //不断绑定timeout,按照参数绑定和触发 C++双向链表。当检测超时会从列表移除 这貌似只能解释内存不炸掉的问题。。。 var c=0; while(c<100){ c++; var i=0; while(i<=100000000){ i++; if(i==1){ console.time(‘while’); } }

console.timeEnd(‘while’); } while: 1871.268ms while: 1805.696ms while: 1859.965ms while: 1465.144ms while: 1936.749ms while: 1845.596ms while: 1831.845ms while: 1867.280ms //同样阻塞的情况下调用setInterval setInterval(c,0)

function c() { var i=0; while(i<=1000000000){ if(i==1){ console.time(‘this’); } i++; } console.timeEnd(‘this’); } /* setInterval: 768.361ms setInterval: 699.622ms setInterval: 549.766ms setInterval: 722.351ms setInterval: 722.168ms setInterval: 489.062ms */

11 回复

while:原地等。 setTimeout:滚到一边去等。 From Noder

setInterval(,0) 有一个最小间隔时间,大概是10ms,不同的浏览器设置不一样,w3c规定的是4ms 所以你设置setInterval(,0)其实是有间隔的

@jingsam 如果存在间隔为什么对于阻塞的处理用时更小

因为你的 setInterval 得到的时间是不正确的,实际上有些 c 根本还没执行完。

@klesh 难道不等待回调返回么

@manxisuo 这个回答很精髓,本质上还是要等。。。

神奇的事:

代码1:

var i=0;
while (i <= 100000000) {
    i++;
    if (i == 1) {
        console.time('while');
    }
}
console.timeEnd('while');

代码2:

var i=0;
console.time('while');
while (i <= 100000000) {
    i++;
    if (i == 1) {

    }
}
console.timeEnd('while');

代码1 比 代码2 慢了几倍。。。不知jit怎么编译的。

@coordcn 那还是不懂,等的过程都是阻塞的啊

@chengang4505 其实你循环打印time标识你会发现,执行次数越多打印的time越接近。

nodejs里休眠或者阻塞不能用while循环, while一直占用着cpu,而且是原地等待,别的事情做不了。起不到你真正想要阻塞的作用。应该用setInterval或者 setTimeout,这样不阻塞其他代码执行。

回到顶部