高性能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无时不刻所要做的事情,提高对数据的访问效率对一般的小的程序来说,对性能并不会有明显的改善.但是对像淘宝这样项目巨大,访问量巨大的网站来说,一个数据访问效率的提高对性能来说可能产生很大提升. ...
随机推荐
- The Application does not have a valid signature
真机运行程序,报错(The application does not have a valid signature,如图 环境:Xcode7.3,使用cocoapods管理第三方库 如果确认证书没有问 ...
- Doker容器之间连接
第一个应用容器 $ sudo docker run --name=mysql_client1 --link=mysql_server:db -t -i kongxx/mysql_client /usr ...
- 【COCOS2DX-LUA 脚本开发之四】
使用tolua++编译pkg,从而创建自定义类让Lua脚本使用 本站文章均为李华明Himi原创,转载务必在明显处注明:(作者新浪微博:@李华明Himi ) 转载自[黑米GameDev街区] 原文链接: ...
- dede 文章列表页如何倒序排列
{dede:arclist row='6' typeid='18' orderway='asc'} <li>;<a href="[field:arcurl/]"& ...
- Java Web开发笔记
问题: 读取资源文件问题 servletContext.getRealPath() servletContext.getResouce().getPath() setvletContext.getRe ...
- Hibernate 中的DetachedCriteria。
今天看到项目中在Web层使用DetachedCriteria进行多条件查询操作,如果在web层做持久层操作,事物还存在吗?这是我第一反应,于是乎就去网上查资料了.结果发现即在web层,程序员使用Det ...
- string 和 stringbuffer的区别?
string和stringbuffer的区别其实是变量和常亮的关系,string和stringbuffer内部实现的原理不同,在修改string对象时会产生另外的对象,也就是说在内存中会有两个存储区域 ...
- MDwiki 调研
下载解压 然后 mv mdwiki.html index.html 创建 一个index.md 然后就可以直接访问http://example.com/ 直接把你的md文件放在目录里面就可以了 cer ...
- 调用http接口耗时过长。
利用CRUL命令简单分析请求细节所占用的时间吧 curl -o /dev/null -s -w %{http_code}:%{time_namelookup}:%{time_redirect}:%{t ...
- 多媒体开发之---h264格式slice_header
从Slice_Header学习H.264 写在前面: $ H.264我是结合标准和毕厚杰的书一块学的.看句法语义时最是头疼,一大堆的元素,很需要耐心.标准中在介绍某个元素的语义时,经常会突然冒 ...