2011-08-19 48 views
3

什麼是測量JavaScript引擎(如v8或spidermonkey)性能的準確方法?它應該至少不會對一個評估和另一個評估有很高的偏差,可能允許在不同操作系統和不同硬件配置的不同JavaScript引擎之間進行排名。在瀏覽器中測量和測試JavaScript引擎的處理能力

我的第一次嘗試是在沒有任何內容的網頁上,我在網頁瀏覽器中加載了該頁面。然後我試圖執行谷歌瀏覽器的JavaScript控制檯這個代碼,它出來了非常不同的,因爲你會在結果中看到:

mean = function (distr) { 
    var sum = 0; 
    for (obs in distr) { 
     sum += distr[obs]; 
    }; 
    return sum/distr.length; 
}; 

stdev = function (distr,mean) { 
    var diffsquares = 0; 
    for (obs in distr) { 
     diffsquares += Math.pow(distr[obs] - mean , 2); 
    }; 
    return Math.sqrt((diffsquares/distr.length)); 
}; 


var OPs = 1000000; 

var results = []; 
for (var t = 0; t < 60; t++) { 
    var start = (new Date()).getTime(); 
    for(var i = 0.5; i < OPs; i++){ 
     i++; 
    } 
    var end = (new Date()).getTime(); 
    var took = end - start; 
    var FLOPS = OPs/took; 
    results.push(FLOPS); 
}; 

average = mean(results); 
deviation = stdev(results,average); 

console.log('Average: '+average+' FLOPS. Standart deviation: '+deviation+' FLOPS'); 

而且它的回答是:

0.5.0的NodeJS

  1. 平均:74607.30446024566 FLOPS。標準偏差: 4129.4008527666265 FLOPS
  2. 平均:73974.89765136827 FLOPS。 Standart 偏差:4574.367360870471 FLOPS
  3. 平均:73923.55086434036 FLOPS。 斯坦達特偏差:5768.396926072297 FLOPS

鉻13.0.782.112(從控制檯(Ctrl + Shift + j))

  1. 平均:1183.409340319158 FLOPS。標準偏差: 24.463468674550658 FLOPS
  2. 平均:1026.8727431432026 FLOPS。 Standart 偏差:18.32394087291766 FLOPS
  3. 平均:1063.7000331534252 FLOPS。非標準偏差:22.928786803808094 FLOPS

的Chrome 13.0.782.112(如網頁)

  1. 平均:47547.03408688914 FLOPS。標準偏差:4064.7464541422833 FLOPS
  2. 平均值:49273.65762892078 FLOPS。標準偏差:1553.1768207400576 FLOPS
  3. 平均:47849.72703247966 FLOPS。非標準偏差:3445.930694070375 FLOPS

火狐6.0

  1. 平均:62626.63398692811 FLOPS。標準偏差: 3543.4801728588277 FLOPS
  2. 平均:85572.76057276056 FLOPS。 Standart 偏差:4336.354514715926 FLOPS
  3. 平均:63780.19323671495 FLOPS。 斯坦達特偏差:3323.648677036589 FLOPS

歌劇11.50

  1. 平均:38462.49044165712 FLOPS。標準偏差: 2438。527900104241 FLOPS
  2. 平均:37968.736460671964 FLOPS。 Standart 偏差:2186.9271687271607 FLOPS
  3. 平均:38638.1851173518 FLOPS。 標準偏差:1677.6876987114347 FLOPS

發生了一些奇怪的事情。 Chrome中的基準測試比其他瀏覽器和NodeJS中的基準測試需要更多的時間。我的意思是Chrome上的時間爲30秒,其他時間爲2秒。與其他遊戲機相比,控制檯上Chrome瀏覽器的標準偏差也非常小。爲什麼在控制檯上執行代碼和在網頁中執行代碼之間存在巨大差異?

如果這太愚蠢了讓我提醒你我自己並不是很久以前就「學會了」javascript(以及一般的代碼),所以我吮吸了很多東西。

這是什麼措施?我想專注於數學運算的速度,而不是像正則表達式的速度。你建議什麼?我也嘗試生成10x10浮點數的矩陣並將它們相乘很多次,結果每次都是7,8或9 M FLOPS,但大多數情況下是7,如果它不是愚蠢的,並且有人希望代碼I'很高興能夠貼上它。

+0

有趣的閱讀也許:http://ejohn.org/blog/accuracy-of-javascript-time/。 '結束 - 開始'是不可靠的。 – pimvdb

+0

感謝:D!我很久以前就偶然發現過,當時並沒有真正需要,並且忘記了那篇文章...... –

+0

@pimvdb:它看起來只適用於應該在15ms以下運行的代碼,但它看起來不是很可靠如果需要2秒,這是顯着的[文章:這些瀏覽器中的任何測試運行的錯誤率將是巨大的。如果你有一個簡單的測試,運行在15ms以下,錯誤率將高達50-750%!在安全地將瀏覽器的錯誤開銷降低到1%之前,您需要至少運行750毫秒的測試。這是瘋了,至少可以說。] –

回答

7

JS性能優化是一個廣泛的領域,它從頭開始是相當雄心勃勃的。

如果我是你,我會看看周圍的這個空間中的一些現有項目:

  • Benchmark.js處理的時間和統計分析(平均,計算方差)位。
  • JSPerf允許任何人創建並運行測試,然後查看任何瀏覽器的結果。那裏有大量的測試版本,您可以仔細閱讀。
  • BrowserScope是JSPerf測試的結果存儲,並跟蹤每個UA的結果。
+0

哦,不,我意識到從頭開始是非常雄心勃勃的,我甚至不知道一個javascript引擎是如何工作的(甚至不知道任何虛擬機如何工作)。我只是想根據性能對網頁瀏覽器進行排名(感謝您的鏈接!)。不幸的是,我沒有什麼可以添加到JS性能優化:( –

+0

我喜歡JSPerf – cvsguimaraes

0

Chrome控制檯有一個「奇怪的」執行環境,它並不完全是網頁本身,因此我認爲會導致一些性能成本。這對於Firefox中的控制檯來說確實如此。

要回答你原來的問題......它真的取決於你想測量什麼。不同的JS引擎擅長於不同的事情,所以根據測試程序,Chrome可以比Firefox快5倍,反之亦然。

此外,瀏覽器JIT所做的優化可能會嚴重依賴於整體代碼流,因此執行操作A後跟操作B所需的時間通常與執行所需時間總和不同A和B分開(它可以更大,也可以更小)。因此,除了您實際想運行的代碼之外的任何其他基準測試都具有非常有限的實用性。對於「根據性能對網頁瀏覽器進行排名」,運行任何單獨的代碼幾乎沒有用處。

+0

關於鉻的執行環境,我傾向於認爲時鐘刷新在控制檯比頁面更小的時間框架(頁面是據說在15ms的時間範圍內運行),因此控制檯上的標準偏差和平均值遠低於網頁上的平均偏差。 –