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 相关文章推荐
改写一个简单的菜单 弹性大小
Dec 02 Javascript
div浮层,滚动条移动,位置保持不变的4种方法汇总
Dec 11 Javascript
javascript 密码框防止用户粘贴和复制的实现代码
Feb 17 Javascript
JavaScript面向对象的实现方法小结
Apr 14 Javascript
jQuery中delegate()方法的用法详解
Oct 13 Javascript
jQuey将序列化对象在前台显示地实现代码(方法总结)
Dec 13 Javascript
原生js实现可爱糖果数字时间特效
Dec 30 Javascript
Angular在一个页面中使用两个ng-app的方法
Feb 20 Javascript
老生常谈jquery中detach()和remove()的区别
Mar 02 Javascript
从零开始学习搭建React脚手架项目
Aug 23 Javascript
原生JS无缝滑动轮播图
Oct 22 Javascript
简单了解JavaScript sort方法
Nov 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
对Session和Cookie的区分与解释
2007/03/16 PHP
php 图片上传类代码
2009/07/17 PHP
详解PHP中websocket的使用方法
2016/09/15 PHP
PHP环境搭建(php+Apache+mysql)
2016/11/14 PHP
jquery异步循环获取功能实现代码
2010/09/19 Javascript
js三种排序算法分享
2012/08/16 Javascript
javascript window.confirm确认 取消对话框实现代码小结
2012/10/21 Javascript
Javascript前端UI框架Kit使用指南之Kitjs简介
2014/11/28 Javascript
jQuery中find()方法用法实例
2015/01/07 Javascript
谈一谈javascript闭包
2016/01/28 Javascript
深入浅析JavaScript中with语句的理解
2016/05/12 Javascript
js实现兼容PC端和移动端滑块拖动选择数字效果
2017/02/16 Javascript
写jQuery插件时的注意点
2017/02/20 Javascript
vue中实现高德定位功能
2019/12/03 Javascript
js实现自定义右键菜单
2020/05/18 Javascript
[01:53]DOTA2超级联赛专访Zhou 五年职业青春成长
2013/05/29 DOTA
[42:25]2018DOTA2亚洲邀请赛 4.5 淘汰赛 LGD vs Liquid 第三场
2018/04/06 DOTA
[46:53]Secret vs Liquid 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
对numpy和pandas中数组的合并和拆分详解
2018/04/11 Python
Python使用ffmpy将amr格式的音频转化为mp3格式的例子
2019/08/08 Python
Python使用Opencv实现图像特征检测与匹配的方法
2019/10/30 Python
Python如何用filter函数筛选数据
2020/03/05 Python
如何在Python 游戏中模拟引力
2020/03/27 Python
Python 程序员必须掌握的日志记录
2020/08/17 Python
python实现测试工具(二)——简单的ui测试工具
2020/10/19 Python
PyTorch中clone()、detach()及相关扩展详解
2020/12/09 Python
python Pexpect模块的使用
2020/12/25 Python
全网最全python库selenium自动化使用详细教程
2021/01/12 Python
HTML5 localStorage使用总结
2017/02/22 HTML / CSS
世界上最大的在线旅行社新加坡网站:Expedia新加坡
2016/08/25 全球购物
Grow Gorgeous美国官网:只要八天,体验唤醒毛囊后新生的茂密秀发
2018/06/04 全球购物
小学生自我鉴定
2013/10/12 职场文书
小学教师培训感言
2014/02/11 职场文书
2014学校庆三八妇女节活动总结
2014/03/01 职场文书
特教教师先进事迹
2014/05/21 职场文书
小学教师暑期培训心得体会
2016/01/09 职场文书