JavaScript提升性能的常用技巧总结【经典】


Posted in Javascript onJune 20, 2016

本文讲述了JavaScript提升性能的常用技巧。分享给大家供大家参考,具体如下:

1.注意作用域

随着作用域链中的作用域数量的增加,访问当前作用域以外的变量的时间也在增加.访问全局变量总是要比访问局部变量慢,因为要遍历作用域链
1). 避免全局查找   将在一个函数中会多次用到的全局对象存储为局部变量总是没错的.

2). 避免 with 语句  with会创建自己的作用域,因此会增加其中执行代码的作用域链的长度.

2.选择正确的方法

性能问题的一部分是和用于解决问题的算法或者方法有关的.

1). 避免不必要的属性查找

在计算机科学中,算法的复杂度是使用O符号来表示的.最简单,最快捷的算法是常数值,即O(1).之后,算法变得越来越复杂并花更长时间执行.常用的JavaScript算法类型有:

常数 : 不管有多少值,执行的时间都是恒定的.一般表示简单值和存储在变量的值.

对数 : 总的执行时间和值的数量相关,但是要完成算法并不一定要获取每个值. 例如:二分查找

线性 : 总执行时间和值的数量直接相关. 例如 :遍历某个数组中的所有元素

平方 : 总执行时间和值的数量有关,每个值至少要获取n次.例如:插入排序

立方:  总执行时间和值的数量有关,每个值至少要获取n的平方次

使用变量和数组要比访问对象上的属性更有效率.对象上的任何属性的查找都要比访问变量或者数组花更长时间,因为必须在原型链中对拥有该名称的属性进行一次搜索.

一般来讲,只要能减少算法的复杂度,就要尽可能减少.尽可能多地使用局部变量将属性查找替换为值查找.进一步讲,如果即可以用数字化的数组位置进行访问,也可以使用命名属性(诸如NodeList对象),那么使用数组位置.

2). 优化循环

a. 减值迭代   在很多情况下,从最大值开始,在循环中不断减值的迭代器更加高效.
b. 简化终止条件   由于每次循环过程都会计算终止条件,所以必须保证它尽可能快.
c. 简化循环体   循环体是执行最多的,所以要确保其被最大限度地优化.确保没有某些可以被很容易移出循环的密集计算.
d. 使用后测试循环   最常用的for循环和while循环都是前测试循环.而如do-while这种后测试循环,可以避免最初终止条件的计算,因此更快. 

3). 展开循环   当循环的次数是确定的,消除循环并使用多次函数调用往往更快.如著名的Duff装置

4). 避免双重解释

当JavaScript 代码想解析 JavaScript 的时候就会存在双重解释的惩罚.如下例:

eval("alert('Hello world!')");
//某些代码求值

修正:

alert('Hello world');
var sayHi = new Function("alert('Hello world!')");

修正:

var sayHi = function(){
  alert("Hellow world!');
};
setTimeout("alert('Hellow world!')",500);

修正:

setTimeout(function)({
   alert('Hellow world!');
},500);

5). 其他方法

原生方法较快--只要有可能,使用原生方法而不是自己用JavaScript重写一个.原生方法是用诸如C/C++之类的编译型语言写出来的,所以要比JavaScript的快很多很多.JavaScript中最容易被忘记的就是可以在Math对象中找到的复杂的数学运算;这些方法要比任何用JavaScript写的同样方法,如正弦,余弦快的多.

Switch 语句较快--如果有一系复杂的if-else语句,可以转换成单个switch语句则可以得到更快的代码.还可以通过将case语句按最可能的到最不可能在顺序进行组织,来进一步优化switch语句.

位运算符较快--当进行数学运算的时候,位运算操作要比任何布尔运算或者算数运算快.选择性的用位运算换算数运算可以极大提升复杂计算的性能.诸如取模,逻辑与和逻辑或都可以考虑用位运算来替换.

3 . 最小化语句数

1). 多个变量声明

如:

//4个语句---很浪费
var count = 5;
var color = "blue";
var values = [1,2,3];
var now = new Date();

优化:

var count = 5,
color = "blue", 
values = [1,2,3],
noiw = new Date();

在大多数情况下这种优化都非常容易做,并且要比单个变量分别声明快很多.

2). 插入迭代值

如:

var name = values[i];
i++;

优化:

var name = values[i++];

3). 使用数组和对象字面量

如:

var values = new Array(); --->  var values = [];
var obj = new Object(); ---> var obj = {};

4. 优化DOM交互

1). 最小化现场更新

一旦你需要访问DOM部分是已经显示的页面的一部分,那么你就是在进行一个现场更新.之所以叫现场更新,是因为需要立即(现场)对页面对用户的显示进行更新.不管是插入单个字符,还是移除整个片段,都有一个性能惩罚,因为浏览器要重新计算无数尺寸以进行更新.

例:

var list = document.getElementById("myList");
for(var i = 0;i < 10;i++){
  var item = document.createElement("li");
  list.appendChild(item);
  item.appendChild(document.createTextNode("Item "+i));
}

这样添加10个项目,这个操作总共要完成20个现场更新.  下面用创建文档碎片的方法改进:

var list = document.getElementById("myList");
var fragment = document.createDocumentFragment();
for(var i = 0; i < 10;i++){
   fragment.appendChild(item);
   item.appendChild(document.createTextNode("Item "+i));
}
list.appendChlid(fragment);

在这个例子中只有一次现场更新,它发生在所有项目都创建好之后.文档碎片用作一个临时的占位符,放置新创建的项目.然后使用appendChild()将所有项目添加到列表用.记住,当给appendChild()传入文档碎片时,只有碎片中的子节点被添加到目标,碎片本身不会被添加的.

一旦需要更新DOM,请考虑使用文档碎片来构建DOM结构,然后将其添加到现存的文档中.

2). 使用innerHTML

有两种在页面上创建DOM节点的方法:使用诸如createElement(),appendChild()之类的DOM方法,以及使用innerHTML对于小的DOM更改而言,两种方法效率都差不多.而对于大的DOM更改,使用innerHTML要比使用标准DOM方法创建同样的DOM结构快很多.同样,一次使用innerHTML比多次使用innerHTML也要快相当多.

3). 使用事件代理(简,略)

4). 注意NodeList

最小化访问NodeList的次数可以极大的改进脚本的性能.

发生以下情况时会返回NodeList对象:

a. 进行了对getElementsByTagName()的调用
b. 获取了元素的childNodes属性
c. 获取了元素的attributes属性
d. 访问了特殊的集合,如document.forms  ,  document.images等等

要了解当使用NodeList对象时,合理使用会极大提升代码执行速度.

前面介绍的 函数节流  也是很重要的一方面。特别是多重循环,非常耗性能时,此方法很有用的。

PS:对于javascript进行压缩,减少代码体积也是提升javascript性能的有效途径。这里就为大家推荐2款非常实用的压缩工具:

JavaScript压缩/格式化/加密工具:
http://tools.3water.com/code/jscompress

jsmin在线js压缩工具:
http://tools.3water.com/code/jsmincompress

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
JS Array对象入门分析
Oct 30 Javascript
增强用户体验友好性之jquery easyui window 窗口关闭时的提示
Jun 22 Javascript
ExtJS4 表格的嵌套 rowExpander应用
May 02 Javascript
javascript中关于&amp;&amp; 和 || 表达式的小技巧分享
Apr 10 Javascript
jQuery插件StickUp实现网页导航置顶
Apr 12 Javascript
浅谈js停止事件冒泡 阻止浏览器的默认行为(阻止超连接 #)
Feb 08 Javascript
JS变量及其作用域
Mar 29 Javascript
AngularJs的UI组件ui-Bootstrap之Tooltip和Popover
Jul 13 Javascript
layui前端框架之table表数据的刷新方法
Aug 17 Javascript
vue中的适配px2rem示例代码
Nov 19 Javascript
JS实现TITLE悬停长久显示效果完整示例
Feb 11 Javascript
基于Echarts图表在div动态切换时不显示的解决方式
Jul 20 Javascript
使用jQuery给input标签设置默认值
Jun 20 #Javascript
js中获取时间new Date()的全面介绍
Jun 20 #Javascript
AngularJs Javascript MVC 框架
Jun 20 #Javascript
jQuery 限制输入字符串长度
Jun 20 #Javascript
JavaScript函数节流概念与用法实例详解
Jun 20 #Javascript
Angular的Bootstrap(引导)和Compiler(编译)机制
Jun 20 #Javascript
jquery通过name属性取值的简单实现方法
Jun 20 #Javascript
You might like
PHP 高手之路(二)
2006/10/09 PHP
php中删除字符串中最先出现某个字符的实现代码
2013/02/03 PHP
PHPExcel导出2003和2007的excel文档功能示例
2017/01/04 PHP
php 基础函数
2017/02/10 PHP
Yii 2.0如何使用页面缓存方法示例
2017/05/23 PHP
Laravel5.5 视图 - 创建视图和数据传递示例
2019/10/21 PHP
对采用动态原型方式无法展示继承机制得思考
2009/12/04 Javascript
Javascript异步编程的4种方法让你写出更出色的程序
2013/01/17 Javascript
编写简单的jQuery提示插件
2014/12/21 Javascript
JS使用ajax方法获取指定url的head信息中指定字段值的方法
2015/03/24 Javascript
JavaScript中用于四舍五入的Math.round()方法讲解
2015/06/15 Javascript
关于JS中setTimeout()无法调用带参函数问题的解决方法
2016/06/21 Javascript
JS简单测试循环运行时间的方法
2016/09/04 Javascript
jQuery使用ajax方法解析返回的json数据功能示例
2017/01/10 Javascript
原生Javascript插件开发实践
2017/01/18 Javascript
轻松理解vue的双向数据绑定问题
2017/10/30 Javascript
Angular 作用域scope的具体使用
2017/12/11 Javascript
详解vue数组遍历方法forEach和map的原理解析和实际应用
2018/11/15 Javascript
JavaScript实现数字前补“0”的五种方法示例
2019/01/03 Javascript
JS中间件设计模式的深入探讨与实例分析
2020/04/11 Javascript
基于PHP pthreads实现多线程代码实例
2020/06/24 Javascript
[40:04]Secret vs Infamous 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.23
2019/09/05 DOTA
Python StringIO模块实现在内存缓冲区中读写数据
2015/04/08 Python
python抓取并保存html页面时乱码问题的解决方法
2016/07/01 Python
PyTorch读取Cifar数据集并显示图片的实例讲解
2018/07/27 Python
在pycharm中设置显示行数的方法
2019/01/16 Python
python ubplot使用方法解析
2020/01/10 Python
Python标准库:内置函数max(iterable, *[, key, default])说明
2020/04/25 Python
最新版 Windows10上安装Python 3.8.5的步骤详解
2020/11/28 Python
css3 border-image使用说明
2010/06/23 HTML / CSS
奥林匹亚体育:Olympia Sports
2020/12/30 全球购物
实习老师个人总结的自我评价
2013/09/28 职场文书
小小的船教学反思
2014/02/21 职场文书
代收款委托书范本
2014/10/01 职场文书
党员自我评价范文2015
2015/03/03 职场文书
介绍一下28个JS常用数组方法
2022/05/06 Javascript