js性能相关

一、注意作用域

  避免全局查找:全局变量的查找肯定比局部的开销更大,因为要涉及到作用域链上的查找。

  解决办法:若需要对document的引用,创建一个指向document的局部变量。

  例如:

  

1  function updateUI(){
2     var imgs=document.getElementByTagsName(‘img‘);
3     for(var i=0,len=imgs.length;i<len;i++){
4     imgs[i].title=document.title+i;
5     }
6 }
7 //如果有很多图片的话就要引用全局变量document很多遍,每次都进行作用域链的查找.性能肯定好不了。
8 //就像你要在一个大房间里找一个小东西一样,每次都要从头到尾找一遍。太辛苦。
 //既然找的很辛苦,那么,我先把它的具体位置写在一张纸条上,放入一个
 2 //离我最近盒子里去,下次找的话,在盒子里面取就
 3 //好了(按照位置直接去找,不用走弯路)
 4 function updateUI(){
 5     var doc=document;//纸条入盒子
 6     var imgs=document.getElementByTagsName(‘img‘);
 7     for(var i=0,len=imgs.length;i<len;i++){
 8     imgs[i].title=document.title+i;
 9     }
10 }
11 //现在就节省了好多麻烦(优化性能)

  

  避免with语句:原理跟上面差不多,with会增加执行代码中作用域链的长度。额外的作用域链的查找,速度肯定就慢了。

function updatebody(){
  with(document.body){
    innerHTML=‘helllo world!‘;
 }
}
//全局查找
function(){
 var body=document.body;
 body.innerHTML=‘hello world!‘
}
//储存在局部变量中,避免了全局查找

二、选择正确方法

  避免不必要的属性查找

  这里正确的方法可以说是解决问题的算法和方法。

   一般算法越复杂,执行的时间越长。列举几中算法:

    

O(1) 常数 不管值多少,执行的时间是一定的:一般是简单的值和储存在变量中的值
O(log n) 对数 总执行时间和值得数量有关
O(n) 线性 总执行时间和值得数量直接相关:遍历数组中的所有元素
O(n2) 平方 总执行时间和值得数量有关,每个值至少获取n次

注意:获取常量和访问数组元素属于O(1),效率比获取对象属性(需要先在原型链中对拥有该名称的属性进行查找)要高。

    多次用到同一个属性时,存在局部变量中。

    优化循环

1 减值迭代:从最大值开始,而不是0

  2 简化终止条件:每次循环都要计算终止条件,避免O(n)操作

3 简化循环体:确保没有可以容易移除循环的密集计算

  4 使用后测试循环:避免最初终值条件的计算。(这种情况要保证至少有一个处理的值)

如果这些都做到了,就只能优化process()函数了

 展开循环

  process(values[0]);

process(values[1]);

process(values[2]);

这样避免了建立循环和处理终值条件的额外开销,是代码运行更快。

如果迭代次数不能定用Duff装置技术

避免双重解释

 容易产生的地方:eval()函数 Function()构造函数 setTimeout() 都会造成双重解析,而实例化一个新的解析器开销很大。

解决方法:尽量避免用eval()函数

     函数写成一般的函数,函数字表达式,函数声明。

     setTime 中传入函数作为第一个参数而不是包含js代码的字符串。

其他需要注意的地方

1 原生方法较快(用c/c++语言写出来的比js快)

2 Switch语句较快(可以代替大量使用if-else的时候)

3 按位运算符较快

三、最小化语句数

  单语句多操作比多语句但操作快,这句话的意思是,能写成一个语句就不要写成两个语句。比如说:

    1 多变量声明的时候

    

var i=5;
var color=‘purple‘;
var values=[1,2,3];
//可以写成
var i=5,color=‘purple‘,values[1,2,3];

   2 插入迭代

var name=values[i];
i++;
//换成这样
var name=values[i++];

3 定义数组和对象时尽量使用字面量。这样可以消除不必要的语句。(代码就不展示了,脑补吧。)

四、优化DOM交互

1 最小化现场更新

浏览器需要计算尺寸进行更新,所以越少越好

var list=document.getElementById(‘list‘);
 var item,i;
 for(i=10;i>=0;i--){
     item=document.createElement(‘li‘);
     list.appendChild(item);
     item.appendChild(document.creatTextnode(‘item‘+i));
 }
 //可以通过创建片段来减少现场更新
var list=document.getElementById(‘list‘);
fragment=document.createDocumentFragment();
 var item,i;
 for(i=10;i>=0;i--){
     item=document.createElement(‘li‘);
     fragment.appendChild(item);
     item.appendChild(document.creatTextnode(‘item‘+i));
 }
 list.appendChild(fragment);

2 需要大量创建DOM节点的时候,用innerHTML比createElement()和appendChild()快。

var list=document.getElementById(‘list‘);
html=‘‘;
for(i=10,i>=0;i--){
    html+=‘<li>item‘+i+‘</li>‘;
}
list.innerHTML=‘html‘;

3 使用事件代理(前面有一篇说过这个)

4 注意HTMLcollection

要尽量减少HTMLcollection的访问

var imags=document.getElementsByTagName(‘img‘);
 for(var i=0,len=imags.length;i<len;i++){
    //处理
 }
//将HTMLcollection的length属性存入一个局部变量,以后访问这个局部变量就可以了

这里说一下会产生HTNLcollection的地方

1 getElemenstByTagName()

2 childNodes

3 attributes

4 document.forms  document.images

终于总结完了(js高级程序设计)。。。以前写代码还真的没有考虑这么多,以后要把这些思想融入自己的代码中,养成一个好的习惯。

时间: 2024-08-11 10:31:19

js性能相关的相关文章

你不知道的Node.js性能优化,读了之后水平直线上升

本文由云+社区发表 "当我第一次知道要这篇文章的时候,其实我是拒绝的,因为我觉得,你不能叫我写马上就写,我要有干货才行,写一些老生常谈的然后加上好多特技,那个 Node.js 性能啊好像 Duang~ 的一下就上去了,那读者一定会骂我,Node.js 根本没有这样搞性能优化的,都是假的." ------ 斯塔克·成龙·王 1.使用最新版本的 Node.js 仅仅是简单的升级 Node.js 版本就可以轻松地获得性能提升,因为几乎任何新版本的 Node.js 都会比老版本性能更好,为什么

爬虫性能相关

性能相关 在编写爬虫时,性能的消耗主要在IO请求中,当单进程单线程模式下请求URL时必然会引起等待,从而使得请求整体变慢. import requests def fetch_async(url): response = requests.get(url) return response url_list = ['http://www.github.com', 'http://www.bing.com'] for url in url_list: fetch_async(url) 1.同步执行

JS性能优化

下面是一些关于客户端JS性能的一些优化的小技巧: 1.[顶]关于JS的循环,循环是一种常用的流程控制.JS提供了三种循环:for(;;).while().for(in).在这三种循环中 for(in)的效率最差,因为它需要查询Hash键,因此应尽量少用for(in)循环,for(;;).while()循环的性能基本持平.当然,推 荐使用for循环,如果循环变量递增或递减,不要单独对循环变量赋值,而应该使用嵌套的++或--运算符. 2.如果需要遍历数组,应该先缓存数组长度,将数组长度放入局部变量中

Oracle 性能相关常用脚本(SQL)

在缺乏的可视化工具来监控数据库性能的情形下,常用的脚本就派上用场了,下面提供几个关于Oracle性能相关的脚本供大家参考.以下脚本均在Oracle 10g测试通过,Oracle 11g可能要做相应调整. 1.寻找最多BUFFER_GETS开销的SQL 语句 [sql] view plain copy print? --filename: top_sql_by_buffer_gets.sql --Identify heavy SQL (Get the SQL with heavy BUFFER_G

gluster性能相关中继器默认值说明

一.性能相关中继器 write-behind, read-ahead, io-cache, quick-read, open-behind, stat-prefetch(md-cache), io-threads(默认server端) 以上中继器默认全部开启,symlink-cache默认关闭. NFS相关性能优化中继器 默认开启: performance.nfs.write-behind 默认关闭: performance.nfs.read-ahead performance.nfs.io-c

爬了个爬(二)性能相关 及 深度优先与广度优先

性能相关 在编写爬虫时,性能的消耗主要在IO请求中,当单进程单线程模式下请求URL时必然会引起等待,从而使得请求整体变慢. import requests def fetch_async(url): response = requests.get(url) return response url_list = ['http://www.github.com', 'http://www.bing.com'] for url in url_list: fetch_async(url) 1.同步执行

JS性能

获取以下属性  会等待对应元素渲染完成  才继续执行 * offsetTop, offsetLeft, offsetWidth, offsetHeight* scrollTop, scrollLeft, scrollWidth, scrollHeight* clientTop, clientLeft, clientWidth, clientHeight* getComputedStyle() (在IE中为currentStyle) PS 如果该元素display为none 或者其父元素displ

JS性能之滚动条之外的其他部分

问题: 如果一个页面宽高比较大,也就是页面需要滚动条来查看其他页面内容,这时候,在滚动条之外的其他部分,是依然处于运行状态. 比如那部分有视频播放,则那些视频虽然在当前窗口看不到,但它们还是会处于播放状态,也就是说在不停的消耗页面的资源! 解决方法: # 如果对于当页面没有滚动条,也就是一个页面可以完全显示所有内容的情况下,就没有必要去解决该问题了. 1 自己写个函数,专门用于监听页面的所有内容,如果某模块处于滚动条之外,则对该模块进行隐藏操作--display:none; JS性能之滚动条之外

js 性能优化 篇一

JS性能优化 摘自:http://www.china125.com/design/js/3631.htm 首先,由于JS是一种解释型语言,执行速度要比编译型语言慢得多.(注:,Chrome是第一款内置优化引擎,将JS编译成本地代码的浏览器,其它浏览器也陆续实现了JS的编译过程.但是,即使到了编译执行JS的新阶段,仍然会存在低效率的代码.)以下总结一些可以改进代码的整体性能的方法. 1.注意作用域 记住一点,随着作用域中的作用域数量的增加,访问当前作用域以外的变量的时间也在增加.所以,访问全局变量