首页 web前端 js教程 高性能Javascript笔记 数据的存储与访问性能优化_javascript技巧

高性能Javascript笔记 数据的存储与访问性能优化_javascript技巧

May 16, 2016 pm 05:51 PM
数据存储

局部变量也就可以理解为在函数内部定义的变量,很明显访问局部变量要比域外的变量要快,因为它位于作用域链的第一个变量对象中(关于作用域链的介绍可以阅读这篇文章)。变量在作用域链的位置越深,访问所需要的时间就越长,全局变量总是最慢的,因为它们位于作用域链的最后一个变量对象。

每种数据类型的访问都需要付出点性能代价,对于直接量和局部变量基本都能消费得起,而访问数组项和对象成员则要代价高点。下图显示了不同浏览器,分别对这四种数据类型进行了200'000次操作所用的时间。

由上图可以看出,要想优化代码的性能,那么尽量使用直接量和局部变量,限制数组项和对象成员的访问次数(将对象成员用一个局部变量来保存)。

首先我们需要了解一下对象成员的访问过程。其实函数就是一个特殊的对象,所以对象成员的访问跟函数的内部变量的访问都差不多,都是基于链的查找,前者是原型链,后者是作用域链,只是怎么个链法有点差别而已。

对象成员包含属性和方法,如果该成员是一个函数就称为方法,否则就称为属性。
JavaScript中的对象是基于原形(原形本身就是一个对象)的,原形是其他对象的基础。当你实例化一个Object对象或其它JS的内置对象时(var obj=new Object() or var obj={}),实例obj的原形由后台自动创建,浏览器FF,safari,Chrome可通过obj.__proto__属性(等同于 Object.prototype)可以访问到这个原形,也正是因为这个原形,每一个实例都能共享原形对象的成员。如:
复制代码 代码如下:

var book = {   
name:"Javascript Book",   
getName = function(){     
return this.name;   
}
};
alert(book.toString()); //"[object Object]"

此代码中,book对象有两个私有成员,分别是属性name和方法getName。book对象并没有定义成员toString,但调用了也没有抛出错误,原因是book对象继承了原形对象的成员。book对象与原形的关系如下:

访问book对象成员toString的过程是这样的,当book.toString()被调用时,后台对成员进行名为”toString”的搜 索,首先从实例book本身开始,如果在book发现名为”toString”的成员,则搜索结束,否则继续向__proto__指向的原型对象搜索,如 果在Object的原形对象都找不到该成员,则表示该成员未定义。通过这种方式,book就可以访问它的原型对象所拥有的每个属性或方法。

对象的另一高级用法就是模拟类和继承类,我喜欢叫这样用法的对象为对象类。继承对象类主要就是依靠原型链来完成的,这个知识点太多需要另外详细 说明。通过上面的对象成员搜索过程,访问对象成员的速度,随着原型链的越深,搜索的速度就越慢。下图就显示了对象成员在原型链中所处的深度与访问时间的关 系:

由上图可清楚的知道,每深入原型链一层都会增加性能的损失,所以像那种遍历对象成员的操作开销很大。还有另外一种常用且损耗性能的做法就是嵌套对象 成员(如window.location.href),像这种最好的做法就是减少点的次数了。比如location.href就比 window.location.href快。

好了,总结起来就一句话:一个属性或方法在原型链的位置越深,访问它的速度就越慢。解决办法就是:将经常使用的对象成员,数组项和域外的变量存入局部变量中,然后访问这个局部变量。
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
2 周前 By 尊渡假赌尊渡假赌尊渡假赌
仓库:如何复兴队友
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

为什么localstorage无法成功保存数据? 为什么localstorage无法成功保存数据? Jan 03, 2024 pm 01:41 PM

存储数据到localstorage为何总是失败?需要具体代码示例在前端开发中,我们经常需要将数据存储在浏览器端,以便提高用户体验和方便之后的数据访问。Localstorage是HTML5提供的一项用于客户端存储数据的技术,它提供了一种简单的方法来存储数据,并且可以在页面刷新或关闭后保持数据的持久化。然而,当我们使用localstorage进行数据存储时,有时

MySQL中如何实现数据的多态存储和多维查询? MySQL中如何实现数据的多态存储和多维查询? Jul 31, 2023 pm 09:12 PM

MySQL中如何实现数据的多态存储和多维查询?在实际应用开发中,数据的多态存储和多维查询是一个非常常见的需求。MySQL作为常用的关系型数据库管理系统,提供了多种实现多态存储和多维查询的方式。本文将介绍使用MySQL实现数据的多态存储和多维查询的方法,并提供相应的代码示例,帮助读者快速了解和使用。一、多态存储多态存储是指将不同类型的数据存储在同一个字段中的技

如何在MongoDB中实现数据的图像存储和处理功能 如何在MongoDB中实现数据的图像存储和处理功能 Sep 22, 2023 am 10:30 AM

如何在MongoDB中实现数据的图像存储和处理功能概述:在现代数据应用程序的开发中,图像处理和存储是一个常见的需求。MongoDB作为一种流行的NoSQL数据库,提供了一些功能和工具使开发人员能够在其平台上实现图像存储和处理。本文将介绍如何在MongoDB中实现数据的图像存储和处理功能,并提供具体的代码示例。图像存储:在MongoDB中,可以使用GridFS

了解 Aerospike 缓存技术 了解 Aerospike 缓存技术 Jun 20, 2023 am 11:28 AM

随着数字化时代的到来,大数据已经成为了各行各业中不可或缺的部分。作为处理大规模数据的一种解决方案,缓存技术的重要性也日益凸显。而Aerospike正是一款高性能缓存技术,在这篇文章中,我们将会详细了解Aerospike缓存技术的原理、特点以及应用场景。一、Aerospike缓存技术的原理Aerospike是一款基于内存和闪存的Key-Value数据库,它采用

是什么类型的文件是dat文件? 是什么类型的文件是dat文件? Feb 19, 2024 am 11:32 AM

dat文件是一种通用的数据文件格式,它可以用来存储各种类型的数据。dat文件可以包含文本、图像、音频、视频等不同的数据形式。它被广泛用于许多不同的应用程序和操作系统中。dat文件通常是二进制文件,以字节形式存储数据,而不是以文本形式存储。这意味着dat文件不能直接通过文本编辑器来修改或查看其内容。相反,需要使用特定的软件或工具来处理和解析dat文件的数据。d

AI大模型时代,数据存储新基座助推教科研数智化跃迁 AI大模型时代,数据存储新基座助推教科研数智化跃迁 Jul 21, 2023 pm 09:53 PM

生成式AI(AIGC)开启了人工智能通用化的新纪元,围绕大模型的百舸争流蔚为壮观,算力基础设施是首要的竞逐焦点,而存力觉醒也日益成为业界共识。在新的时代,大模型从单模态走向多模态,参数和训练数据集的规模呈几何级数增长,海量的非结构化数据需要高性能混合负载能力的支撑;与此同时,数据密集型范式大行其道,超算、高性能计算(HPC)等应用场景迈向纵深,既有的数据存储基座已难以满足不断升级的需求。如果说算力、算法、数据是驱动人工智能发展的“三驾马车”,那么在外部环境发生巨大变化的背景下,三者亟需重新达成动

如何利用C++进行高效的数据压缩和数据存储? 如何利用C++进行高效的数据压缩和数据存储? Aug 25, 2023 am 10:24 AM

如何利用C++进行高效的数据压缩和数据存储?导言:随着数据量的增加,数据压缩和数据存储变得越来越重要。在C++中,有许多方法可以实现高效的数据压缩和存储。本文将介绍一些常见的数据压缩算法和C++中的数据存储技术,并提供相应的代码示例。一、数据压缩算法1.1基于哈夫曼编码的压缩算法哈夫曼编码是一种基于变长编码的数据压缩算法。它通过对频率较高的字符

Redis与Golang的交互:如何实现快速的数据存储和检索 Redis与Golang的交互:如何实现快速的数据存储和检索 Jul 30, 2023 pm 05:18 PM

Redis与Golang的交互:如何实现快速的数据存储和检索引言:随着互联网的快速发展,数据的存储和检索成为了各个应用领域中重要的需求。在这样的背景下,Redis成为了一种重要的数据存储中间件,而Golang则因其高效性能和简单易用的特点,成为了越来越多开发者的选择。本文将向读者介绍如何通过Redis与Golang进行交互,实现快速的数据存储和检索。一、Re

See all articles