WebKit的新JavaScript引擎
Fri, 09 Jan 2009 11:11:06 +0800前幾天看到介紹Safari的文章,是有關於他的新JavaScript引擎:SquirrelFish Extreme,號稱速度比目前Safari的引擎速度快許多。剛好想測試一下JavaScript的function做context switch大概要花多少overhead,把他拿來跟Firefox 3.0.5、Chrome1.0比較一下,果然有明顯的速度改進。
測試過的幾個版本分別是:
- Firefox 3.0.5
- Google Chrome 1.0
- Safari 3.2.1
- Webkit Nightly Build(內含極限松鼠魚) r39553
測試的程式碼如下:
(function(){ var start = new Date().getTime(); var log = 0; var tid = window.setInterval(function(){ if((new Date().getTime())-start > (log*100)) log++; if(log>99) { var s = (new Date().getTime())-start; window.clearInterval(tid); alert('thread stopped with total sec='+(s/1000)+' and latency for each iteration is msec='+(s/log)); } },1); })(); (function(){ var a = new Date().getTime(); var b = 0; while(b<1000000) { b++; } var c = new Date().getTime() - a; var d = new Date().getTime(); var e = 0; while(e<1000000) { (function(){ e++; })(); } var f = new Date().getTime() - d; alert('non func='+c); alert('with func='+f); })();
第一個匿名函數主要是拿來測試做setInterval的overhead(看到版友的文章有感,所以試了一下),第二個是比較做一百萬次遞增運算,比較直接計算或透過匿名函數計算的速度差距。setInterval比較沒有明顯的感覺,而且不是拿來測試我要的數據,所以就略去。第二個測試的結果:
- Firefox 3.0.5: 37 / 561 msec
- Google Chrome: 5 / 178 msec
- Safari 3.2.1:58 / 595 msec
- Webkit Nightly Build r39553: 3 / 144 msec
簡單的結論,透過這樣簡單的計算,可以估計出像這樣進入function時做context switch的overhead,使得執行的時間大概多了十倍以上。(這只是簡單計算,我沒有做重複測試來收集數據,所以不能做統計的依據喔)另外,可以期待Safari在執行效率上趕上Chrome及Firefox3.1。
2008-1-9 11:58 補充
為了了解較複雜的context跟scope解析成本,測試context swith效率的程式稍微調整了一下,多加一層匿名函數,並且在外層加了一些變數,並且讓遞增計算時也計算這些變數。速度上有一些差距:
(function(){ var start = new Date().getTime(); var log = 0; var tid = window.setInterval(function(){ if((new Date().getTime())-start > (log*100)) log++; if(log>99) { var s = (new Date().getTime())-start; window.clearInterval(tid); alert('thread stopped with total sec='+(s/1000)+' and latency for each iteration is msec='+(s/log)); } },1); })(); (function(){ var aaa = ''; var bbb = 3; var ccc = 4; var xxx = 'test'; (function(){ var a = new Date().getTime(); var b = 0; while(b<1000000) { b++; ccc++; } var c = new Date().getTime() - a; var d = new Date().getTime(); var e = 0; while(e<1000000) { (function(){ e++; ccc++; })(); } var f = new Date().getTime() - d; alert('non func='+c); alert('with func='+f); })(); })();
測試結果:
- Firefox 3.0.5: 474 / 1063 msec
- Google Chrome 1.0: 8 / 170 msec
- Safari 3.2.1: 174 / 744 msec
- Webkit Nightly Build r39553: 7 / 154 msec
看起來context較複雜時,Firefox 3.0.5的速度慢得比較明顯。