V8是Google发布的开源JavaScript引擎,用C++编写,用于Google的Chrome浏览器。V8引擎可以独立运行,也可以嵌入到C++应用中。
JavaScript引擎V8已经发布了7.4版本,目前处于测试阶段。正式版将在几周内与Chrome 74稳定版一起发布。
这个版本带来了一些新功能,并大大提高了性能。
无JIT V8
V8现在可以在运行时不分配可执行内存的情况下执行JavaScript。关于这个新特性的细节,我们之前报道过:V8的新机制:JIT-less模式。
WebAssembly线程/原子
WebAssembly Threads/Atomics在非Android操作系统上启用,在chrom中可以通过chrom://flags/#
enable-web assembly-Threads启用。
该功能可以通过WebAssembly解锁用户计算机上多核的使用,从而在Web上实现新的计算密集型用例。
性能改进
使用不匹配参数的调用更快
在JavaScript中,调用函数时的参数数量与定义函数时的参数数量不同。不管参数是少还是多,都是完全有效的。同时,JavaScript函数可以通过参数对象、rest参数等获取实际参数。因此,JavaScript引擎必须提供获取实际参数的方法。在V8中,这是通过一种称为参数自适应的技术来实现的。
参数适配可以获得实际的参数,但是是以性能为代价的,而这种性能损失在现代前端和中间件框架中通常是不可避免的,因为太多的API都有可选参数或可变参数表。
7.4版本带来了解决这个问题的新特性。
在某些情况下,比如当被调用的函数处于严格模式时,既不使用参数也不使用rest参数,所以根本不需要参数自适应。现在V8在这种情况下直接跳过这个自适应过程,减少了60%以上的调用开销。
改进了本机访问器性能
Angular team发现,在Chrome中直接通过各自的get函数调用原生访问器(如DOM属性访问器)比在单态甚至巨态中访问属性要慢得多。这是因为在V8中,DOM访问器是通过函数#call()使用慢速路径调用的,而不是已经存在的用于属性访问的快速路径。
在此版本中,调用本机访问器的性能得到了提高,比访问综合状态属性快得多。效果如下:
解释器性能
在Chrome中,当下载一个大脚本时,它是通过在工作线程上流式解析的。此版本修复了在源流中使用自定义UTF-8解码的问题。修复后,流解析性能平均提高了8%。
在V8预解析器中发现了另一个问题:工作线程中的属性名出现了不必要的重复。删除这些重复数据后,流式解析器的性能提高了10.5%。
内存减少
字节码刷新
JavaScript源代码编译出来的字节占据了V8 heap 空的很大一部分,通常在15%左右,包括相关元数据。但是有很多函数只在初始化时执行或者编译后很少使用,这显然是一种浪费。
为了减少V8的内存开销,这个版本实现了一个新的字节码刷新功能,也就是说,如果编译后的字节码最近没有被执行过,那么在GC期间它将被从函数中清除。为了实现这一点,V8将跟踪函数段代码的年龄,在GC期间递增年龄,并在函数执行时将其重置为零。任何超过预设“老化阈值”的字节码的内存都将被下一个垃圾收集器取走,如果将来再次执行该函数,它将重新编译其字节码。
这种字节码刷新功能为Chrome用户节省了大量内存,并将V8堆中的内存量减少了5-15%,同时不会降低性能或显著增加编译JavaScript代码所花费的CPU时间。
本文来自倾听雪落投稿,不代表舒华文档立场,如若转载,请注明出处:https://www.chinashuhua.cn/24/557825.html