亮眼的SquirrelFish Extreme JavaScript Engine
Sat, 10 Jan 2009 10:58:44 +0800昨天的文章提到這個新的JavaScript引擎,剛好看到jQuery1.3 beta 2之前推出(預計在1月14推出正式版),乾脆就順便測試一下。在上篇提到的Introducing SquirrelFish Extreme文章中,有介紹到他用的最佳化技術,比較讓我注意的是Polymorphic Inline Cache及Regular Expression JIT。
Polymorphic Inline Cache可以改進一些context switch的效率,這在昨天的測試也可以看得出來。最初的概念是來自Self Language的run time最佳化策略。可以參考Maciej Stachowiak在文章中的解釋及wikipedia中關於Self Language的文章最後一段。
Regular Expression JIT簡單地說就是把他們對JavaScript做的最佳化技術也用到Regular Expression上,來加速Regular Expression的速度,從測試的結果看起來,對於執行Regular Expression的效率有非常明顯的提昇。
接下來就看看自己做的幾個測試,包含簡單比較jQuery1.2.6、jQuery1.3 beta 2執行selector的效率以及測試getElementById、getElementById+render、以及regular expression的效率的幾段程式:
測試jQuery的selector:
<html>
<script type="text/javascript" src="js/jquery-1.2.6.js"></script>
<script>
$(document).ready(function(){
$("#test").click(function(){
var a = new Date().getTime();
for(var i=0; i<1000; i++) {
$("#panel");
}
alert((new Date().getTime()) - a);
var a = new Date().getTime();
for(var i=0; i<1000; i++) {
$("#panel").html(i);
}
alert((new Date().getTime()) - a);
});
});
</script>
<body>
<input type="button" value="test" name="test" id="test">
<div id="panel"></div>
</body>
</html>
測試結果:
- Firefox 3.0.5: 17 / 287 msec
- Google Chrome 1.0: 7 / 127 msec
- Webkit Nightly Build r39553: 5 / 78 msec
測試jQuery 1.3 beta 2:
<html>
<script type="text/javascript" src="js/jquery-1.3b2.js"></script>
<script>
$(document).ready(function(){
$("#test").click(function(){
var a = new Date().getTime();
for(var i=0; i<1000; i++) {
$("#panel");
}
alert((new Date().getTime()) - a);
var a = new Date().getTime();
for(var i=0; i<1000; i++) {
$("#panel").html(i);
}
alert((new Date().getTime()) - a);
});
});
</script>
<body>
<input type="button" value="test" name="test" id="test">
<div id="panel"></div>
</body>
</html>
測試結果:
- Firefox 3.0.5: 16 / 353 msec
- Google Chrome 1.0: 9 / 180 msec
- Webkit Nightly Build r39553: 5 / 127 msec
測試getElementById、getElementById+Render、及Regular Expression:
<html>
<body>
<input type="button" value="test" name="test">
<div id="panel"></div>
<script>
document.getElementsByName("test")[0].onclick = function(){
var a = new Date().getTime();
for(var i=0; i<1000; i++) {
var b = document.getElementById("panel");
}
alert(new Date().getTime()-a);
var a = new Date().getTime();
for(var i=0; i<1000; i++) {
var b = document.getElementById("panel");
b.innerHTML = i;
}
alert(new Date().getTime()-a);
var b = /^[a-zA-Z][\w\.-]*[a-zA-Z0-9]@[a-zA-Z0-9][\w\.-]*[a-zA-Z0-9]\.[a-zA-Z][a-zA-Z\.]*[a-zA-Z]$/gi;
var a = new Date().getTime();
for(var i=0; i<1000000; i++) {
b.test("test.me@gmail.com");
}
alert(new Date().getTime()-a);
}
</script>
</body>
</html>
測試結果:
- Firefox 3.0.5: 2 / 52 / 2371 msec
- Google Chrome 1.0: 2 / 11 / 919 msec
- Webkit Nightly Build r39553: 0 / 4 / 268 msec
簡單結論:
- jQuery1.2.6比jQuery1.3 beta 2快?是因為beta的關係??
- selector比單純用getElementById還是多了些overhead
- render的overhead比單純操作dom還高
- 極限松鼠魚的Regular Expression執行速度真的很亮眼。