setTimeout(0) 即将退役

简介:

Blog picture template artx 530x185 px

相信所有做前端开发的同学都会经常使用 setTimeout(0) 来做很多事情,这个一度成为解决了很多前端疑难杂症的法宝。而且大家也知道 setTImeout(0) 的极限在16ms左右。也许很多人没想到这个是一个很严重的问题,但是在w3c性能小组的专家眼里这是一个非常纠结的设置。

那setTimeout和16ms会带来什么问题呢?

1. 我们都知道,我们在做页面动画的时候大多数都是在用setTImeout来控制每一帧的动画的, 而多个setTimeout的存在会导致很多次CPU中断调度的开销,为了减少这些开销,我们希望同一个统一的CPU中断调度管理调度单元来管理所有动画,

于是就出现了 requestAnimationFrame。 requestAnimationFrame 的出现不仅仅可以解决中断调度的问题,还可以更加优化得统一管理动画单元里dom元素的repaint方式。

2. 杯具的16ms,在早期。js的callback执行,是依赖CPU的中断来进行控制的,如果两个中断之间时间太短会导致,CPU性能消耗很高,同时影响能耗,于是微软和英特公司为了解决这个问题,就约定每个中断之间的间隔是15.6ms(64 fps)所以就是我们常见的约等于16ms的间隔。不过随着web的要求不断增加,大家对这个要求希望是放宽的态度,于是在高端浏览器,这个性能被提升了4倍左右,所以在chrome,ie10等浏览器,setTimeout的间隔缩短到了 4ms (250 fps)。 但是问题来了,这么高的消耗以传统的方式,并不能从根本上解决CPU的调度问题,而且能耗也会提升40%

于是W3C,提出需要取代 setTimeout(0) 的代替品 --- setImmediate

不过到底底层如何解决了这个CPU调度,还能保证脚本能够很快执行,这块舜子还在研究,了解的朋友也欢迎一起交流哈。

 

这是两个非常好的方法用来取代setTimeout的api,舜子也做了一些小小的实验来验证 requestAnimationFrame,setImmediate 和 setTimeout 之间的执行效率区别,在IE10下可以看到,setImmediate 接口的callback次数可以达到每秒 6000 次的的执行。而requestAnimationFrame主要目的是为了保证动画的圆滑播放,所以基本上是控制在60 fps的范围,而且根据文档介绍,只是一个时钟控制器在进行调度,而且会更加需要来进行按需渲染。

http://www.pjhome.net/web/html5/timing_test.htm

本文转自艾伦 Aaron博客园博客,原文链接:http://www.cnblogs.com/aaronjs/archive/2012/07/05/2577177.html,如需转载请自行联系原作者
相关文章
|
7月前
|
前端开发
promise的一些巨坑
promise的一些巨坑
|
3月前
|
前端开发 JavaScript
调和阶段setState干了什么?
在React中,setState 是用来更新组件的状态的方法之一。
15 0
|
8月前
|
前端开发 算法
【调和阶段setState干了什么?】
【调和阶段setState干了什么?】
|
9月前
|
前端开发 JavaScript UED
因为它,我差点删库跑路:js防抖与节流
因为它,我差点删库跑路:js防抖与节流
|
9月前
相比 setInterval(),更推荐 setTimeout()
相比 setInterval(),更推荐 setTimeout()
40 0
|
前端开发
「CSS畅想」周期性事情怕忘,来看看一个月内都安排在哪天
前端玩转CSS,可以创造出不少有趣的效果。今天实现了一个周期性日期获取功能,小功能大用处。
99 1
|
前端开发
前端工作总结194-nexttick使用
前端工作总结194-nexttick使用
55 0
前端工作总结194-nexttick使用
|
前端开发
前端工作总结146-nexttick的使用
前端工作总结146-nexttick的使用
70 0
前端工作总结146-nexttick的使用
|
安全
别再用错setTimeout和setInterval了
`setTimeout`和`setInterval`都可以用于设置定时器,参数相似,但是使用效果和用途截然不同。本文就重点阐述两者之间的区别
342 0
|
前端开发 JavaScript
setTimeout(〒︿〒) 请原谅我一直以来对你的忽视
纸上得来终觉浅,绝知此事要躬行。哪怕是平时一个不起眼的小知识,我们也需要以认真的态度去学习,否则,说不定什么时候就会踩到坑,伤害到彼此!
117 0
setTimeout(〒︿〒) 请原谅我一直以来对你的忽视