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 相关文章推荐
基于jquery的跨域调用文件
Nov 19 Javascript
jquery获取特定name所有选中的checkbox,支持IE9标准模式
Mar 18 Javascript
JavaScript类属性的访问方式详解
Feb 11 Javascript
浅析tr的隐藏和显示问题
Mar 05 Javascript
angularJS中router的使用指南
Feb 09 Javascript
基于jQuery实现动态数字展示效果
Aug 12 Javascript
Vuejs仿网易云音乐实现听歌及搜索功能
Mar 30 Javascript
js微信分享实现代码
Oct 11 Javascript
laydate日历控件使用方法详解
Nov 20 Javascript
vue实现密码显示与隐藏按钮的自定义组件功能
Apr 23 Javascript
通过实践编写优雅的JavaScript代码
May 30 Javascript
超详细小程序定位地图模块全系列开发教学
Nov 24 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 MYSQL乱码问题,使用SET NAMES utf8校正
2009/11/30 PHP
一些需要禁用的PHP危险函数(disable_functions)
2012/02/23 PHP
PHP实现递归复制整个文件夹的类实例
2015/08/03 PHP
php执行多个存储过程的方法【基于thinkPHP】
2016/11/08 PHP
Smarty缓存机制实例详解【三种缓存方式】
2019/07/20 PHP
window.open被浏览器拦截后的自定义提示效果代码
2007/11/19 Javascript
10款新鲜出炉的 jQuery 插件(Ajax 插件,有幻灯片、图片画廊、菜单等)
2011/06/08 Javascript
JS对img进行操作(换图片/切图/轮换/停止)
2013/04/17 Javascript
js猜数字小游戏的简单实现代码
2013/07/02 Javascript
键盘KeyCode值列表汇总
2013/11/26 Javascript
让IE8浏览器支持function.bind()方法
2014/10/16 Javascript
JavaScript取得键盘按下方向键是哪个的方法
2015/08/04 Javascript
JavaScript位移运算符(无符号) &gt;&gt;&gt; 三个大于号 的使用方法详解
2016/03/31 Javascript
js仿淘宝和百度文库的评分功能
2016/05/15 Javascript
JS简单生成两个数字之间随机数的方法
2016/08/03 Javascript
无限循环轮播图之运动框架(原生JS实现)
2017/10/01 Javascript
jQuery利用FormData上传文件实现批量上传
2018/12/04 jQuery
jQuery实现简单轮播图效果
2020/12/27 jQuery
python定时利用QQ邮件发送天气预报的实例
2017/11/17 Python
scrapy爬虫实例分享
2017/12/28 Python
python 2.7.13 安装配置方法图文教程
2018/09/18 Python
用scikit-learn和pandas学习线性回归的方法
2019/06/21 Python
Python是什么 Python的用处
2020/05/26 Python
处理HTML5新标签的浏览器兼容版问题
2017/03/13 HTML / CSS
Manduka官网:瑜伽垫、瑜伽毛巾和服装
2018/07/02 全球购物
Rowdy Gentleman服装和配饰:美好时光
2019/09/24 全球购物
俄罗斯鲜花递送:AMF
2020/04/24 全球购物
师范生实习的个人自我鉴定
2013/10/20 职场文书
建筑公司文秘岗位职责
2013/11/29 职场文书
毕业生个人的求职信范文
2013/12/03 职场文书
员工培训邀请函
2014/01/11 职场文书
党员创先争优承诺书
2014/03/26 职场文书
2014年党务公开方案
2014/05/08 职场文书
我的梦想演讲稿500字
2014/08/21 职场文书
向国旗敬礼活动总结范文2014
2014/09/27 职场文书
八月迷情观后感
2015/06/11 职场文书