手机版

编写高性能JavaScript(翻译)

时间:2021-10-07 来源:互联网 编辑:宝哥软件园 浏览:

译者注:当我第一次翻译一门外语时,我的文字难免有些晦涩,但我会尽力表达作者的原意。没有过多的润色,我欢迎批评和指正。此外,本文篇幅长,信息量大,可能难以消化。请留言讨论细节。本文主要关注V8的性能优化,部分内容并不适用于所有JS引擎。最后请注明出处:)。

==================================.

很多JavaScript引擎,比如谷歌的V8引擎(Chrome和Node使用),都是专门为需要快速执行的大型JavaScript应用而设计的。如果您是开发人员,并且关心内存使用和页面性能,那么您应该知道用户浏览器中的JavaScript引擎是如何工作的。无论是V8、SpiderMonkey的(火狐)Carakan(Opera)、Chakra(IE)还是其他引擎,这样做都可以帮助你更好地优化应用。这并不是说它应该针对特定的浏览器或引擎进行优化。千万不要这样。

但是,你应该问自己几个问题:

在我的代码中,你能让代码更高效吗?一些主流的JavaScript引擎做了哪些优化?发动机不能优化什么?垃圾收集器(GC)能回收我期望的东西吗?

fast_memory

加载一个快速网站就像一辆快速跑车,需要专门定制的零件。图片来源: dHybridcars。

编写高性能代码时有一些常见的陷阱。在本文中,我们将展示一些经过验证的更好的编写代码的方法。

00-1010如果你对JS引擎没有深入的了解,开发一个大规模的Web应用是没有问题的,就像会开车的人只看引擎盖而不看引擎盖里的引擎一样。既然Chrome是我浏览器的首选,那就来说说它的JavaScript引擎吧。V8由以下核心部分组成:

一个基本的编译器,它解析JavaScript代码,并在代码执行之前生成本机机器代码,而不是执行字节码或简单地解释它。这些代码一开始并没有高度优化。V8将对象构建为对象模型。在JavaScript中,对象被表示为关联数组,但在V8中,对象被视为隐藏类,一种用于优化查询的内部类型系统。运行时分析器监控正在运行的系统,并识别“热”函数(如需要长时间运行的代码)。优化编译器重新编译和优化运行时分析器识别为“热”的代码,并执行“内联”和其他优化(例如,用被调用方的主体替换函数调用的位置)。V8支持去优化,这意味着如果优化编译器发现代码优化的假设过于乐观,就会丢弃优化后的代码。V8有一个垃圾收集器,所以了解它的工作原理和优化JavaScript一样重要。00-1010垃圾回收是内存管理的一种形式,实际上是一种收集器的概念,试图回收不再使用的对象所占用的内存。在JavaScript这种垃圾收集语言中,应用程序中仍被引用的对象将不会被清除。

在大多数情况下,手动消除对象引用是不必要的。通过简单地将变量放在需要它们的地方(理想情况下,它们尽可能是局部的,也就是说,放在使用它们的函数中,而不是函数的外层),一切都会很好地工作。

robot-cleaner

robot-cleaner

垃圾收集器试图回收内存。图片来源:瓦尔特里MKI。

在JavaScript中,强制垃圾收集是不可能的。您不应该这样做,因为垃圾收集过程是由运行时控制的,运行时知道什么是清理的最佳时间。

那么,JavaScript在V8里是如何工作的?

网上有很多关于JavaScript内存回收的讨论,都是关于关键字delete的。虽然可以用来删除地图中的关键点,但有些开发者认为可以用来强行“消除引用”。建议尽可能避免使用delete。在下面的例子中,删除o.x弊大于利,因为它改变了o的隐藏类,使其成为“慢速对象”。

var o={ x : 1 };删除o.x//真o.x//undefined你可以很容易的在流行的JS库中找到引用删除——,这是有语言学目的的。这里应该注意避免在运行时修改“热”对象的结构。JavaScript引擎可以检测到这种“热”对象,并尝试对其进行优化。如果一个对象的结构在其生命周期内没有发生很大的变化,那么引擎会更容易对该对象进行优化,而删除操作实际上会触发如此大的结构变化,不利于引擎优化。

对于null的工作原理也有误解。将对象引用设置为null并不会使对象“为空”,只是将其引用设置为空。使用o.x=null比使用delete要好,但这可能不是必需的。

var o={ x : 1 };o=nullo;/

版权声明:编写高性能JavaScript(翻译)是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。