javascript
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
總結
以上是生活随笔為你收集整理的JS代码优化工具Prepack的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【模拟电路】PID简介
- 下一篇: js ajax 异步上传图片,javas