
語言運行時編譯器移動開發(fā)【免費下載鏈接】hermesA JavaScript engine optimized for running React Native.項目地址https://gitcode.com/gh_mirrors/hermes/hermes點擊查看免費下載本文基于 Hermes 官方博客 2024 年 11 月 9 日的技術報告doc/blog/2024-11-09-octane-benchmark-jit-progress.md完整解讀 Hermes 團隊對非類型化untyped / legacyJavaScript的性能優(yōu)化進展。文章以 Octane 基準測試為主線對比原版 Hermes、static_h 分支、static_h JIT 與參考引擎 QuickJS 在樹莓派平臺上的實測表現(xiàn)并結合當前倉庫的 JIT 源碼與后續(xù)博客數(shù)據(jù)幫助讀者理解 Hermes JIT 的當前能力、測量方法與底層實現(xiàn)脈絡。背景typed JS 之外的另一條戰(zhàn)線Static Hermesstatic_h 分支的核心目標是讓類型化 JavaScript達到接近原生的性能。但現(xiàn)實世界的 JavaScript 代碼大量是非類型化的——未標注類型、未經(jīng)過 Flow/TypeScript 注解的 legacy 代碼在 React Native 生態(tài)中依然廣泛存在。Hermes 團隊在推進 typed JS 的同時并行投入了大量精力提升 untyped JS 的性能這篇 Octane 報告正是這條戰(zhàn)線的進度快照。正如后續(xù)博客 Static Hermes Update, December 2024 所總結的盡管 Static Hermes 的首要目標是 typed JavaScript 的原生級性能但團隊認識到大量 untyped 代碼也必須被正確且高效地執(zhí)行。而 Hermes Compilation and Runtime Modes 進一步說明Hermes 的編譯/運行模式可以混合共存于同一運行時AOT 編譯為字節(jié)碼、AOT 編譯為原生代碼、字節(jié)碼解釋器、首次調(diào)用時的懶編譯源碼到字節(jié)碼以及對高頻執(zhí)行函數(shù)做 Baseline JIT字節(jié)碼到原生——本篇報告的 JIT 正是其中的 Baseline JIT。測試設計四種引擎配置、兩個硬件平臺本次基準測試的方法學設計如下維度配置被測引擎原版 Hermesmain 分支、static_h 分支解釋器、static_h JIT、static_h 強制 JIT圖例中標注為SH -Xforce-jit參考引擎QuickJS作為性能參考基線硬件平臺Raspberry Pi 3 與 Raspberry Pi 5覆蓋較大跨度的性能區(qū)間代碼形態(tài)全部為 untyped、unannotated JS不使用 native backend即不走類型化 AOT 原生代碼路徑基準套件Octane分數(shù)越高越好一個重要的測試口徑調(diào)整是TypeScript 基準被移除了原因是其分數(shù)過高會壓扁圖表中其他基準的對比效果。同時Octane 基準套件在倉庫中的組織方式見 benchmarks/octane/README.md每個基準文件都被整理為單個完整可執(zhí)行的文件并在文件末尾調(diào)用BenchmarkSuite.RunSuites觸發(fā)運行其中gbemu.js合并了 part1/part2typescript.js合并了編譯器與輸入zlib.js則把原本通過eval()包裹的字符串體改寫為print()直出后經(jīng) prettier 格式化。結果解讀Raspberry Pi 3 與 Pi 5原報告提供了兩張實測圖表分別對應 Raspberry Pi 3 與 Pi 5。兩張圖橫軸均為 Octane 的各單項基準Mandelbrot、Richards、DeltaBlue、Crypto、RayTrace、EarleyBoyer、Splay、NavierStokes、PdfJS、Mandreel、Gameboy、Box2D、zlib 等縱軸為 Octane 分數(shù)圖例以不同顏色區(qū)分 QuickJS、Hermes、SH branch、SH -Xforce-jit 四種配置。從兩張圖表可以觀察到橫向對比在多數(shù)單項基準中開啟 JIT 的 static_h 配置相對于原版 Hermes 均有明顯提升部分高負載場景如 Gameboy、Box2D、Mandreel提升幅度尤為突出硬件差異Raspberry Pi 5 的整體分數(shù)顯著高于 Pi 3可達數(shù)倍至十倍以上說明引擎優(yōu)化與硬件算力在此類純計算負載上是疊加生效的參考基線QuickJS 作為高質(zhì)量、小體積且規(guī)范合規(guī)的參考實現(xiàn)見 2025-07-15-static-h-performance-june-2025.md 對 QuickJS 定位的說明在部分場景中仍保持領先這為 Hermes 的后續(xù)優(yōu)化提供了明確的追趕目標。需要強調(diào)的是原文檔明確指出Octane 在現(xiàn)代已不具備代表性但如果我們在更重要的場景上表現(xiàn)優(yōu)秀而在 Octane 上表現(xiàn)糟糕那也是不可接受的——Octane 被當作性能下限的守門基準而非終極目標??v深數(shù)據(jù)static_h 相對主分支的逐項提升倍數(shù)在同一主題的后續(xù)報告中Static Hermes Update, December 2024團隊給出了 static_h 分支相對主 Hermes 分支的 Octane 提升倍數(shù)times x1 表示更快。Normal 列為解釋器模式JIT 列為開啟 JIT 后的結果最后三個基準是團隊自加的定制項用于突出展示 JIT 在類型信息可用時的爆發(fā)力BenchmarkNormalJITRichards1.241.78DeltaBlue1.291.86Crypto1.341.91RayTrace1.722.07EarleyBoyer1.491.71RegExp1.201.20Splay1.221.33SplayLatency1.091.15NavierStokes1.501.87PdfJS1.681.78Mandreel1.381.69MandreelLatency1.361.42Gameboy1.361.68Box2D1.411.93zlib1.652.04Typescript1.281.46InterpDispatch1.662.97InterpDispatch21.587.90Mandelbrot1.253.29這份表格揭示了兩個關鍵信息解釋器本身也在進步絕大多數(shù)基準在純解釋器模式下就有 1.2x~1.7x 的提升這來自 static_h 分支對 untyped JS 的解釋執(zhí)行優(yōu)化JIT 的放大效應取決于類型信息在 InterpDispatch27.90x與 Mandelbrot3.29x中編譯器能夠靜態(tài)推斷出大量類型JIT 因此獲得數(shù)量級的加速。報告明確指出配合 typed JavaScript 時這些數(shù)字預計還會進一步攀升——這印證了 typed JS 與 untyped 優(yōu)化是相輔相成的兩條主線。源碼側支撐當前倉庫中的 JIT 實現(xiàn)脈絡報告中的 JIT 能力在當前倉庫中可以看到完整的實現(xiàn)痕跡。JIT 的核心代碼位于 lib/VM/JIT/頂層基礎設施DiscoverBB.cpp基本塊發(fā)現(xiàn)用于識別可 JIT 的函數(shù)控制流、RuntimeOffsets.h運行時對象字段偏移表、PerfJitDump.cpp配合 perf 的 JIT 符號轉儲用于性能分析arm64 后端lib/VM/JIT/arm64/ 是目前倉庫中唯一的指令集后端包含JIT.cpp主控文件與一組按指令類別劃分的發(fā)射器JitEmitter-alloc.cpp寄存器分配、JitEmitter-arith.cpp算術、JitEmitter-array.cpp數(shù)組、JitEmitter-call.cpp調(diào)用、JitEmitter-const.cpp常量、JitEmitter-control.cpp控制流、JitEmitter-env.cpp環(huán)境/閉包、JitEmitter-object.cpp對象、JitEmitter-property.cpp屬性訪問、JitEmitter-regalloc.cpp寄存器分配等以及JitHandlers.cpp/hJIT 處理函數(shù)入口。從源碼結構可以推斷這是一套面向 arm64 的字節(jié)碼到原生代碼的 Baseline JIT通過把解釋器的熱點函數(shù)按基本塊切分DiscoverBB并逐類發(fā)射原生指令配合顯式的寄存器分配regalloc與運行時字段偏移RuntimeOffsets來保證生成代碼與 GC/解釋器布局一致。這與 Hermes Compilation and Runtime Modes 描述的 Baseline JITbytecode to nativeof frequently executed functions 完全對應——即 JIT 只針對被頻繁執(zhí)行的函數(shù)觸發(fā)與字節(jié)碼解釋器共存于同一運行時。此外倉庫的 test/jit/ 目錄下有 46 個 JS 測試文件用于驗證 JIT 路徑的行為正確性由于 JIT 是運行時后端的組成部分其測試同樣依賴test/lit.cfg定義的標準測試運行框架。在倉庫中復現(xiàn)與深入若想親身體驗 Octane 基準測試倉庫已在 benchmarks/octane/ 內(nèi)置了整套可獨立執(zhí)行的基準文件box2d.js、crypto.js、deltablue.js、earley-boyer.js、gbemu.js、mandreel.js、navier-stokes.js、pdfjs.js、raytrace.js、regexp.js、richards.js、splay.js、typescript.js、zlib.js 等并在 benchmarks/octane/README.md 中說明了這些文件的整理方式——它們來自 Octane 的 fork被修改為單文件可執(zhí)行形態(tài)便于直接灌入 Hermes 的編譯器/運行時進行測試。Octane 之外倉庫還提供了更貼近現(xiàn)代工作負載的基準體系宏基準與微基準位于 agent-perf/benchmarks/配套的自動化測試位于 agent-perf/tests/關于 static_h 分支在 2025 年 6 月底相對 QuickJS 的最新性能形態(tài)hv32jit 與 hv32interpreter 兩種配置可參閱 Static_h Branch Performance: June 2025 Update其中 hv32 表示運行時采用壓縮指針并對超出 32 位標簽的數(shù)值做堆內(nèi) boxed double詳見 Hermes Memory Modes。結論與局限這篇 2024 年 11 月的報告是 Hermes JIT 路線圖中的一個里程碑快照在純 untyped、無注解的 JavaScript 上static_h JIT 相對原版 Hermes 在 Octane 全量基準上取得了普遍且顯著的提升且提升幅度隨可靜態(tài)推斷的類型信息增多而放大QuickJS 則提供了持續(xù)可比的參考基線。同時必須清醒認識其局限Octane 并非現(xiàn)代代表性負載報告中亦直言 Octane is not representative these days它衡量的是引擎性能的地板而非天花板。對 Hermes 而言JIT 的真正價值在于與 typed JS 協(xié)同——當類型信息充足時如 InterpDispatch2 的 7.90x 所示JIT 才能發(fā)揮最大威力。從該報告到 2025 年 6 月的 hv32jit 數(shù)據(jù)doc/blog/2025-07-15-static-h-performance-june-2025.md可以看到這條主線仍在持續(xù)推進。贊分享語言運行時編譯器移動開發(fā)【免費下載鏈接】hermesA JavaScript engine optimized for running React Native.項目地址https://gitcode.com/gh_mirrors/hermes/hermes點擊查看免費下載相關推薦從零到精通Hugging Face深度強化學習實戰(zhàn)全攻略從零到精通Hugging Face深度強化學習實戰(zhàn)全攻略 你是否曾經(jīng)看著那些炫酷的AI游戲玩家想象著自己也能訓練出如此智能的代理或者你是否在復雜的強化學習強化學習深度學習教程基于圖像識別技術的鳴潮自動化工具完整配置指南基于圖像識別技術的鳴潮自動化工具完整配置指南 鳴潮自動化工具ok ww是一款基于Python開發(fā)的游戲輔助工具采用圖像識別技術實現(xiàn)后臺自動化操作。該項目通GUI 自動化計算機視覺RPA人工智能終極性能對比RPiPlay在樹莓派Zero到4B上的全面基準測試指南終極性能對比RPiPlay在樹莓派Zero到4B上的全面基準測試指南 RPiPlay是一款開源的AirPlay鏡像服務器專為樹莓派設計支持iOS 9及以上音視頻后端創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考