js 性能优化之快速响应的用户界面


Posted in Javascript onFebruary 15, 2017

用于执行JavaScript和更新用户界面的进程通常被称为“浏览器UI线程”。JavaScript和用户界面更新在同一个进程中运行,因此一次只能处理一件事情。 

·任何JavaScript任务都不应当执行超过100毫秒,过长的运行时间导致UI更新出现明显延迟,从而会影响用户体验。 

·浏览器有两类限制JavaScript任务的运行时间的机制,调用栈大小限制(即记录自脚本开始以来执行的语句的数量)和长时间运行脚本限制(记录脚本执行的总时长,超时的时候会有弹框提示用户[chrome没有单独的程云霞脚本限制,替代做法是依赖其通用奔溃检测系统来处理此类问题])。

一些优化JavaScript任务时间的常见做法:

①使定时器让出时间片段

1.使用定时器处理数组。当处理过程不须同步,数据不须按顺序处理时。即可考虑用定时器分解任务。

如:

function processArray(items,process,callback){
 var todo = items.concat();
 setTimeout(function(){
 process(todo.shift());
 
 if(todo.length > 0){
 setTimeout(arguments.callee,25);
 } else {
 callback(items);
 }
 },25);
}
var items = [1,2,3];
function output(value){
 console.log(value);
} 
processArray(items,outputValue,function(){
 console.log('finished output!')
});

②分割任务

如果一个函数的运行时间过长,那么可以把它拆分为一系列能在较短时间内完成的子函数。

如:

function multistep(steps,args,callback){
 var tasks = steps.concat();
 setTimeout(function(){
 var task = tasks.shift();
 task.apply(null,args||[]);
 
 if(tasks.length > 0){
 setTimeout(arguments.callee,25);
 } else {
 callback();
 }
 },25);
}
function saveDocument(id){
 var tasks = [open,write,close];
 multistep(tasks,[id],function(){
 console.log('finished!');
 })
}

③记录代码的运行时间

有时每次只执行一个任务的效率不高,且在两次之间产生25ms的延迟就更不好了。所以可以添加时间检测机制来改进processArray()方法。

如:

function timeProcessArray(items,process,callback){
 var todo = items.concat();
 setTimeout(function(){
 var start = +new Date();
 do{
 process(todo.shift());
 }while(todo.length > 0 &&(+new Date() - start < 50)) ;
 if(todo.length > 0){
 setTimeout(arguments.callee,25);
 } else {
 callback(items);
 }
 },25);
}

注意,定时器虽然可以提高性能,但是过度使用会适得其反。需要控制web应用中的使用数量。

④使用Worker

Web Worker是新版浏览器支持的特性,它允许在UI线程外部执行JavaScript代码,从而避免锁定UI。

参考资料:http://www.alloyteam.com/2015/11/deep-in-web-worker/

备注:

个人觉得,Worker的缺陷还是太多了。用不起来,而且要慎用。

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持三水点靠木!

Javascript 相关文章推荐
ajax的hide隐藏问题解决方法
Dec 11 Javascript
Jquery Uploadify多文件上传带进度条且传递自己的参数
Aug 28 Javascript
jQuery学习笔记之jQuery动画效果
Sep 09 Javascript
jQuery对象初始化的传参方式
Feb 26 Javascript
jQuery使用hide方法隐藏指定元素class样式用法实例
Mar 30 Javascript
js图片翻书效果代码分享
Aug 20 Javascript
基于JQuery实现图片上传预览与删除操作
May 24 Javascript
JS中去掉array中重复元素的方法
May 26 Javascript
JS继承与闭包及JS实现继承的三种方式
Oct 15 Javascript
Angular实现点击按钮后在上方显示输入内容的方法
Dec 27 Javascript
VUE实现自身整体组件销毁的示例代码
Jan 13 Javascript
vue-video-player 解决微信自动全屏播放问题(横竖屏导致样式错乱问题)
Feb 25 Javascript
微信小程序  http请求封装详解及实例代码
Feb 15 #Javascript
DOM事件探秘篇
Feb 15 #Javascript
详解Angularjs 如何自定义Img的ng-load 事件
Feb 15 #Javascript
js实现滑动到页面底部自动加载更多功能
Feb 15 #Javascript
JS 实现随机验证码功能
Feb 15 #Javascript
JS实现PC手机端和嵌入式滑动拼图验证码三种效果
Feb 15 #Javascript
javascript设计模式之中介者模式学习笔记
Feb 15 #Javascript
You might like
成本8450万,票房仅2亿,口碑两极分化,又一部DC电影扑街了
2020/04/09 欧美动漫
php通用防注入程序 推荐
2011/02/26 PHP
PHP计算百度地图两个GPS坐标之间距离的方法
2015/01/09 PHP
php 使用curl模拟登录人人(校内)网的简单实例
2016/06/06 PHP
PHP实现的DES加密解密封装类完整实例
2017/04/29 PHP
Javascript学习笔记1 数据类型
2010/01/11 Javascript
超轻量级的基于jquery的三级展开列表
2011/04/26 Javascript
jquery fancybox ie6不显示关闭按钮的解决办法
2013/12/25 Javascript
自己动手写的jquery分页控件(非常简单实用)
2015/10/28 Javascript
认识Knockout及如何使用Knockout绑定上下文
2015/12/25 Javascript
jquery 无限极下拉菜单的简单实例(精简浓缩版)
2016/05/31 Javascript
如何利用模板将HTML从JavaScript中抽离
2016/10/08 Javascript
详解@Vue/Cli 3 Invalid Host header 错误解决办法
2019/01/02 Javascript
Vue3为什么这么快
2020/09/23 Javascript
[30:00]完美世界DOTA2联赛PWL S2 Rebirth vs LBZS 第二场 11.28
2020/12/01 DOTA
详解Python中的多线程编程
2015/04/09 Python
python 中random模块的常用方法总结
2017/07/08 Python
python 统计一个列表当中的每一个元素出现了多少次的方法
2018/11/14 Python
详解python的四种内置数据结构
2019/03/19 Python
利用PyQt中的QThread类实现多线程
2020/02/18 Python
TensorFlow中如何确定张量的形状实例
2020/06/23 Python
在python中对于bool布尔值的取反操作
2020/12/11 Python
Sunglasses Shop丹麦:欧洲第一的太阳镜在线销售网站
2017/10/22 全球购物
耐克中国官方商城:Nike中国
2018/10/18 全球购物
联想英国官网:Lenovo英国
2019/07/17 全球购物
空指针到底是什么
2012/08/07 面试题
学院领导推荐信
2013/10/30 职场文书
幼儿园秋游感想
2014/03/12 职场文书
研究生考核个人自我鉴定
2014/03/27 职场文书
《冬阳童年骆驼队》教学反思
2014/04/15 职场文书
小学生美德少年事迹材料
2014/08/24 职场文书
民主评议党员自我评价材料
2014/09/18 职场文书
办护照工作证明
2014/10/01 职场文书
交通事故和解协议书
2015/01/27 职场文书
2015年国际护士节演讲稿
2015/03/18 职场文书
python tqdm用法及实例详解
2021/06/16 Python