在浏览器中测量和基准测试JavaScript引擎的处理能力

4
什么是测量像v8或spidermonkey这样的javascript引擎性能的准确方法?该方法至少不应该有很高的从一个评估到另一个评估的偏差,可能允许在不同操作系统和硬件配置上对不同的javascript引擎进行排名。
我的第一次尝试是在一个没有内容的网页中加载此代码,并在Web浏览器中打开该页面。然后,我尝试在Google Chrome的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');

它回答道:

NodeJS 0.5.0

  1. 平均值:74607.30446024566 FLOPS。标准偏差: 4129.4008527666265 FLOPS
  2. 平均值:73974.89765136827 FLOPS。标准偏差: 4574.367360870471 FLOPS
  3. 平均值:73923.55086434036 FLOPS。标准偏差: 5768.396926072297 FLOPS

Chrome 13.0.782.112(来自控制台(Ctrl+Shift+J))

  1. 平均值:1183.409340319158 FLOPS。标准偏差: 24.463468674550658 FLOPS
  2. 平均值:1026.8727431432026 FLOPS。标准偏差: 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

Firefox 6.0

  1. 平均值:62626.63398692811 FLOPS。标准偏差: 3543.4801728588277 FLOPS
  2. 平均值:85572.76057276056 FLOPS。标准偏差: 4336.354514715926 FLOPS
  3. 平均值:63780.19323671495 FLOPS。标准偏差: 3323.648677036589 FLOPS

Opera 11.50

  1. 平均值:38462.49044165712 FLOPS。标准偏差: 2438.527900104241 FLOPS
  2. 平均值:37968.736460671964 FLOPS。标准偏差: 2186.9271687271607 FLOPS
  3. 平均值:38638.1851173518 FLOPS。标准偏差: 1677.6876987114347 FLOPS

发生了一些奇怪的事情。在Chrome的控制台中进行基准测试所需的时间比其他浏览器和NodeJS中所需的时间要长得多。我的意思是,在Chrome上需要大约30秒,而在其他浏览器上只需要2秒。与其他浏览器相比,Chrome控制台中的标准偏差也非常小。为什么在控制台执行代码和在网页中执行代码之间会有如此巨大的差异?

如果这太愚蠢了,请让我提醒您,我是自学javascript(以及编码)的,并且还不久。

这有什么好的衡量方法吗?我想重点关注数学运算速度,而不是其他事情,例如正则表达式速度。你推荐什么?我还尝试生成了大量的浮点数10x10矩阵并将它们相乘,结果每次都是7、8或9 M FLOPS,但在Chrome上通常是7。如果这看起来不傻,有人想要这段代码,我很高兴将其发布到pastebin上。


有趣的阅读:http://ejohn.org/blog/accuracy-of-javascript-time/。`end - start` 不可靠。 - pimvdb
谢谢:D!我很久以前就偶然发现了这个,当时并不需要,所以忘记了那篇文章... - João Pinto Jerónimo
@pimvdb:看起来它不仅对应该在15毫秒内运行的代码不可靠,但如果需要2秒钟,那么似乎并不是很重要。[从文章中:在这些浏览器中运行的任何测试运行的错误率都会非常高。如果您有一个简单的测试,在15毫秒内运行,错误率将达到50-750%!您需要至少运行750毫秒的测试,才能安全地将浏览器的错误开销降低到1%。这至少是疯狂的。] - João Pinto Jerónimo
2个回答

7

JS性能优化是一个广泛的领域,从零开始着手是相当宏大的。

如果我是你,我会看一下这个领域周围的一些现有项目:

  • Benchmark.js 处理时间和统计分析(平均值、计算方差)部分。
  • JSPerf 允许任何人创建和运行测试,然后查看任何浏览器的结果。那里有一个大型的测试库供您参考。
  • BrowserScope 是JSPerf测试结果的存储,并跟踪每个UA的结果。

哦,我意识到从零开始是非常雄心勃勃的,我甚至不知道JavaScript引擎如何工作(甚至不知道任何虚拟机如何工作)。我只是想根据性能排名Web浏览器(感谢提供链接!)。不幸的是,我没有什么可以添加到JS性能优化:( - João Pinto Jerónimo

0
Chrome控制台具有“奇怪”的执行环境,不完全是网页本身,并且由于此原因会产生一些性能成本,我认为。对于Firefox中的控制台来说,这当然是正确的。
回答您最初的问题...这实际上取决于您想要测量什么。不同的JS引擎擅长不同的事情,因此根据测试程序,Chrome可能比Firefox快5倍,或者反之亦然。
此外,浏览器JIT所做的优化可以非常依赖于整体代码流程,因此执行操作A后跟随操作B所需的时间通常与分别执行A和B所需的时间之和不同(它可能更大,也可能更小)。因此,除了您实际想要运行的代码之外,任何其他基准测试都非常有限。运行任何单个代码片段对于“按性能排名Web浏览器”几乎没有用处。

关于Chrome中的执行环境,我倾向于认为控制台上的时钟刷新时间比页面小(据说页面以15ms的时间帧运行),因此控制台上的标准差和平均值要比网页低得多。 - João Pinto Jerónimo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接