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 相关文章推荐
JS判断页面加载状态以及添加遮罩和缓冲动画的代码
Oct 11 Javascript
JavaScript使用Math.Min返回两个数中较小数的方法
Apr 06 Javascript
JavaScript采用递归算法计算阶乘实例
Aug 04 Javascript
基于javascript实现文字无缝滚动效果
Mar 22 Javascript
jquery zTree异步加载、模糊搜索简单实例分享
Mar 24 Javascript
在Node.js中使用Javascript Generators详解
May 05 Javascript
node.js缺少mysql模块运行报错的解决方法
Nov 13 Javascript
JS限制条件补全问题实例分析
Dec 16 Javascript
bootstrap导航栏、下拉菜单、表单的简单应用实例解析
Jan 06 Javascript
VUE2实现事件驱动弹窗示例
Oct 21 Javascript
JS实现的base64加密解密操作示例
Apr 18 Javascript
js实现点击生成随机div
Jan 16 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
正则表达式语法
2006/10/09 Javascript
CURL状态码列表(详细)
2013/06/27 PHP
PHP使用in_array函数检查数组中是否存在某个值
2015/03/25 PHP
php基于curl重写file_get_contents函数实例
2016/11/08 PHP
js限制文本框为整数和货币的函数代码
2010/10/13 Javascript
THREE.JS入门教程(5)你应当知道的十件事
2013/01/24 Javascript
利用javascript数组长度循环数组内所有元素
2013/12/27 Javascript
js使用split函数按照多个字符对字符串进行分割的方法
2015/03/20 Javascript
浅谈Javascript的静态属性和原型属性
2015/05/07 Javascript
基于jQuery实现的菜单切换效果
2015/10/16 Javascript
jQuery mobile 移动web(4)
2015/12/20 Javascript
JavaScript实现iframe自动高度调整和不同主域名跨域
2016/02/27 Javascript
JavaScript位移运算符(无符号) &gt;&gt;&gt; 三个大于号 的使用方法详解
2016/03/31 Javascript
Javascript之Date对象详解
2016/06/07 Javascript
全面了解JS中的匿名函数
2016/06/29 Javascript
JS/jQuery判断DOM节点是否存在的简单方法
2016/11/24 Javascript
微信小程序图片选择、上传到服务器、预览(PHP)实现实例
2017/05/11 Javascript
使用travis-ci如何持续部署node.js应用详解
2017/07/30 Javascript
angularJs在多个控制器中共享服务数据的方法
2018/09/30 Javascript
浅谈Vue.js 关于页面加载完成后执行一个方法的问题
2019/04/01 Javascript
js实现贪吃蛇小游戏
2019/10/29 Javascript
Javascript类型判断相关例题及解析
2020/08/26 Javascript
[02:34]2016完美“圣”典风云人物:BurNIng专访
2016/12/10 DOTA
Python中使用ElementTree解析XML示例
2015/06/02 Python
Python文件右键找不到IDLE打开项解决办法
2015/06/08 Python
浅谈Python实现贪心算法与活动安排问题
2017/12/19 Python
python Tkinter版学生管理系统
2019/02/20 Python
pyqt5 获取显示器的分辨率的方法
2019/06/18 Python
django框架实现模板中获取request 的各种信息示例
2019/07/01 Python
推荐WEB开发者最佳HTML5和CSS3代码生成器
2015/11/24 HTML / CSS
PHP如何防止SQL注入
2014/05/03 面试题
小区门卫值班制度
2014/01/24 职场文书
天鹅的故事教学反思
2014/02/04 职场文书
先进单位事迹材料
2014/12/25 职场文书
天鹅湖观后感
2015/06/09 职场文书
vue组件冲突之引用另一个组件出现组件不显示的问题
2022/04/13 Vue.js