CNode

求教while和setInterval(,0)的区别

问答
Ffangker发布于10 年前最后回复10 年前11 回复9826 浏览0 收藏

知道我表述有问题,大神别喷,请看下面。我的问题是为什么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)

M
manxisuo#1·10 年前

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

J
jingsam#2·10 年前

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

K
klesh#4·10 年前

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

C
coordcn#6·10 年前
引用 manxisuowhile:原地等。 setTimeout:滚到一边去等。 From Noder

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

C
chengang4505#7·10 年前

神奇的事:

代码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怎么编译的。

F
flamingtop#8·10 年前
F
fangker#9·10 年前
引用 coordcn@manxisuo 这个回答很精髓,本质上还是要等。。。

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

F
fangker#10·10 年前
引用 chengang4505神奇的事: 代码1: 代码2: 代码1 比 代码2 慢了几倍。。。不知jit怎么编译的。

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

Y
yuanbu2#11·10 年前

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

参与回复
登录后即可参与回复。登录