【Swift:定制代码解读定制核心】
为了深刻理解Swift,Anand Shimpi同学决定自己写代码(他爹是计算机科学教授),并求助于北卡罗来纳州大学的天才移动开发者Nirdhar Khazanie,将其C语言代码转换成了一个iPhone应用,还得到了一个可以设定指令和数据集大小的框架,一切就简单了。
为了验证Swift是否有第三个整数ALU单元,首先设置一个独立的整数加法循环,所有变量均彼此无关,可以最大程度地并行化,然后在iPhone 4S/5上算它几百万次。
结果同频下Swift只快了不到10%,平均延迟也只缩短了两个时钟周期,这就可以排除第三个整数ALU单元的存在了。
结合苹果自己的文档可以进一步证实,Swift只有两个整数ALU单元,每时钟周期可以执行三个操作,暗示解码器也是3宽度的,但不清楚性能提升是否与此有关。
再看浮点方面,将之前的代码改成单精度和双精度浮点加法就行了。
单精度的反而有所倒退,证明从800MHz到1.3GHz不可能完美线性提升,而在双精度下,Cortex-A9变慢了,Swift却加快了1.2倍,自然差距极大。这说明,苹果极有可能增加了第二个浮点单元,来改进FMA或者双精度浮点性能,也可能是所用代码可以利用218-bit NEON。
自己写的代码毕竟不可能完全靠谱,所以还得看看标准测试工具的。首先是大名鼎鼎Linpack的iOS移植版,对比性能和问题大小(problem size):
虽然曲线不是特别平滑,但很明显,Swift的浮点性能优势非常大,即便是问题大小很小的时候,这证实了有关第二个浮点发射端口的猜测。
再对比800MHz原始频率的iPhone 4S:
A6在问题大小变大的时候性能损失显然更小,证明Swift可以更好地对付内存延迟,并发浮点和内存操作都很棒。
最后是iOS下另一个常用的基准测试Passmark:
五个项目都有了大幅度的提升,其中整数47%、浮点118%、质数109%、qsort字符串22.8%、加密51%、压缩17.9%。