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 相关文章推荐
Javascript实例教程(19) 使用HoTMetal(7)
Dec 23 Javascript
myFocus slide3D v1.1.0 使用方法与下载
Jan 12 Javascript
JS模拟面向对象全解(二、类型与赋值)
Jul 13 Javascript
js阻止冒泡及jquery阻止事件冒泡示例介绍
Nov 19 Javascript
JavaScript编写连连看小游戏
Jul 07 Javascript
ionic2自定义cordova插件开发以及使用(Android)
Jun 19 Javascript
JS 学习总结之正则表达式的懒惰性和贪婪性
Jul 03 Javascript
React Native使用fetch实现图片上传的示例代码
Mar 07 Javascript
Vue三层嵌套路由的示例代码
May 05 Javascript
给localStorage设置一个过期时间的方法分享
Nov 06 Javascript
vue-cli安装使用流程步骤详解
Nov 08 Javascript
Javascript实现秒表计时游戏
May 27 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
怎样才能成为PHP高手?学会“懒惰”的编程
2006/12/05 PHP
PHP回调函数简单用法示例
2019/05/08 PHP
详解PHP 7.4 中数组延展操作符语法知识点
2019/07/19 PHP
JQuery获取元素文档大小、偏移和位置和滚动条位置的方法集合
2010/01/12 Javascript
javaScript复制功能调用实现方案
2012/12/13 Javascript
6款经典实用的jQuery小插件及源码(对话框/提示工具等等)
2013/02/04 Javascript
angularjs中的e2e测试实例
2014/12/06 Javascript
jQuery中removeAttr()方法用法实例
2015/01/05 Javascript
基于JS实现EOS隐藏错误提示层代码
2016/04/25 Javascript
jQuery 3.0中存在问题及解决办法
2016/07/15 Javascript
实例解析angularjs的filter过滤器
2016/12/14 Javascript
JavaScript原生节点操作小结
2017/01/17 Javascript
jQuery实现表单动态加减、ajax表单提交功能
2018/06/08 jQuery
玩转Koa之koa-router原理解析
2018/12/29 Javascript
Python 字典(Dictionary)操作详解
2014/03/11 Python
python实现zencart产品数据导入到magento(python导入数据)
2014/04/03 Python
Python 序列化 pickle/cPickle模块使用介绍
2014/11/30 Python
[原创]教女朋友学Python(一)运行环境搭建
2017/11/29 Python
Python基于辗转相除法求解最大公约数的方法示例
2018/04/04 Python
PyQt5实现无边框窗口的标题拖动和窗口缩放
2018/04/19 Python
Python socket实现的简单通信功能示例
2018/08/21 Python
Window 64位下python3.6.2环境搭建图文教程
2018/09/19 Python
关于PyTorch 自动求导机制详解
2019/08/18 Python
python实现画循环圆
2019/11/23 Python
python numpy实现多次循环读取文件 等间隔过滤数据示例
2020/03/14 Python
世界上最大的各式箱包网络零售店:eBag
2016/07/21 全球购物
Vans(范斯)德国官网:美国南加州的原创极限运动潮牌
2017/05/02 全球购物
护士自我评价范文
2014/01/25 职场文书
收银员岗位职责
2014/02/07 职场文书
公务员保密承诺书
2014/03/27 职场文书
英语教师自荐信
2014/05/26 职场文书
临时工聘用合同协议书
2014/10/29 职场文书
听证会主持词
2015/07/03 职场文书
小学毕业感言100字
2015/07/30 职场文书
Python答题卡识别并给出分数的实现代码
2021/06/22 Python
VUE中的v-if与v-show区别介绍
2022/03/13 Vue.js