一个全新的JavaScript引擎诞生了:V8引擎(Google新推出的Chrome浏览器就用到了它)。
市面上有一大堆的JavaScript引擎(光是浏览器所常用的那些就已经够多的了):
1. JavaScriptCore:Safari/WebKit(Safari 3.1以前的版本)用的是这个引擎。
2. SquirrelFish:该引擎用于Safari 4.0。注意:最新的WebKit nightly for Windows在Dromaeo测试中会崩溃,所以暂时就无视它吧。
3. V8:该引擎用于Google Chrome。
4. SpiderMonkey:Firefox(Firefox 3.0或更早的版本)用的是这个引擎。
5. TraceMonkey:3.1以及更高版本的Firefox将使用这个引擎(现在已经有了,只是默认被禁用了而已)。
6. Futhark:该引擎用于Opera 9.5及其更高版本中。
7. IE Jscript:Internet Explorer用的就是这个引擎了。
关于上述浏览器的性能测试已经有很多了,其中有些测试还包括了刚出锅的Chrome。我们很有必要仔细地研究一下这些测试,并尝试找出它们所关注的测试目标及其测试结果具体对应于哪些实际的网页性能。
本文将要讨论的测试平台有以下三种:
SunSpider:它是较为流行的JavaScript性能测试平台,由WebKit团队开发;仅测试JavaScript引擎(不含渲染及DOM操作)的性能;拥有许多的测试类型(如对象、函数调用、数学、递归……等等)。
V8 Benchmark:它是由V8团队开发的一种性能基准测试平台,仅测试JavaScript性能(尤其关注递归的性能测试)。
Dromaeo:该测试平台由Mozilla开发,用于测试JavaScript、DOM以及JavaScript Library的能;拥有大量的测试类型,其中大部分用于分析DOM和JavaScript库的性能。
SunSpider
我们先来看看WebKit的SunSpider测试结果(它有着大量的纯JavaScript功能)。下图为详细的测试结果:
可以发现,这是一条由Chrome开始逐步向上的曲线(无视早期的Internet Explorer)。显然,Chrome是最快的(不过,这里并没有包含针对TraceMonkey引擎的测试结果)。
昨天晚上,Brendan Eich将最新的TraceMonkey代码搞了出来,并把它跟V8放在一起做了个比较。
可以发现,TraceMonkey(开发了约两个月)的性能要比V8(开发了约两年)好一些。
这里,TraceMonkey的最大问题在于其递归回溯的能力。目前,递归调用时还没有任何的回溯(这就使得TraceMonkey在递归时要比V8慢差不多10倍)。当递归回溯功能加入到Firefox 3.1之后,我相信上面那个结果仍然会出现的。
Google Chrome Benchmark
Chrome团队发布了他们自己的用于分析JavaScript性能的测试平台。它含有一些新的测试(即不同于SunSpider的那些),而且有着非常变态的递归:
通过这些测试,我们可以发现Chrome直接秒杀了其他浏览器。这些测试是否能够说明真实的浏览器性能呢?这个问题还是有待商榷的,因为它只是高度关注了JavaScript中的一些细节功能而已。
注意,TraceMonkey表现得很差:由于没有递归回溯,因此它在这里占不到任何便宜(就像前面所解释的那样)。
Dromaeo with DOM
最后,我们来更全面地看看JavaScript的性能。我一直在维护Dromaeo测试平台,已经添加了大量新的DOM和JavaScript库测试。它能够提供更加权威的浏览器性能报告,即关注浏览器在进行正常的Web浏览时的性能表现。
考虑到大部分网页都受制于DOM的性能(想想table sorter之类的东西就明白了)而不是JavaScript的性能(如游戏、图形等),因此很有必要仔细看看这些扩展分析的结果。
针对JavaScript、DOM以及库测试的分析结果(多谢Asa Dotzler帮我搞掂了这些测试):
(比较郁闷的是,这里没有IE的测试结果,因为该浏览器在测试时崩溃掉了。另外,我在Windows上运行WebKit的各种nightly版本(包括Squirrelfish)时也遇到了麻烦,参见Bug 20626。)
这里,我们看到了一张非常不同的图。基于WebKit的引擎都有着绝对的领先优势,而Chrome则仅次于最新版的Safari。跟一般的Firefox相比,使用了TraceMonkey的Firefox会有小幅的性能提升。在回溯被应用到DOM结构操作上之前,其全部的潜力是发挥不出来的(其实它现在根本就没这本事,估计要等到Firefox 3.2才行)。
有一件事是明摆着的:JavaScript性能的“跳蛙游戏”仍在继续(译者注:老外小时候会玩这游戏,貌似俺们小时候玩的是“跳马”,规则跟这个差不多。如果理解不了这个意思的话,请google一下leapfrog)。只要有多个JavaScript引擎存在,这种“三十年河东三十年河西”的现象就只会越来越快(显然,这对于最终用户和应用程序开发人员来说,都无疑是一件大好事)。