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 相关文章推荐
onpropertypchange
Jul 01 Javascript
JS不能跨域借助jquery获取IP地址的方法
Aug 20 Javascript
avalon js实现仿google plus图片多张拖动排序附源码下载
Sep 24 Javascript
jQuery实现下拉框左右移动(全部移动,已选移动)
Apr 15 Javascript
JS小数转换为整数的方法分析
Jan 07 Javascript
JavaScript中的子窗口与父窗口的互相调用问题
Feb 08 Javascript
解决bootstrap中使用modal加载kindeditor时弹出层文本框不能输入的问题
Jun 05 Javascript
基于JS实现网页中的选项卡(两种方法)
Jun 16 Javascript
对Vue.js之事件的绑定(v-on: 或者 @ )详解
Sep 15 Javascript
15个顶级开源JavaScript框架和库
Oct 10 Javascript
VueCli3.0中集成MockApi的方法示例
Jul 05 Javascript
通过GASP让vue实现动态效果实例代码详解
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批量删除、清除UTF-8文件BOM头的代码实例
2014/04/14 PHP
PHP大批量插入数据库的3种方法和速度对比
2014/07/08 PHP
thinkPHP实现将excel导入到数据库中的方法
2016/04/22 PHP
ThinkPHP框架获取最后一次执行SQL语句及变量调试简单操作示例
2018/06/13 PHP
Laravel框架实现文件上传的方法分析
2019/09/29 PHP
In Javascript Class, how to call the prototype method.(three method)
2007/01/09 Javascript
THREE.JS入门教程(2)着色器-上
2013/01/24 Javascript
JavaScript声明变量时为什么要加var关键字
2014/09/29 Javascript
使用jquery制作弹出框效果
2015/04/03 Javascript
jQuery的几个我们必须了解的特点
2015/05/03 Javascript
js实现精美的银灰色竖排折叠菜单
2015/05/16 Javascript
Bootstrap每天必学之按钮(Button)插件
2016/04/25 Javascript
基于jQuery实现淡入淡出效果轮播图
2020/07/31 Javascript
JS实现无缝循环marquee滚动效果
2017/05/22 Javascript
Web制作验证码功能实例代码
2017/06/19 Javascript
js实现搜索栏效果
2018/11/16 Javascript
JavaScript逻辑运算符相关总结
2020/09/04 Javascript
python cx_Oracle的基础使用方法(连接和增删改查)
2017/11/19 Python
Django ManyToManyField 跨越中间表查询的方法
2018/12/18 Python
Python将列表数据写入文件(txt, csv,excel)
2019/04/03 Python
Python pip 安装与使用(安装、更新、删除)
2019/10/06 Python
浅谈Python中的生成器和迭代器
2020/06/19 Python
Python faker生成器生成虚拟数据代码实例
2020/07/20 Python
网络艺术零售业的先驱者:artrepublic
2017/09/26 全球购物
阿联酋彩妆品牌:OUD MILANO
2019/10/06 全球购物
屈臣氏乌克兰:Watsons UA
2019/10/29 全球购物
精美的手工家居和生活用品:Nkuku
2019/11/01 全球购物
什么是托管函数?托管函数有什么用?
2014/06/15 面试题
实习单位接收函模板
2014/01/10 职场文书
自行车广告词大全
2014/03/21 职场文书
加强作风建设心得体会
2014/10/22 职场文书
学前班语言教学计划
2015/01/20 职场文书
公司租车协议书
2015/01/29 职场文书
售票员岗位职责
2015/02/15 职场文书
幼儿园园长工作总结2015
2015/05/25 职场文书
入伍志愿书怎么写?
2019/07/19 职场文书