首页 > 其他分享 >js性能

js性能

时间:2024-01-09 22:01:45浏览次数:30  
标签:性能 JavaScript 回收 js let 垃圾 Article 内存

垃圾回收程序会周期性运行,如果内存中分配了很多变量,则可能造成性能损失,因此垃圾回收的 时间调度很重要。尤其是在内存有限的移动设备上,垃圾回收有可能会明显拖慢渲染的速度和帧速率。

开发者不知道什么时候运行时会收集垃圾,因此最好的办法是在写代码时就要做到:无论什么时候开始 收集垃圾,都能让它尽快结束工作。 现代垃圾回收程序会基于对 JavaScript 运行时环境的探测来决定何时运行。

探测机制因引擎而异, 但基本上都是根据已分配对象的大小和数量来判断的。“在一次完整的垃圾回收之后,V8 的堆增长策略会根据活跃对象的数量外加一些余量来确定何时再次垃 圾回收。”

1. 内存管理:

在使用垃圾回收的编程环境中,开发者通常无须关心内存管理。不过,JavaScript 运行在一个内存 管理与垃圾回收都很特殊的环境。分配给浏览器的内存通常比分配给桌面软件的要少很多,分配给移动 浏览器的就更少了。

这更多出于安全考虑而不是别的,就是为了避免运行大量 JavaScript 的网页耗尽系 统内存而导致操作系统崩溃。这个内存限制不仅影响变量分配,也影响调用栈以及能够同时在一个线程 中执行的语句数量。

将内存占用量保持在一个较小的值可以让页面性能更好。优化内存占用的最佳手段就是保证在执行 代码时只保存必要的数据。如果数据不再必要,那么把它设置为 null,从而释放其引用。这也可以叫 作解除引用。

let globalPerson = createPerson("Nicholas"); // 解除 globalPerson 对值的引用
globalPerson = null;

变量 globalPerson 保存着 createPerson()函数调用返回的值。在 createPerson() 内部,localPerson 创建了一个对象并给它添加了一个 name 属性。然后,localPerson 作为函数值 被返回,并被赋值给 globalPerson。localPerson 在 createPerson()执行完成超出上下文后会自 动被解除引用,不需要显式处理。但 globalPerson 是一个全局变量,应该在不再需要时手动解除其 引用,最后一行就是这么做的。

不过要注意,解除对一个值的引用并不会自动导致相关内存被回收。解除引用的关键在于确保相关的值已经不在上下文里了,因此它在下次垃圾回收时会被回收。

1. 通过 const 和 let 声明提升性能:

let 都以块(而非函数)为作用域,所以相比于使用 var,使用这两个新关键字可能会更早地让垃圾回收程序介入,尽早回收应该回收的内存。在块作用域比函数作用域更早终止的情况下。

隐藏类和删除操作 根据 JavaScript 所在的运行环境,有时候需要根据浏览器使用的 JavaScript 引擎来采取不同的性能优 化策略。截至 2017 年,Chrome 是最流行的浏览器,使用 V8 JavaScript 引擎。V8 在将解释后的 JavaScript 代码编译为实际的机器码时会利用“隐藏类”。如果你的代码非常注重性能,那么这一点可能对你很 重要。 运行期间,V8 会将创建的对象与隐藏类关联起来,以跟踪它们的属性特征。能够共享相同隐藏类 的对象性能会更好,V8 会针对这种情况进行优化,但不一定总能够做到。比如下面的代码:

function Article() {
      this.title = 'Inauguration Ceremony Features Kazoo Band';
}
    let a1 = new Article();
    let a2 = new Article();

V8 会在后台配置,让这两个类实例共享相同的隐藏类,因为这两个实例共享同一个构造函数和原 型。假设之后又添加了下面这行代码:

a2.author = 'Jake';

此时两个 Article 实例就会对应两个不同的隐藏类。根据这种操作的频率和隐藏类的大小,这有 可能对性能产生明显影响。 当然,解决方案就是避免 JavaScript 的“先创建再补充”(ready-fire-aim)式的动态属性赋值,并在 构造函数中一次性声明所有属性,如下所示:

function Article(opt_author) {
      this.title = 'Inauguration Ceremony Features Kazoo Band';
      this.author = opt_author;
}
    let a1 = new Article();
    let a2 = new Article('Jake');

标签:性能,JavaScript,回收,js,let,垃圾,Article,内存
From: https://blog.51cto.com/u_16237074/9166556

相关文章

  • js垃圾回收
    JavaScript是使用垃圾回收的语言,也就是说执行环境负责在代码执行时管理内存。在C和C++等语言中,跟踪内存使用对开发者来说是个很大的负担,也是很多问题的来源。JavaScript为开发者卸下了这个负担,通过自动内存管理实现内存分配和闲置资源回收。基本思路很简单:确定哪个变量不会......
  • js 常量
    除了let,ES6同时还增加了const关键字。使用const声明的变量必须同时初始化为某个值。一经声明,在其生命周期的任何时候都不能再重新赋予新值。consta;//SyntaxError:常量声明时没有初始化constb=3;console.log(b);//3b=4;//TypeError:给常量赋值const除了......
  • js变量声明
    var声明会被拿到函数或全局作用域的顶部,位于作用域中所有代码之前。这个现象叫作“提升”3(hoisting)。提升让同一作用域中的代码不必考虑变量是否已经声明就可以直接使用。在实践中,提升也会导致合法却奇怪的现象,即在变量声明之前使用变量。下面的例子展示了在全局作用域中两段......
  • nextjs 一键部署ChatGPT 网页版
    ChatGPT的语境理解能力已经得到了大幅提升。它能够更好地理解你输入的问题或指令,并从中获取更多的上下文信息,以便给出更准确和相关的回答。无论是一般性的问题还是特定领域的知识,ChatGPT都能为你提供更有深度的答案Vercel官方打造的ChatGPT网页版代码特色Next.jsAppRouterReact......
  • 探讨JS混淆技术及其加密解密实例
    引言在当前计算机科学领域中,保护软件代码的安全性和隐私性变得愈发重要。为了防止黑客攻1击和恶意软件分析,开发人员采用各种技术来混淆和加密其代码,其中包括JS混淆技术。本文将介绍JS混淆技术的原理和应用,并提供一些相关的加密解密实例。一、JS混淆技术简介JS混淆技术是一种通过......
  • 优化CentOS 7.6的HTTP隧道代理网络性能
    在CentOS7.6上,通过HTTP隧道代理优化网络性能是一项复杂且细致的任务。首先,我们要了解HTTP隧道代理的工作原理:通过建立一个安全的隧道,HTTP隧道代理允许用户绕过某些网络限制,提高数据传输的速度和安全性。然而,由于数据需要在中间节点进行转发,因此可能会引入额外的延迟。优化网络性能......
  • 性能测试能力提升-基准、负载、压力、容量测试
    本篇文章,我们将主要介绍以下几方面的知识:基准测试、负载测试、压力测试、容量测试负载测试知识扩展:阶梯式加压压力测试知识扩展:稳定性、破坏性压测容量测试知识扩展:容量指标选取、容量规划、扩容手段;几个名词文字比较接近,大家经常听到,但是很容易搞混,因此杨叔下面逐一给大家列出了解......
  • Three.js——十五、Box3、相机动画、lookAt()视线方向、管道漫游案例、OrbitControls
    正投影相机正投影相机和透视相机的区别如果都以高处俯视去看整个场景,正投影相机就类似于2d的可视化的效果,透视相机就类似于人眼观察效果调整left,right,top,bottom范围大小如果你想整体预览全部立方体,就需要调整相机的渲染范围,比如设置上下左右的范围。使用场景:正投影可以......
  • 记一次JSF异步调用引起的接口可用率降低
    前言本文记录了由于JSF异步调用超时引起的接口可用率降低问题的排查过程,主要介绍了排查思路和JSF异步调用的流程,希望可以帮助大家了解JSF的异步调用原理以及提供一些问题排查思路。本文分析的JSF源码是基于JSF1,7.5-HOTFIX-T6版本。起因问题背景1.广告投放系统是典型的I/O密集型(I/......
  • JS加密/解密之常见的JS代码加密
    JS混淆加密是一种将JS代码转换为更难理解和阅读的格式的技术,目的是为了保护JS代码的版权和安全,防止被恶意修改或盗用。JS混淆加密通常包括以下几种方法:变量重命名:将变量名替换为随机的字母或符号,使得代码的逻辑难以跟踪。字符串加密:将字符串转换为十六进制或Unicode编码,或者使用自......