JS代码优化工具Prepack

 

  最近,Facebook 发布 Prepack :一个优化 JavaScript 源代码的工具,实际上它是一个 JavaScript 部分求值器(Partvaluator),可在编译时执行原本在运行时的计算过程,并通过重写 JavaScript 代码来提高其执行效率。(西安尚学堂

  Prepack 用简单的赋值序列来等效替换 JavaScript 代码包中的全局代码,从而消除了中间计算过程以及对象分配的操作。对于重初始化的代码,Prepack可以有效缓存JavaScript解析的结果,优化效果最佳。

 

  下面五个概念可以帮我们更好的理解 Prepack 运行机制:

  抽象语法树(AST)Prepack运行在AST级别,使用Babel解析并生成JavaScript源代码。

 

  具体执行(Concrete Execution)Prepack 核心是一个JavaScript解释器,它与ECMAScript 5几乎完全兼容,而且紧密地保持与ECMAScript 2016语言规范的一致性,你可以将Prepack中的解释器视为完全参照JavaScript实现的。解释器能够跟踪并撤销包括所有对象Mutation在内的结果,从而能够进行推测优化(Speculative Optimization)。

 

  符号执行(Symbolic Execution)除了对具体值进行计算外,Prepack的解释器还可以操作受环境相互作用影响的抽象值。例如Date.now可以返回一个抽象值,你可以通过helper辅助函数(如__abstract())手动注入抽象值。Prepack会跟踪所有在抽象值上执行的操作,在遇到分支时,Prepack会执行并探索所有可能性。所以,Prepack实现了一套JavaScript的符号执行引擎。

 

  抽象释义(Abstract Interpretation)符号执行在遇到抽象值的分支时会分叉(fork),Prepack会在控制流合并点加入分歧执行(Diverged Execution)来实现抽象释义的形式。连接变量和堆属性可能会得到条件抽象值,Prepack会跟踪有关抽象值和型域(Type Domain)的信息。

 

  堆序列化(Heap Serialization)当全局代码返回,初始化阶段结束时,Prepack捕获最终的堆并按顺序排列堆栈,生成直观的JavaScript新代码,创建并链接初始化堆中可访问的所有对象。堆中的一些值可能是抽象值的计算结果,对于这些值,Prepack将生成原始程序完成计算所执行的代码。

 

  以下是官方提供的Prepack优化示例:

  

/* Hello World */// Input
(function () {function hello() { return 'hello'; }function world() { return 'world'; }global.s = hello() + ' ' + world();})();// Output
(function () {s = "hello world";})();/* 消除抽象税 */// Input
(function () {var self = this;['A', 'B', 42].forEach(function(x) {var name = '_' + x.toString()[0].toLowerCase();var y = parseInt(x);self[name] = y ? y : x;});})();// Output
(function () {_a = "A";_b = "B";_4 = 42;})();

 

  Prepack团队对未来的规划如下:

  1、短期

  稳定现有功能集,用于预优化(Prepack)React Native代码包

  集成React Native工具链

  根据React Native所用模块系统的假设来构建优化

  2、中期

  进一步优化序列化(Serialization),包括:消除不暴露特性(identity)的对象;消除未使用的导出属性,等等

  预优化每个函数、基本代码块、语句、表达式

  与ES6保持完全一致

  支持广泛的模块系统

  假设ES6支持某些功能,延迟完成或直接忽略Polyfill应用

  进一步实现Web和Node.js环境中的兼容性目标

  深入集成JavaScript虚拟机,改进堆反序列化过程,包括 :暴露“对象懒初始化”的概念 - 以一种JavaScript无感知的方式,在首次使用对象时对其进行初始化;通过专门的字节码提高普通对象创建的编码效率;将代码分为两个阶段:1) 非环境依赖阶段,虚拟机可以安全地捕获并恢复生成的堆;2)环境依赖阶段,通过从环境中获得的值执行所有剩余的计算过程来拼凑具体的堆,等等

  总结循环和递归

  3、长期 - 利用Prepack作为一个平台

  JavaScript Playground - 通过调整JavaScript引擎体验JavaScript特性,这些引擎由JavaScript所编写,托管在浏览器中;你可以把它想象成一个“Babel虚拟机”,实现了不能被编译的JavaScript新特性

  捕捉Bug - 发现异常崩溃、执行问题……

  效果分析,例如检测模块工厂函数可能的副作用或强制纯净注释

转载于:https://www.cnblogs.com/a31415926/p/6832199.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/468649.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

读Java并发编程实践记录_原子性_锁_同步容器详解_任务执行

原子性: 单独的,不可分割的操作 不要使用过期状态值来决策当下的状态, 一定要先检查再执行(不检查, 将引发数据修改,丢失)避免延迟初始化(懒加载: 先查看对象 null, 然后new), 有可能查看对象状态的时候, 对象已经new出来, 只不过还没将对象赋给引用避免复合操作, 例: count;…

和我一起探索嵌入式

1.本文为微信群管理员小磊投稿作品,作者计划编写一系列文章,该篇为第一篇,如果有做STM32的同学这将是一个非常好的系列教程,欢迎关注。我15年刚建立了一个BLE的QQ群,很有幸认识了小磊同学,一个非…

经纬度坐标系转东北天_大地坐标系(WGS-84)、地心地固坐标系(ECEF)与东北天坐标系(ENU)的相互转换C语言代码分享...

//ECEF ---> WGS84//pcg为WGS-84坐标系结构体指针,pcc为ECEF坐标系结构体指针void ECEFToWGS(PWGS pcg, PECEF pcc){double B0, R, N;double B_, L_;double X pcc->x;double Y pcc->y;double Z pcc->z;R sqrt(X * X Y * Y);B0 atan2(Z, R);while …

2.简易的登录页面(表单验证)(HTML+JavaScript+Jquery)

//HTML部分 <!DOCTYPE html><html> <head> <meta charset"UTF-8"> <title>登录页面</title> <link rel"stylesheet" type"text/css" href"css/login.css"/> <s…

Java NIO_I/O基本概念_Java中的缓冲区(Buffer)_通道(Channel)_网络I/O

I/O基本概念 缓冲区基础 缓冲区是I/O的基础, 进程使用read(), write()将数据读出/写入从缓冲区中; 当缓冲区写满, 内核向磁盘发出指令, 将缓冲区中数据写入磁盘中(这一步不需要CPU), 当磁盘控制器将缓冲区装满, 内核将缓冲区数据拷贝到进程中指定的缓冲区; 操作如下图: 当中…

跟一个大佬前辈交流了一下

&#xff11;.最近&#xff0c;跟我们公司的测试总监聊天&#xff0c;我随便问了下他几个问题&#xff0c;他也给出了答案&#xff0c;在这里随便聊下&#xff0c;希望给大家的职业生涯中有一些借鉴的作用。也能给新入职场的同学一些方向和指引。2.先介绍下这个技术总监&#x…

python获取目录树_Python读取文件目录树——os.walk

os.walk是Python的内置函数用来遍历文件目录树。[python]import osrootDir d:\assafor dirName, subdirList, fileList in os.walk(rootDir):print(Folder: %s % dirName)for fname in fileList:print(t%s % fname)import osrootDir d:\assafor dirName, subdirList, fileLis…

LINQ简记(1):基本语法

关于LINQ&#xff08;语言集成查询&#xff09;是.NET 3.5和Visual Studio 2008以上版本中引入的一种有趣的全新概念&#xff0c;语言版本有VB和C#&#xff0c;由于C#与.NET平台结合最为紧密&#xff0c;也是MS当初首推的语言&#xff0c;因此&#xff0c;本系列文章的示例代码…

我认识的一位前辈~

&#xff11;.我最近认识了一个老前辈&#xff0c;关注了我的公众号加了我的好友认识的&#xff0c;我想介绍一下这位前辈&#xff0c;不是因为他有多成功&#xff0c;也不是因为他给了我很多钱&#xff0c;我觉得他是一个在平常不过的人了&#xff0c;因为太过于平凡的思考方式…

软件测试缺陷等级划分_缺陷等级的各种划分方法 - 测试新客~~小懒~~ - 51Testing软件测试网 51Testing软件测试网-软件测试人的精神家园...

《缺陷等级标准》缺陷严重级别定义:o 最高级--导致运行中断(应用程序崩溃),预期的功能没有得到实现,测试工作无法继续进行等.o 紧急---事件非常重要,并且需要马上给予关注.o 高级---事件是重要的,并且应该在紧急的事件处理之后尽快得到解决.o 中级---事件是重要的,但是由于解决…

机器学习_决策树_ID3算法_C4.5算法_CART算法及各个算法Python实现

下面的有些叙述基于我个人理解, 可能与专业书籍描述不同, 但是最终都是表达同一个意思, 如果有不同意见的小伙伴, 请在评论区留言, 我不胜感激. 参考: 周志华-机器学习 https://blog.csdn.net/xiaohukun/article/details/78112917 https://blog.csdn.net/fuqiuai/article/d…

http数据绑定spring mvc详解

转载于:https://www.cnblogs.com/panxuejun/p/6834365.html

ESP32 入门教学,不入门,不教学

&#xff11;.Internet of things &#xff08;iot&#xff09;这个概念非常火&#xff0c;物联网是什么&#xff1f;把所有物品通过射频识别等信息传感设备与互联网连接起来&#xff0c;实现智能化识别和管理。 物联网通过智能感知、识别技术与普适计算、泛在网络的融合应用&a…

opencv检测相交点_OpenCV:曲线的检测与提取-0

//寻找曲线 &#xff1a;void findLines(Mat &binaryImg, vector> &outLines){//八邻域vector neighborPtVec;neighborPtVec.push_back(Point(-1,-1));neighborPtVec.push_back(Point(0,-1));neighborPtVec.push_back(Point(1,-1));neighborPtVec.push_back(Point(1…

一个从华为离职的朋友

1、我在之前的很多文章里面都谈到了我有一个过硬的华为朋友&#xff0c;我很少去炫耀自己有多厉害&#xff0c;认识了谁谁&#xff0c;但是我非常在意那些跟自己有过交情的朋友&#xff0c;这些朋友不是说你离开了就失去了&#xff0c;也不是你落魄了就不能吹水了&#xff0c;今…

(原)PyTorch中使用指定的GPU

转载请注明出处&#xff1a; http://www.cnblogs.com/darkknightzh/p/6836568.html PyTorch默认使用从0开始的GPU&#xff0c;如果GPU0正在运行程序&#xff0c;需要指定其他GPU。 有如下两种方法来指定需要使用的GPU。 1. 类似tensorflow指定GPU的方式&#xff0c;使用CUDA_VI…

机器学习_简单线性回归与多元回归方程原理推导_处理二值数据_最小二乘法解或梯度下降解多元回归方程(详细推导)以及Python代码实现_回归方程度量方式

下面的有些叙述基于我个人理解, 可能与专业书籍描述不同, 但是最终都是表达同一个意思, 如果有不同意见的小伙伴, 请在评论区留言, 我不胜感激. 参考: 周志华-机器学习 最小二乘法求解多元回归方程: https://blog.csdn.net/weixin_39445556/article/details/83543945 梯度下…

python逆序数的程序_计算逆序数(归并法)程序问题 (Python)

计算一个tuple里面的逆序数&#xff0c;用merge sort的办法。我写了以下代码&#xff0c;但是每次统计的时候&#xff0c;count设置为全局变量了&#xff1a;Count inversionInput: a sequence as tuple of integersOutput: The inversion number as an integer#Merge Sort Met…

手写Java线程池_超详细解说_绝对能运行_代码超详细注释

线程池 问题背景 只是单纯使用 new Thread(runnable).start(); 的方式创建线程, 将会导致严重的程序性能问题: 1.线程创建, 销毁需要消耗很大的系统资源; 2.虚拟机创建线程的数量是有限的; 2.线程调度切换也将使程序性能下降; 针对这些问题, 对线程数量进行管理, 有效地重复利…

分享一个非常 nice 的工具

最近有个问题&#xff0c;我需要经常使用远程连接工具&#xff0c;原因很简单&#xff0c;我需要控制另外一台电脑&#xff0c;我刚开始使用的是 teamviewer 这个软件&#xff0c;刚开始用的时间是非常爽的&#xff0c;不过有一天他给我来了个提示&#xff0c;说我的软件被商用…