热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

V8TurboFan生成图简析

 

 

一、简介

v8 turbolizer 有助于我们分析 JIT turbofan 的优化方式以及优化过程。但我们常常对于 turbolizer 生成的 IR 图一知半解,不清楚具体符号所代表的意思。以下为笔者阅读相关代码后所做的笔记。

 

二、TurboFan Json 格式




  • --trace-turbo 参数将会生成一个 JSON 格式的数据。通过在 turbolizer 上加载该 JSON,可以得到一个这样的IR图:


  • 其中,该 JSON 的格式如下:

    {
    "function": "opt_me",
    "sourcePosition": 109,
    "source": [js source],
    "phases": [
    {
    "name": "Typed",
    "type": "graph",
    "data": {
    "nodes": [
    [...],
    {
    "id": 20,
    "label": "FrameState[INTERPRETED_FRAME, 11, Ignore, 0x1a5acd4aa5e9 ]",
    "title": "FrameState[INTERPRETED_FRAME, 11, Ignore, 0x1a5acd4aa5e9 ]",
    "live": true,
    "properties": "Idempotent, NoRead, NoWrite, NoThrow, NoDeopt",
    "pos": 178,
    "opcode": "FrameState",
    "control": false,
    "opinfo": "5 v 0 eff 0 ctrl in, 1 v 0 eff 0 ctrl out",
    "type": "Internal"
    },
    [...]
    ],
    "edges": [
    {
    "source": 100,
    "target": 101,
    "index": 0,
    "type": "control"
    },
    [...]
    ]
    }
    },
    [...]
    ],
    "nodePositions": {
    [...]
    }
    }

    简单的概括一下,就是:


    • function: 函数名称

    • sourcePosition:代码的起始位置。

    • source: 当前 turboFan 优化的 JS 代码

    • phases: turboFan 的各个优化阶段

      • 优化阶段1

        • name: 当前优化阶段的名称

        • type:显示的形式,是 graph IR 图还是 文本。

        • data: 当前阶段真正存放的结点与边的数据。

          • nodes: 结点数据

            • 结点1

              • id: 结点ID,通常是一个数字

              • label:结点标签

              • title:结点主题

              • live: 当前结点是否是活结点,为 true / false

              • properties:当前结点的属性

              • pos:暂且不说

              • opcode:当前结点的操作码,例如End

              • control:当前是否是控制结点,为 true / false

              • opinfo:具体的结点信息,通常表示当前结点的ValueInputCount、EffectInputCount、ControlInputCount、ValueOutputCount、EffectOutputCount、ControlOutputCount

                表示方式如下:

                “\ v

                \ eff
                \ ctrl in,
                \ v
                \ eff
                \ ctrl out"

                例如:”0 v 1 eff 1 ctrl in, 0 v 1 eff 0 ctrl out”





            • [其他结点]



          • edges:边的数据

            • 边1

              • source:边的源节点 ID

              • target:边的目标节点ID

              • index:当前边连接到目标节点的哪个输入

              • type:当前边的类型,例如 control、value、effect等等



            • [其他边]







      • [其他优化阶段]



    • nodePositions:每个结点在 JS 源码中所对应的代码位置



 

三、Node



a. 属性说明

以下是截取出的一个 Node 示例:

{
"id": 128,
"label": "LoadField[+16]",
"title": "LoadField[tagged base, 16, Internal, kRepTaggedPointer|kTypeAny, PointerWriteBarrier]",
"live": true,
"properties": "NoWrite, NoThrow, NoDeopt",
"pos": 388,
"opcode": "LoadField",
"control": false,
"opinfo": "1 v 1 eff 1 ctrl in, 1 v 1 eff 0 ctrl out",
"type": "Internal"
}

对应的结点如下:

一一对应以下便可以看出,其中的 id、label、title、properties、opinfo 以及 type 均显现在图中。

而 live、pos、opcode 以及 control 字段则是给 turbolizer.js 使用的。

注意到上图中的 “Inplace update in phase: Typed”,其中的 phase 则是 turbolizer.js 动态分析出的,不在 JSON 中记录。



b. 颜色

我们可以注意到,IR图中的结点都有颜色,其中颜色貌似符合某种规律。

通过查阅 turbolizer.js 以及 在线 turbolizer 的 css 代码,turbolizer 将结点分为了以下几种结点,并设置了不同的颜色加以区分:


  • Control 结点:对于那些控制结点, 即 JSON 数据中 control 字段为 true 的结点,其颜色为黄色

  • Input 结点:那些 opcode 为 Parameter 或 Constant 结点,其颜色为浅蓝色

  • Live 结点(这其实不能算一类结点):即 live 字段为 true 的结点。其反向结点——DeadNode——的颜色会在原先颜色的基础上进行浅色化处理,例如以下图片。图片中的两个结点其类型相同,所不同的是左边的结点是 Dead,右边结点是 Live。

  • Javascript结点:那些 opcode 以 JS 开头的结点,其颜色为橙红色

  • Simplified 结点:那些 opcode 包含 Phi、Boolean、Number、String、Change、Object、Reference、Any、ToNumber、AnyToBoolean、Load、Store,但不是 Javascript类型的结点。其颜色如下所示:

  • Machine 结点:除了上述四种结点以外,剩余的结点。颜色如下所示:

 

四、Edge

Edge 中的 Type 共有五种,分别是 valuecontextframe-stateeffectcontrol 以及最后一个 unknown。

以下是这些边的一些例子:


a. value 边

对于该边:

{
"source": 80,
"target": 83,
"index": 4,
"type": "value"
}

其边的视觉效果如下:

可以看到,对于 Value 边来说,是一条实线


b. context 边

对于该边:

{
"source": 4,
"target": 49,
"index": 3,
"type": "context"
}

视觉效果如下:

可以看到,Context边也是一条实线。但在当前这个例子中,由于 Context 边只会由 Parameter[%context#4]结点发出,因此不会与 Value 边混淆

这里需要注意一下,Context 边只会存在于某个 Context 结点发出的所有边,即不会出现结点既发出 Context 边又发出 Value 边的情况。

如果有还请指正。



c. frame-state 边

例子:

{
"source": 50,
"target": 49,
"index": 4,
"type": "frame-state"
}

视觉效果:

可以看到,对于一条 frame-state 边,其视觉效果是一条 疏虚线

frame-state 边一定是由一个 FrameState 结点发出的。

上图的另一条虚线是密虚线,所不同的是虚线的疏密程度



d. effect 边

例子:

{
"source": 114,
"target": 49,
"index": 5,
"type": "effect"
}

视觉效果:

effect 边的显示效果是 密虚线


e. control 边

例子:

{
"source": 31,
"target": 49,
"index": 6,
"type": "control"
}

视觉效果:

注意:与 value 边相同,control 边的显示效果也是一条实线。这意味着单单只看 IR 图的话,是无法将 Control 边和 Value 边区分开的。

 

五、参考的源码



  • v8/tools/turbolizer/build/turbolizer.js

  • v8/src/compiler/graph-visualizer.cc



推荐阅读
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • Android JSON基础,音视频开发进阶指南目录
    Array里面的对象数据是有序的,json字符串最外层是方括号的,方括号:[]解析jsonArray代码try{json字符串最外层是 ... [详细]
  • springmvc学习笔记(十):控制器业务方法中通过注解实现封装Javabean接收表单提交的数据
    本文介绍了在springmvc学习笔记系列的第十篇中,控制器的业务方法中如何通过注解实现封装Javabean来接收表单提交的数据。同时还讨论了当有多个注册表单且字段完全相同时,如何将其交给同一个控制器处理。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
author-avatar
zoey
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有