高性能js之数据访问性能
js中si中基本数据访问:
直接量, 变量, 数组项, 对象成员
性能问题:
首先要理解作用域链的基本概念,例如,当一个函数被创建时,就会产生一个激活对象(AO对象),AO对象中存储了该函数中所有的属性和值。当然对应的全局对象也会存在一个作用域,新创建的作用域位于全局对象作用域的顶部,形成类似链子一样的作用域链,当访问函数中某个属性时,从作用域链的顶部开始查找是否有该属性,若有则直接用之,若没有,则继续作用域链的下一个对象,直到找到为止,若在作用域链中不存在该属性,则返回undefined。
还有一个是原型链,原型链就是一个构造函数的祖先,构造函数创建的实例对象有自己的独特属性,还共同拥有者从原型继承而来的公共属性。而原型也是一个对象,原型的原型就Object(),这就形成一个原型链,访问对象的某个属性时,先看构造函数是否有该属性,若有则用之,若没有,则看构造函数的原型是否有该属性,然后原型的原型,知道最后的Object(),若都没有,则返回undefined
1.访问直接量和变量比访问数组项和对象属性速度要快,所有尽量少的访问数组和对象(注意:这不是说不让访问,而是对同一个数组项或对象属性不要重复访问,可以将第一次访问结果存储到局部变量中fang,下次直接访问局部变量)
2.作用域链和原型链,访问的属性位于作用域链或原型链层次越深,访问之所需时间就越多,即速度就越慢,同理,将第一次访问结果存储到局部变量中,下次直接访问局部变量即可。
3.with可以更改作用域链顶部对象,导致其他对象作用域降低一级,所以with能不用就别用。
4.try{}catch(e){...},在catch中也会改变作用域链,将异常对象作为作用域链的顶部,导致其他作用域的变量访问变慢(注意:只要catch子句执行完毕,作用域链就会返回之前状态),但catch在很多地方还是很有用的,所以可以将异常对象作为参数参数处理函数,这样只有一条语句,没有局部访问,作用域链被改就不会影响代码性能。
5.闭包:当在一个函数内形成闭包,导致两个问题,首先,闭包中包含该函数的应用导致该函数无法被销毁,结果就是内存泄漏.此为内存问题。然后,闭包被执行时,闭包作用域称为作用域链第一作用域,每次闭包访问该函数内的属性时就会产生一些性能损失。
6.对象成员嵌套:对象成员中还可以包含成员,例如:window.location.href , 这种访问,每多一个点间隔,访问层次就越深,所需事件就越多,速度就越慢,所以最好将第一次访问结果存储到一个局部变量中,下次访问直接访问局部变量即可。消除了重复访问同一属性的性能问题。数组类似。
基本目的:
尽量以最快的速度访问到数据;
解决基本原理 :
用局部变量存储第一次访问结果,下次访问直接访问局部变量,提高访问速度性能。
高性能js之数据访问性能的更多相关文章
- Javascript高性能编程-提高数据访问速度
hasOwnProperty()仅检索实例不检索原型,in即检索实例,又检索原型 成员嵌套越深,访问速度越慢,只在必要的情况下使用对象成员. 如果在同一个函数中你要多次读 ...
- 数据访问层DAL(数据库访问抽象类DataProvider)
晒晒数据访问层DAL,看看你的项目数据访问层使用的是什么形式,数据访问性能比较 采用什么样的数据访问形式是软件编码很重要的一个环节,良好的数据访问形式不仅能够提搞代码的执行效率,协作能力,更重要的是对 ...
- (转)SQLServer_十步优化SQL Server中的数据访问一
原文地址:http://tech.it168.com/a2009/1125/814/000000814758_all.shtml 第一步:应用正确的索引 我之所以先从索引谈起是因为采用正确的索引会使生 ...
- 高性能Javascript--高效的数据访问
接上一篇,希望能写一个高性能Javascript专题. 第一篇:高性能Javascript--脚本的无阻塞加载策略. 参考摘录<高性能Javascript>. 经典计算机科学的一个问题是, ...
- 分享自己的超轻量级高性能ORM数据访问框架Deft
Deft 简介 Deft是一个超轻量级高性能O/R mapping数据访问框架,简单易用,几分钟即可上手. Deft包含如下但不限于此的特点: 1.按照Transact-SQL的语法语义风格来设计,只 ...
- 高性能JavaScript笔记一(加载和执行、数据访问、DOM编程)
写在前面 好的书,可能你第一遍并不能领会里面的精魂,当再次细细品评的时候,发现领悟的又是一层新的含义 (这段时间,工作上也不会像从前一样做起来毫不费力,开始有了新的挑战,现在的老大让我既佩服又嫉妒,但 ...
- 超轻量级高性能ORM数据访问组件Deft,比dapper快20%以上
超轻量级高性能ORM数据访问组件Deft,比dapper快20%以上 阅读目录 Deft简介 Deft 核心类介绍 Deft 3分钟即可上手使用 其他可选的配置参数 性能测试 Demo代码下载 回到顶 ...
- 如何在数据访问层上提高js的执行效率
本文讲到的是如何从数据访问层面上提高JS 代码的执行效率.总的来讲有以下几条原则: 函数中读写局部变量总是最快的,而全局变量的读取则是最慢的: 尽可能地少用with 语句,因为它会增加with 语句以 ...
- js数据访问的艺术
数据访问js无时不刻所要做的事情,提高对数据的访问效率对一般的小的程序来说,对性能并不会有明显的改善.但是对像淘宝这样项目巨大,访问量巨大的网站来说,一个数据访问效率的提高对性能来说可能产生很大提升. ...
随机推荐
- 点击tablecell中的一个按钮,确定cell所在的行
- (void) del:(UIButton *) button { NSLog(@"%s",__FUNCTION__); UITableViewCell * cell = (UI ...
- tcpdump command
工作中一直在用tcpdump,感觉非常方便,今天心血来潮百度了一下tcpdump的用法,才发现原来还有这么多强大的功能自己都不知道,那叫一个汗啊. 以此文作为备份,记录一些新知道的用法,各位网友谁有新 ...
- CentOS4.5下LVS方案
环境描述:本文在配置LVS时使用三台linux,一台做Directorserver (192.168.0.25) ,两台做realserver(192.168.0.127 192.168.0.12,在 ...
- Android採用async框架实现文件上传
页面效果 须要的权限 <uses-permission android:name="android.permission.INTERNET"/> 网络訪问权限; 布局文 ...
- 细说Redirect重定向请求(情节分享)
前些日子在开发公司项目接口的时候,由于需要与第三方平台对接,由于接口之前的层层封装,不断的需要转发,把人差点搞糊涂了.本来以为之前对Redirect的认识足够清楚,可是到实际开发之前我还是没 ...
- string 和 stringbuffer的区别?
string和stringbuffer的区别其实是变量和常亮的关系,string和stringbuffer内部实现的原理不同,在修改string对象时会产生另外的对象,也就是说在内存中会有两个存储区域 ...
- android 国际化 设置
复制了他人的方法 方法和步骤 1 配置选项包括语言代号和地区代号.表示中文和中国的配置选项是 zh-rCN; 表示英文和美国的配置选项是en-rUS.其中,zh 和 en 表示中文和英文: 2 如果想 ...
- 嵌套SQL语句訪问DB2中SQLCA的调用技巧
在IBM的关系型数据库产品DB2中,使用SQL Communication Area(SQLCA)将程序中嵌套的SQL语句执行情况返回给程序. 在程序中有针对性地对SQLCA实施调用,可对程序中各类S ...
- local variable 'xxx' referenced before assignment(犯过同样的错)
这个问题很囧,在外面定义了一个变量 xxx ,然后在Python的一个函数里面引用这个变量,并改变它的值,结果报错local variable 'xxx' referenced before assi ...
- <转载> 为什么在Python里推荐使用多进程而不是多线程?
经常我们会听到老手说:“Python下多线程是鸡肋,推荐使用多进程!”,但是为什么这么说呢? 要知其然,更要知其所以然.所以有了下面的深入研究: 首先强调背景: ...