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比較一下,果然有明顯的速度改進。

測試過的幾個版本分別是:

  1. Firefox 3.0.5
  2. Google Chrome 1.0
  3. Safari 3.2.1
  4. 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比較沒有明顯的感覺,而且不是拿來測試我要的數據,所以就略去。第二個測試的結果:

  1. Firefox 3.0.5: 37 / 561 msec
  2. Google Chrome: 5 / 178 msec
  3. Safari 3.2.1:58 / 595 msec
  4. 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);
    })();
})();

測試結果:

  1. Firefox 3.0.5: 474 / 1063 msec
  2. Google Chrome 1.0: 8 / 170 msec
  3. Safari 3.2.1: 174 / 744 msec
  4. Webkit Nightly Build r39553: 7 / 154 msec

看起來context較複雜時,Firefox 3.0.5的速度慢得比較明顯。