js性能与setTimeout 的问题

有时候我们开发复杂交互的web产品时, 会考虑到流畅性而使用setTimeout 让某个操作在进程为空(或者说CPU比较空闲)的时候才去执行, 可以一定程度上提高流畅性, 但是同时 又听说setTimeout会带来性能问题, setTimeout真的会有性能问题吗? 
如果有 那么与他带来的流畅度提升的好处之间如何权衡?

如果一个页面中使用了多个 比如10个setTimeout 又会怎样?

回答:

首先,你要弄清楚Javascript是单线程执行的,还是多线程执行的?
看如下代码

  
  
  1. setTimeout( function(){ while(true){} } , 100);
  2. setTimeout( function(){ alert('你好!'); } , 200);

第二个setTimeout会执行吗?答案是否定的。因为Javascript是单线程的。

你页面只有10个setTimeout,浏览器的内部轮询的耗损可以忽略不计的。setTimeout之所以会让人感觉到有“性能问题”,是因为多个setTimeout的函数堵塞了(先执行的setTimeout有可能堵塞后面的setTimeout)。


通常我们所说的单线程应该是指的核心的javascript执行引擎是单线程的。实际上,在web客户端整个的运行体系中,肯定是有多线程存在的,这就包括对setTimeout/setInterval的延时分配。 例如 ...; setTimeout(fn, 100); ...; 在解释器解释到这句set***的时候,会启动一个线程,在当前执行时刻100ms后准时“唤醒”(只是唤醒,并不是执行。即使后面遇到死循环也会唤醒。),唤醒后就讲这个回调函数fn加入到执行队列中去,这个队列的执行过程则是单线程的。但是这其中浏览器单独产生了这样一个线程,保证在100ms后准时的“唤醒”回调函数加入到队列。这个多线程的设计保证了这个延时机制的准确性,并不依赖循环检查。

参考:http://www.dewen.io/q/5649/?utm_field=5&utm_id=4
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值