资讯详情

Hermes nbody 基准测试解析:太阳系 N 体模拟中的浮点运算与对象属性访问

📅 2026/9/23 21:54:39 | 华诺云谱 👁 阅读
Hermes nbody 基准测试解析:太阳系 N 体模拟中的浮点运算与对象属性访问
语言运行时编译器移动开发【免费下载链接】hermesA JavaScript engine optimized for running React Native.项目地址https://gitcode.com/gh_mirrors/hermes/hermes点击查看免费下载本文围绕 Hermes 仓库中benchmarks/nbody目录的基准测试展开详解其源自 Computer Language Benchmarks Game 的太阳系 N 体模拟算法、原始版与类型标注版Flow / TypeScript的差异以及它在 Hermes 中验证浮点数值计算与对象属性读取性能时的用法。读完本文你将掌握该基准的算法结构、三个 JS/TS 变体的组织方式以及如何在本仓库中用hermes/shermes运行并核对预期输出。基准来源与定位benchmarks/nbody/README.md明确交代了该基准的来历它取自The Computer Language Benchmarks Game经典的语言性能对比项目代码由 Isaac Gouy 贡献、Andrey Filatkin 修改许可证为 BSD 3-Clause完整许可文本见 benchmarks/nbody/LICENSE.md。README 对该基准的定位只有一句话却点出了它要压测的两类核心能力Tests floating point numerical computation and reading properties from an object.即浮点数数值计算大规模连续的Math.sqrt、乘加运算、除法与开方混合的牛顿式积分从对象读取属性每一步迭代都反复读取Body实例的x / y / z / vx / vy / vz / mass七个属性。这两点恰好对应 JavaScript 引擎尤其是 React Native 场景下的 Hermes最常见的两种性能敏感路径数值运算管线和对象模型hidden class / 属性访问的效率。这也是它被选入 Hermes 基准集的原因——用一套物理上自洽、结果可验证的数值模拟来衡量引擎在这两条路径上的表现。目录结构一览benchmarks/nbody/ ├── README.md # 基准说明本文所依据的关联文档 ├── LICENSE.md # BSD 3-Clause 许可 ├── original/ │ └── nbody.js # 原始基准无类型标注函数构造器 Body └── fully-typed/ ├── nbody.js # Flow 类型标注版Body 改为 ES6 class └── nbody.ts # 由 Flow 版复制而来适配 TypeScript三个文件在算法上完全等价下文将逐一验证差别只在类型系统与对象建模方式上。算法结构40 万步的太阳系积分以 benchmarks/nbody/original/nbody.js 为例整个基准是一个立即执行的 IIFE核心由四部分组成。1. 物理常量const PI Math.PI; const SOLAR_MASS 4 * PI * PI; const DAYS_PER_YEAR 365.24;SOLAR_MASS 4π²是 Benchmarks Game 版本使用的经典单位制以“年”为时间单位、以“天文单位”为距离单位时太阳质量的归一化值DAYS_PER_YEAR用于把各行星的初始速度从“每天”换算为“每年”。2. Body七个属性的对象原始版使用经典的函数构造器模式function Body(x, y, z, vx, vy, vz, mass) { this.x x; this.y y; this.z z; this.vx vx; this.vy vy; this.vz vz; this.mass mass; }每个天体太阳、木星、土星、天王星、海王星通过Jupiter()、Saturn()等工厂函数以天文观测数据初始化例如木星function Jupiter() { return new Body( 4.84143144246472090e00, -1.16032004402742839e00, -1.03622044471123109e-01, 1.66007664274403694e-03 * DAYS_PER_YEAR, 7.69901118419740425e-03 * DAYS_PER_YEAR, -6.90460016972063023e-05 * DAYS_PER_YEAR, 9.54791938424326609e-04 * SOLAR_MASS ); }随后五个天体组成全局数组const bodies Array(Sun(), Jupiter(), Saturn(), Uranus(), Neptune());3. 三个核心函数offsetMomentum()计算系统总动量并把动量修正施加到太阳上bodies[0]使系统质心保持静止——这是 N 体模拟的标准初始化步骤其内部循环密集读取body.vx * body.mass等属性组合。advance(dt)双重循环对每对天体计算引力加速度。内层循环对每个bodyi/bodyj依次计算const dx bodyi.x - bodyj.x; const dy bodyi.y - bodyj.y; const dz bodyi.z - bodyj.z; const d2 dx * dx dy * dy dz * dz; const mag dt / (d2 * Math.sqrt(d2));然后按牛顿万有引力定律更新速度vxi - dx * massj * mag等 6 条循环结束后再统一推进位置body.x dt * body.vx。该函数是典型的 O(n²) 计算热点也是整个基准中浮点运算量最大的部分。energy()计算系统总能量包括动能项0.5 * mass * (vx² vy² vz²)与引力势能项-(massi * massj) / distance。注意它再次遍历全部天体对计算Math.sqrt求距离与advance构成对称的浮点密集代码。4. 主流程与输出function nbody() { const n 400_000; offsetMomentum(); for (let i 0; i n; i) { advance(0.01); } return energy(); } print(nbody());即先做动量偏移再以dt 0.01步长推进 40 万步约 4000 年最后输出系统能量。400_000使用数字分隔符语法属于较新的 ECMAScript 特性恰好也能检验解析器对该语法的支持。有趣的是类型标注版中保留了//const n 100;这行注释见 benchmarks/nbody/fully-typed/nbody.js供调试时快速缩短运行时间。类型标注版Flow 与 TypeScript 变体README 专门说明fully-typed目录下两个文件的来源与差异这是本基准在本仓库中最重要的工程价值——用同一份数值模拟代码对比同一引擎在无类型、Flow、TypeScript 三种输入下的行为差异例如 Hermes 的类型剥离、-typed编译路径等。fully-typed/nbody.jsFlow文件头声明// flow strict启用 Flow 严格模式常量显式标注const PI:number Math.PI;Body由函数构造器改写为 ES6 class七个字段逐一声明类型class Body { x: number; y: number; z: number; vx: number; vy: number; vz: number; mass: number; constructor(x: number, y: number, z: number, vx: number, vy: number, vz: number, mass: number) { this.x x; this.y y; this.z z; this.vx vx; this.vy vy; this.vz vz; this.mass mass; } }各工厂函数标注返回类型function Jupiter(): Bodybodies声明为const bodies: Body[] [...]offsetMomentum(): void、energy(): number等也全部标注。数字字面量写法也从4.84143144246472090e00精简为4.8414314424647209数值等价。fully-typed/nbody.tsTypeScript内容由 Flow 标注文件直接复制而来结构几乎一一对应唯一的差异点在于print()调用处仓库尚未提供内置函数如print()的 TS 类型声明因此使用// ts-ignore抑制类型错误// ts-ignore TODO: add the type declaration for print() print(nbody());这一点在 benchmarks/nbody/fully-typed/nbody.ts 中有明确注释也印证了 Hermes 的 TS 支持仍在逐步补齐内置声明TODO 留痕。从源码结构看该目录的定位是为“类型标注对引擎性能与正确性的影响”提供 A/B 素材同一算法、同一结果三种形态。在 Hermes 中运行与结果验证该基准的预期输出可以从测试用例中直接获得。仓库中 test/hermes/flow/nbody.js 是一份与fully-typed几乎同构的回归测试其 RUN 与 CHECK 指令给出了可复现的运行方式// RUN: %hermes -Werror -typed %s | %FileCheck --match-full-lines %s // RUN: %shermes -Werror -typed -exec %s | %FileCheck --match-full-lines %s // CHECK: -0.16907495402506745也就是说使用解释型 Hermeshermes -Werror -typed nbody.js使用 Static Hermes静态编译路径shermes -Werror -typed -exec nbody.js-exec表示编译后直接执行参见 agent-perf/tools/run_benchmarks.sh 中cmd(-exec $js_file)的用法两者输出都应与-0.16907495402506745一致。这个数值是太阳系系统能量含符号的确定性结果——40 万步推进后系统能量应基本守恒任何引擎若因浮点实现、对象布局或优化错误产生偏差都能被该断言立刻捕获。因此 nbody 既是性能基准也是数值正确性的回归测试。同类测试还出现在test/AST/ts2flow/nbody.ts类型转换相关用例中说明该基准在本仓库中被复用于多条测试链路。运行前提需先按 doc/BuildingAndRunning.md 构建出hermes或shermes可执行文件fully-typed/nbody.ts若要直接编译需留意其print()上的ts-ignore说明。小结压测对象明确浮点数数值计算 对象属性读取分别对应advance/energy的数学热区与Body七字段的高频访问三版本设计original无类型、函数构造器、fully-typed/nbody.jsFlow 严格模式、ES6 class、fully-typed/nbody.tsTS、ts-ignore处理print()结果可验证预期输出-0.16907495402506745由 test/hermes/flow/nbody.js 固化支持hermes -typed与shermes -typed -exec两条运行路径许可合规BSD 3-Clause见 benchmarks/nbody/LICENSE.md。对于希望深入 Hermes 性能调优对象模型优化、-typed编译路径、Static Hermes 静态执行的开发者nbody 是一份体量适中、物理自洽、结果可校验的理想样例改动引擎后跑一次它就能同时观察到数值正确性与浮点/属性访问两条性能曲线的变化。/DSMLparameter /DSMLinvoke /DSMLtool_calls赞分享语言运行时编译器移动开发【免费下载链接】hermesA JavaScript engine optimized for running React Native.项目地址https://gitcode.com/gh_mirrors/hermes/hermes点击查看免费下载相关推荐CUDA Samples 之 nbody基于 CUDA 的高性能引力 N 体全配对模拟实战解析CUDA Samples 之 nbody基于 CUDA 的高性能引力 N 体全配对模拟实战解析 本篇文章聚焦 CUDA Samples 仓库 cpp/5_D示例工程终极揭秘Hermes引擎对象模型如何实现React Native极致性能优化终极揭秘Hermes引擎对象模型如何实现React Native极致性能优化 Hermes是一款为React Native优化的JavaScript引擎其独语言运行时编译器移动开发Hermes MiniReact no-objects 基准实战在 Static Hermes 与 Hermes 上运行无对象版 React 内核Hermes MiniReact no objects 基准实战在 Static Hermes 与 Hermes 上运行无对象版 React 内核 Min语言运行时编译器移动开发创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。