iPhone XS JavaScript 性能飙升背后的秘密

2018 年 11 月 30 日

话题:前端JavaScriptiOS

对 JavaScript 性能基准测试的初步评估显示,iPhone XS 和 iPhone XS max 的性能甚至超过了 iMac Pro。基准测试使用了Speedometer 2.0,主要针对真实世界的数据帧加载场景进行了比较。

Ruby on Rails 作者、Basecamp 创始人兼首席技术官 David Heinemeier Hansson 在 Twitter 上发起了一个讨论:

在 Speedometer 2.0 JavaScript 基准测试中,iPhone XS 比 iMac Pro 速度更快。这是我测试过的最快的设备。比 iPhone 8/iPhone X 芯片高出 45%。苹果是如何做到这一点的?!

这条推文引发了关于如何实现这种性能改进的重要猜测。

curiosity.ai 首席技术官 Rafael Oliveira 评论说,苹果似乎优化了他们的 ARM JS 编译器,远远超过 Mac 上的 x86:

但这就是重点——苹果似乎并没有针对 x86 Safari 做那么多优化,但他们却在 ARM JS 编译器上花了大心思……并不是说他们的 CPU 不令人印象深刻,只是在进行 JS 基准测试时,差异似乎被夸大了。

软件工程师 Greg Parker 指出,最新的 ARM 指令集 ARMv8.3-A针对 JavaScript 做了性能改进

ARMv8.3 添加了一个从浮点数到整型的转换指令,超出范围的值按照 JavaScript 的方式处理。以前获取 JavaScript 语义的指令要慢得多。JavaScript 的数字默认是双精度的,所以它需要进行很多转换。

ARM 确实发布了很多称为更新,也就是ARMv8.3-A,包括对 JavaScript 数据类型转换的改进:

JavaScript 的数字使用的是双精度浮点格式。但是,它需要将这种公共数字格式转换为 32 位整数,以便执行位操作。从双精度浮点数到整数的转换以及检查转换的数字是否真的是整数是很经常发生的。

ARMv8.3-A 指令有助于将双精度浮点数转换为带符号的 32 位整数,以提高性能。

但事实证明,这并不是性能提升的原因,因为软件工程师 Saam Barati 解释说,iOS 12 的 Safari 还没有利用这些指令

从初步报告以来,基于 ARMv8.3-A 指令的改进已经被用在了 WebKit 的 Nightly 构建版本中,并且预计将在 Safari 的未来版本中使用。Barati 已经注意到了各种JetStream2测试结果的性能改进:

在 stanford-crypto-aes 提升 15%
在 stanford-crypto-pbkf2 提升 30%
在 stanford-crypto-sha256 上提升 97%

总体而言,如果不支持 ARMv8.3-A,预计这个修复将比当前版本的 Safari 增加 0.5-2%的整体性能提升。

Anandtech 的一份iPhone XS 性能报告表明,新的内存子系统最有可能是 JavaScript 性能得到显著提升的原因:

内存子系统对 403.gcc 部分有效,对 429.mcf、471.omnetpp、473.Astar 和 483.xalancbmk 基本有效,A12 性能也因此从 30%提升到 42%。很明显,新的缓存层次结构和内存子系统在这方面起到了很大作用,所以苹果能够在最近几代芯片上实现最重要的性能跳跃。

因此,尽管 ARM 改进对计算成本高昂的 JavaScript 运算很有用,但它们并不像内存子系统的改进那么重要。

因此,很多人都在问苹果何时将桌面电脑和笔记本电脑从英特尔转向 ARM,这是否会带来与今天类似的性能改进?

查看英文原文The Story behind Very Fast iPhone XS JavaScript Performance