2011-08-19 106 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的时间范围内运行),因此控制台上的标准偏差和平均值远低于网页上的平均偏差。 –