高性能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无时不刻所要做的事情,提高对数据的访问效率对一般的小的程序来说,对性能并不会有明显的改善.但是对像淘宝这样项目巨大,访问量巨大的网站来说,一个数据访问效率的提高对性能来说可能产生很大提升. ...
随机推荐
- 如何在 Linux 下大量屏蔽恶意 IP 地址
很多情况下,你可能需要在Linux下屏蔽IP地址.比如,作为一个终端用户,你可能想要免受间谍软件或者IP追踪的困扰.或者当你在运行P2P软件时.你可能想要过滤反P2P活动的网络链接.如果你是一名系统管 ...
- sessionStorage / localStorage
var referurl = document.referrer; //上级网址 if(referurl.indexOf('address_order')>0){ //判断是否是从上一级地址跳转 ...
- asp.net core mvc视频A:笔记3-3.Model与强类型视图
创建项目,添加TestController 定义一个类(Model),并赋值 建立视图页面 注意:Model是一个特定的对象,取决于传递过来的参数 运行结果 到现在为止,依然没有改变动态类型,需要转换 ...
- CSS遮罩层,全兼容
<script type="text/javascript"> $(function(){ $('#divLocker').css({ "position&q ...
- C/C++ 内存管理总结
C内存管理 存储时: 执行程序在存储时(没有调入到内存)分为代码区(text).数据区(data)和未初始化数据区(bss)3个部分. 1 代码区(text segment) 存放CPU执行的机器指令 ...
- Debug与Trace工具类的应用
在写Console程序的时候,能够使用Console.WriteLine()来时时的输出程序的执行状态和各种參数此刻的信息.可是假设是Windows Form程序,我们要怎样实时的观測程序的执行状况呢 ...
- centos6.5安装Apache+MySQL+PHP
一.安装 MySQL 首先来进行 MySQL 的安装.打开超级终端,输入: [root@localhost ~]# yum install mysql mysql-server 安装完毕,让 MySQ ...
- HDU3351 Seinfeld 【贪心】
Seinfeld Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total S ...
- Android Studio gradle 文件中 ${supportLibVersion} 用法
一般我们在项目中的gradle会添加如下库文件 dependencies { compile 'com.android.support:appcompat-v7:23.1.0' compile 'co ...
- /etc/cron.d添加定时任务脚本后不生效
原因:定时任务脚本中的命令中包含了环境变量,crontab不能读取到环境变量. vim /etc/cron.d/mymon #mymon内容如下: * * * * * root cd $GOPATH/ ...