还没有松鼠

关于我的本周早些时候关于iPhone 2.0更新中WebKit版本中JavaScript性能的显着提升,我遇到的一个问题是,这是否可能归因于Apple已经转向SquirrelFish,这是WebKit团队在6月初公布的全新JavaScript解释器宣布该项目,杰弗里加伦写道

SquirrelFish is fast — much faster than WebKit’s previous interpreter看看数字在SunSpider JavaScript benchmark, SquirrelFish is 1.6 times faster than WebKit’s previous interpreter.

但令我印象深刻的是,一个刚刚在6月份推出的新项目将被纳入iPhone 2.0操作系统并且,作为基准测试结果来自SquirrelFish公告显示,WebKit的3.1版本JavaScript解释器本身比3.0版快2.7倍即使在SquirrelFish之前,WebKit的JavaScript性能在过去一年中也有了显着提升。

但无论如何我决定检查如有疑问,请查看源代码,JavaScriptCore的源代码可从Apple的Darwin源代码获得对于Mac OS X 10.5.4(我们知道还没有使用SquirrelFish)和适用于iPhone OS 2.0通过BBEdit的Find Differences命令运行两个源树显示它们非常相似 - iPhone OS 2.0中的JavaScript解释器几乎与Safari 3.1.2中的JavaScript解释器相同。

如果您查看JavaScriptCore版本的源目录在当前的WebKit主干中, 哪一个具有切换到SquirrelFish,你可以通过扫描文件名来看到,更不用说源代码了。

与先前的WebKit解释器相比,SquirrelFish的一个实际改进是关于递归深度(递归是指函数以自己调用的方式编写,类似于嵌套俄罗斯娃娃的编程。有关更多信息,请参阅Wikipedia.) WebKit’s old JavaScript interpreter had a relatively shallow recursion limit of 499; recurse 500 times in your JavaScript code and you’d get an exceptionSquirrelFish支持更深入的递归。

这是一个非常简单的测试页面测试JavaScript解释器可以递归的深度整个来源:

<script type="text/javascript">
function recurse(n) {
    if (n > 0) {
        return recurse(n - 1);
    }
    return 0;
}

try {
    // recurse(43687);  // Highest that works for me in WebKit
                        // nightly builds as of 24 Jul 2008.
    // recurse(2999);   // Highest that works for me in Firefox 3.0.1
    // recurse(499);    // Highest that works for me in Safari 3.1.2
    recurse(3000);
    document.write("Could be SquirrelFish.");
} catch(e) {
    document.write("Not SquirrelFish.");
}
</script>

它调用一个简单的递归函数3000次WebKit的Pre-SquirrelFish版本失败,任何数字都高于499Firefox 3.0.1最多可以进行2,999次递归最近一次使用SquirrelFish的WebKit,对我来说最高可达到43,487,非常深iPhone OS 2.0中的MobileSafari与Safari 3.1.2:499具有相同的限制。

递归深度本身并不是特别重要这只是区分SquirrelFish版本的WebKit的一种特别简单的方法因此我们现在知道iPhone还没有使用SquirrelFish,这意味着即将出现进一步显着的性能提升。