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),仅供参考

相关新闻

本科毕设高分指南:深度学习人脸识别考勤系统全流程实现

本科毕设高分指南:深度学习人脸识别考勤系统全流程实现

简介:本资源是一套面向计算机专业本科生的深度学习实战项目,聚焦人脸识别考勤系统开发,专为毕业设计、课程设计及期末大作业打造。项目基于FaceNet深度学习算法实现高精度人脸特征提取与比对,完整覆盖人脸录入、实时识别、考勤统计…

2026/9/25 22:55:58 阅读更多 →
医学图像分割实践:CTSpine1K三切面脊椎分割与U-Net适配

医学图像分割实践:CTSpine1K三切面脊椎分割与U-Net适配

简介:面向医学图像分割研究与算法训练的骶骨脊椎CT分割数据集,源于CTSpine1K,覆盖轴位面、冠状面、矢状面三个切面,含5类语义标签。切片阶段剔除了ROI占比不足3%的低信息量图像,并使用医学影像常用窗宽窗位做对比度增强…

2026/9/25 16:39:45 阅读更多 →
EOSIO cleos create 命令完全指南:密钥对生成与链上账户创建

EOSIO cleos create 命令完全指南:密钥对生成与链上账户创建

区块链 【免费下载链接】eos An open source smart contract platform 项目地址: https://gitcode.com/gh_mirrors/eo/eos 点击查看 免费下载 导读 cleos create 是 EOSIO 命令行客户端提供的复合命令,用于在链下生成密钥对(key&#xff0…

2026/9/23 21:54:50 阅读更多 →

最新新闻

rsuite Calendar 自定义单元格样式:深入解析 cellClassName 的用法与实现原理

rsuite Calendar 自定义单元格样式:深入解析 cellClassName 的用法与实现原理

前端UI组件 【免费下载链接】rsuite 🧱 A suite of React components . 项目地址: https://gitcode.com/gh_mirrors/rs/rsuite 点击查看 免费下载 导读 本文围绕 rsuite 的 Calendar(日历)组件,重点讲解如何通过 ce…

2026/9/25 22:56:19 阅读更多 →
802.11ax调度机制全解析:OFDMA、MU-MIMO与TWT实战调优

802.11ax调度机制全解析:OFDMA、MU-MIMO与TWT实战调优

如果你最近在无线网络圈子里逛,应该会频繁看到“ax调度”这个词。“ax”就是 802.11ax,也就是 Wi-Fi 6 的技术代号,而“调度”才是 802.11ax 真正值钱的地方。很多人以为 Wi-Fi 6 只是“快了一点”,换了张网卡、开了 160MHz 频宽就…

2026/9/25 22:56:19 阅读更多 →
Windows下H.264解码库集成指南:从选型到踩坑

Windows下H.264解码库集成指南:从选型到踩坑

简介:这是一份面向Windows平台的H.264视频解码库资源,由开发者rapidly552整理分享,适合需要在应用程序中快速集成H.264解码能力的C/C工程师及视频技术学习者。该库严格基于AVC标准,实现了运动补偿、帧内预测、多参考帧、熵编码等核…

2026/9/25 22:56:19 阅读更多 →
C#控制台贪吃蛇实战:从数据结构到游戏循环的完整指南

C#控制台贪吃蛇实战:从数据结构到游戏循环的完整指南

简介:面向C#初学者的控制台贪吃蛇实战项目,以经典小游戏为载体,串联类、方法、变量、条件语句等核心语法,并完整覆盖控制台输入输出、按键捕获、主循环、碰撞检测、蛇身增长、随机食物生成、状态更新与字符画面重绘等关键开发环节…

2026/9/25 22:56:19 阅读更多 →
图书管理系统数据库设计与实现:E-R建模到SQLAlchemy落地

图书管理系统数据库设计与实现:E-R建模到SQLAlchemy落地

简介:本资源是一份面向高校数据库课程学习者与Python初学者的完整课程设计实践方案,聚焦图书管理系统的开发全流程,涵盖需求分析、数据库建模、后端逻辑实现与基础部署。压缩包共9个文件,含4个SQL脚本(books、admin、s…

2026/9/25 22:56:19 阅读更多 →
ZoneDeck进程冻结与效率模式指南:挂起进程省CPU降内存,后台视频游戏秒停

ZoneDeck进程冻结与效率模式指南:挂起进程省CPU降内存,后台视频游戏秒停

ZoneDeck进程冻结与效率模式指南:挂起进程省CPU降内存,后台视频游戏秒停 【免费下载链接】ZoneDeck The Ultimate Workspace Manager, Switch between work and life, seamlessly生活工作无缝切换,专业的桌面工作区管理助手 项目地址: http…

2026/9/25 22:54:18 阅读更多 →

日新闻

AI元人文:从工具使用到思维重构的深度探索

AI元人文:从工具使用到思维重构的深度探索

最近半年我一直在琢磨一件事:AI元人文到底是什么?说白了,就是“用元视角重新审视人与AI的关系”,也在“探索AI如何反向逼着我们发现自己的思考边界”。标题里的“元探索”,在我看就是一层套一层的追问——当你用AI解决…

2026/9/25 0:00:41 阅读更多 →
Python+CNN车牌识别实战:从数据预处理到模型训练与部署

Python+CNN车牌识别实战:从数据预处理到模型训练与部署

简介:基于Python与卷积神经网络的车牌识别项目,面向计算机视觉初学者及智能交通开发者,目标是帮助用户掌握从数据预处理、模型构建到实际部署的完整流程。压缩包共25个文件,包含jpg/png图像样本、py训练脚本、md说明文档、dat数据…

2026/9/25 0:00:41 阅读更多 →
Vim基础操作全攻略:保存退出、模式切换与高频命令实战

Vim基础操作全攻略:保存退出、模式切换与高频命令实战

1. 项目概述1.1 核心需求解析今天聊聊Vim。写这个题目的原因是:几乎每个后端开发者、运维人员、数据工程师某天都会遇到一个场景——深夜加班,服务器登录界面只有黑底白字,编辑器只有vi/vim,你必须在五分钟内完成一次配置修改并保…

2026/9/25 0:00:41 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/25 19:27:14 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/25 11:15:26 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/25 20:29:09 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/25 20:29:43 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/25 20:29:31 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/25 19:27:26 阅读更多 →