Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 476|回复: 0

JS特性性能缺陷及JIT的解决方案

[复制链接]
  • TA的每日心情
    奋斗
    2024-11-24 15:47
  • 签到天数: 804 天

    [LV.10]以坛为家III

    2053

    主题

    2111

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    726782
    发表于 2021-4-28 13:41:02 | 显示全部楼层 |阅读模式

            拜读了David的《Know Your Engines: How to Make Your JavaScript Fast》,David是Mozilla的JS引擎工程师,文章主要介绍了JIT与GC原理,以及如何根据某些基本原理,优化js代码的执行效率,虽然是老文了,但对我来说仍受益匪浅。这里,我根据上文整理了本文,同时,大家也可以从侧面了解下JIT。

     

            近5年来,在主流浏览器上,Javascript的运行速度有10-100倍的提升,这要归功于Javascript新引擎JIT。但在深入了解JIT前,我们先看看Javascript的一个最重要的特性:untyped(无类型)。

     

    一. 无类型:

            Javascript是个无类型的语言,这导致了 x = y +z这种表达式,可以有很多含义。比如:

            (1)y,z是数字,则+表示加法。

            (2)y,z是字符串,则+表示字符串连接。

              ……

            而JS引擎内部则使用“细粒度”的类型,比如:32-bit* integer, 64-bit* floating-point,如图:

            2

            这就要求js类型-js引擎类型,需要做“boxed/unboxed(装箱/解箱)”,在处理一次x = y + z这种计算,需要经过的步骤如下:

            (1)从内存,读取 x = y + z的操作符。

            (2)从内存,读取 y,z。

            (3)检查y,z类型,确定操作的行为。

            (4)unbox y,z。

            (5)执行 操作符 的行为(唯一有效的步骤……)。

            (6)box x。

            (7)把x写入内存。

            只有(5)是真正有效的操作,其他都是为(5)做准备/收尾的,效率之低可见。javascript的untyped特性很好用,但也为此付出了很大的性能代价。

     

    二. 对象属性

    function f(obj) {
            return obj.a + 1;
    }

            在Js里,对象属性的访问是比较慢的。至于原因,要从Javascript对象存储说起,这里借用其他文章的一个图:

            4

            如上图,访问对象属性,需要先从本地变量表找到对象,然后遍历属性,如果在本对象的属性列表里没找到,再得从prototype里面一层层的找。不能直接索引,只能遍历,这就慢的原因。

     

    二. 2006版-Javascript引擎

            这版引擎在执行x = y + z时,就是执行了以上流程。它模块图如下:

            2013-02-06_170725

     

    三. 2011新版-Javascript引擎

            模块图如下:

            3

            可以看到,除了老版的解析器外,新引擎增加了JIT,以及Type-specializing JIT。

     

    1. JIT

            先看看JIT对untyped的优化,在JIT下,执行x = y + z流程:

            (1)从内存,读取 x = y + z的操作符。

            (2)从内存,读取 y,z。

            (3)检查y,z类型,确定操作的行为。

            (4)unbox y,z。

            (5)执行 操作符 的行为(唯一有效的步骤……)。

            (6)box x。

            (7)把x写入内存。

            其中,(1),(2) CPU帮我们搞定;(7)JIT把结果保存在寄存器里。

            但可惜不是所有情况都能使用JIT,上面看到,Front-end有3条分支,“一般的情况”可以走JIT分支,比如:number + number;string + string …,但特殊情况,比如:number + undefined就不行了,只能走旧解析器。

     

            除了针对untyped的优化,新引擎还对“对象属性”访问做了优化,解决方案叫:inline caching,俗称:IC。简单的说,就是做cache。优化流程直接看图:

            5

            这个相当于遍历cache list了,如果当list很大时,这种方案反而影响效率。下图是评测:

            7

     

    2. Type-specializing JIT

            从名称上可以猜到,这个引擎是处理typed类型(声明类型)变量的。厄……但Javascript都是untype类型的……

            Type-specializing JIT的解决方案是:

            (1)先通过扫描,监测类型。

            (2)通过编译优化(当然,他的优化对象不仅仅只是“类型”,还包括对JS代码的优化,但类型优化是核心的。),生成类型变量。

            (3)再做后续计算。

     

             来看看Type-specializing JIT的执行x = y + z流程吧:

            (1)从内存,读取 x = y + z的操作符。

            (2)从内存,读取 y,z。

            (3)检查y,z类型,确定操作的行为。

            (4)unbox y,z。

            (5)执行 操作符 的行为。

            (6)box x。

            (7)把x写入内存。

            高效的优化啊……当然,这也是有代价的,代价就是:前置的扫描类型,编译优化。所以Type-specializing JIT的应用是有选择性,选择使用这个引擎的场景包括:

            (1)热点代码。

            (2)通过启发式算法估算出来的有价值的代码……

       

            另外,有2点也需要注意:

            (1)当 变量类型 发生变化时,引擎有2种处理方式:

                    【1】少量变更,重编译,再执行。

                    【2】大量变更……还是交给JIT执行吧。

            (2)数组,object properties,闭包变量不在优化范畴之列。

     

            本文主要整理了JIT针对Javascript某些语言特性的优化方案,至于GC,以及更多Js代码优化建议,可查阅原文。

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-1-24 05:05 , Processed in 0.070756 second(s), 27 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表