]现代网页主要构建于三大技术:HTML、CSS和JavaScript。JavaScript推动了交互式网页的发展;JavaScript执行速度慢也就意味着网页打开的速度慢。所以现在,人们做了大量的工作,努力改善JavaScript的性能,让我们能够拥有与台式机相同的功能,无论身处何处,都能轻松体验到强大的网页应用。
Gmail、Google Maps和Google Docs等网络应用程序均广泛使用JavaScript,借助快速高效的JavaScript引擎,各类系统的用户体验得到了极大改善。正是在此驱使下,2008年,谷歌创立了V8 JavaScript引擎项目。
V8是当前现代基准平台上速度最快的JavaScript引擎。与过去的引擎解析JavaScript的方式不同,V8采用了即时编译器生成和执行专门针对其运行的处理器量身定制的本机指令。生成的指令先缓存起来,避免重复生成代码产生的开销,不需要时可将其删除。
V8是目前许多重要应用程序采用的核心技术。谷歌超速浏览器Chrome和移动操作系统Android采用的就是V8 JavaScript引擎。惠普的移动操作系统webOS也不例外。同时,它还覆盖了诸多基于node.js架构的新酷服务器应用程序。
网页应用越来越移动化。有了iPhone、Android电话、平板电脑及其他设备,我们可以将台式机束之高阁了。运行于高速JavaScript引擎上的功能强大的网页应用程序让您得以从办公桌前解放出来,使移动办公或移动游戏成为可能。因此,JavaScript在移动设备上保持足够快的运行速度非常关键,这就要求在ARM处理器上的运行速度也要足够快。
谷歌V8引擎是一个开源项目,由许许多多编码者共同编写代码,其开发速度极快,每一天都会增加新的功能,每一天都有部分性能得到改善。过去的一年,ARM为这项努力给予了大力支持,让V8在ARM上达到超快的运行速度。
ARM为V8项目开发了许多大大小小的补丁程序,下面就是一些比较有趣的新增内容。
自ARM 11以来,返回堆栈就是ARM处理器的重要组成部分。它是地址和ARM/Thumb状态信息的小型堆栈,用于加速函数调用的返回。它的工作原理是在函数调用被识别后将地址推入堆栈,待函数返回值后再将其退栈。它可在代码调用多个函数时节省时钟周期。
但是,只有特定指令才能激活返回堆栈的推栈和退栈行为,这些指令列在处理器的《技术参考手册》中。例如,在Cortex-A9中,以下指令将被识别为ARM和Thumb状态下的调用和返回:
只有这些指令才能让返回堆栈得以使用。ARM首个专为V8开发的补丁让调用和返回指令保持一致,极大提高了性能。
现代ARM内核通过两种方式为浮点运算提供硬件支持。
JavaScript的本机数值类型是双精度浮点。因此, V8无法优化运算以使用整数,只有运用VFP加速计算。但为令其更加有效,V8必须直接支持VFP代码生成,而非承受重复调用库代码的沉重负担。
ARM提供了许多补丁来扩大VFP在V8中的运用,例如增加了一些VFPv3中出现的新功能,并将对这些新功能的支持添加到V8内置的ARM仿真器。
ARM 7版架构推出了新的指令来处理位字段,这在操作节省空间的打包数据结构时非常有用。
这些运算以前是通过使用掩码 (BIC) 和按位或 (ORR) 运算来执行的,因此,一个位字段指令只能替换两或三个传统指令。由于达到相同的效果所需代码减少,处理器的指令缓存能够得到更为有效地利用。
还有一个好处,开发JIT需要平衡生成代码的数量和质量与生成代码所花费的时间。用户则会体验到恼人的延时,即载入网页和能够使用网页之间的延迟。增加位字段可以改善这方面的状况,让JIT只需生成少量代码便能完成相同的运算。
2010年末,谷歌为V8推出了一项新技术,称为Crankshaft。它包含一个简单快速的编译器,外加一个较慢的可配置的优化编译器。我们开发了许多补丁程序,为Crankshaft在ARM中的应用提供支持,2011年3月,Crankshaft成为V8默认代码生成器,极大提升了许多基准平台的性能。
Crankshaft需要现代处理器,对于ARM而言,指的就是支持VFP的V7版架构;也就是ARM Cortex-A级处理器。
V8编码者的多项编码成果,包括ARM提供的补丁,在提升性能方面取得了丰盈硕果。我们已对ARM Cortex-A9系统上运行的V8引擎最新开发版本进行了基准测试,并将测试结果与一年前V8引擎产生的结果相比较,其结果相当惊人。
V8基准套件(第6版)包含用于调试V8引擎的七个测试基准,包括射线跟踪、正则表达式、加密及操作系统仿真测试。在硬件相同的情况下,性能提升了高达500%。
其他测试基准也带来同样的惊喜。Sunspider是一款包含非常简单运算集合的套件,较之一年前速度提升了逾50%。
Sunspider在现代、高性能JavaScript引擎问世之前就设计出来了,通常在遇到如今的JavaScript网络应用程序的时候较难获得性能上的増溢。
Kraken是Mozilla最近刚推出的测试基准,重点针对实际网页应用程序中可能遇到的较为重复性的任务,可承受的工作负荷远大于Sunspider;在执行时间方面,Kraken所需时间约比Sunspider长20倍。
在这一点上,ARM上搭载的V8也有令人叹为观止的性能増溢。基准测试表明,与一年前相比,在目前引擎上运行的速度提升了4倍多。能取得这个结果,Crankshaft可谓功不可没,因为它极为适合Kraken套件中的高密度的迭代循环。
谷歌还要花几个月的时间来整合与测试最新V8引擎与新设备之间的兼容性,所以要等到2011年下半年之后才能亲眼见证产品中这些性能的改善,但V8开发人员将继续提升引擎的速度,2012年,它的性能将会更加出色。
再往后,还将推出基于最新ARM内核Cortex-A15的设备,其先进的功能势必将JavaScript的速度推到新的高度。
ARM将在优化和支持新处理器这两方面一如既往地支持V8项目,但由于V8属于开源项目,任何感兴趣的ARM编码者贡献的有用补丁程序,我们都热烈欢迎。因此,如果你也想要投身到移动设备网络的发展之中,可以到谷歌软件仓库库查看代码,然后就开始向目标进发吧!
Martyn是处理器领域的资深软件工程师,已在ARM工作了近10年。他主要负责改善ARM平台上软件的性能和体验。他对使用汇编语言和SIMD实现软件优化非常感兴趣,尤其是在图形和多媒体领域。