V8 7.4支持JIT-less模式,不需要可执行内存也能执行JavaScript

V8引擎团队发布最新版7.4,这个版本支持JIT -less模式,让JavaScript不需要可执行内存也能执行,同时还改善了函数调用的效率,也增加内存使用效率。 V8引擎每六个月发布一个V8新版本,而这个最新的V8 7.4将会在几个星期内布署到Chrome 74稳定版中。

V8 7.4现在支持在Runtime的时候,执行JavaScript不需要使用可执行的内存。开发团队提到,由于在部分平台像是iOS、智能电视以及游戏机台,禁止非特权应用程序写入访问可执行的内存,因此到现在为止,这些平台都无法使用V8引擎,而V8新的JIT-less模式解决了这个问题,当使用jitless标签启动V8时,V8可以在没有任何可执行内存分配下执行,V8引擎团队还提到,禁止写入可执行内存,能够减少应用程序的可攻击面。

这个新版本也从各方面改善了执行性能,包括加速参数不相符时的函数调用,而解析器的性能也提高了。在JavaScript中调用函数的时候,传递少或是多过声明的形式参数是有效的语法,在V8是通过参数适应技术完成这样的功能,但是参数适应技术却会牺牲性能,而且会经常性的在前端以及中介框架发生。

在改进之后,现在引擎于部分情况下,能够知道参数适应技术并非必要,也就是被调用的函数处在严格模式不使用参数,系统无法观察实际参数的时候,而在这种情况下,V8现在会完全跳过参数适应技术,将调用成本降低60%。

而在Chrome中,较大的脚本是以串流的方式在Worker线程中,边下载边解析,在V8 7.4版本,原始来源串流使用了定制化UTF-8解码,可以加速整体解码工作,使得串流解析快了8%。另外,V8引擎团队还在预解析器中,解决了属性名称重复的bug,可以让串流解析器性能提高10.5%,同时也能改进非串流解析脚本的时间。

除此之外,新版V8引擎还改进了内存使用效率,开发团队提到,JavaScript源码编译的字节码很占空间,约占据V8堆(Heap)空间15%,但是其中有许多函示只在初始化期间才会用到,或是编译后被使用的机率很低。为了减少V8内存使用,这些函数的字节码会被标上年龄,并在执行的时候将年龄重置为零,因此当函数年龄超过阈值,在垃圾收集器执行时该字节码就可能被清除。

使用了这个新的字节码回收算法后,V8堆内存使用量明显下降5到15%,而且也不会降低性能,或是明显增加编译JavaScript程序代码所花费的CPU时间。