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



衡量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。Standart偏差:4129.4008527666265失败
  2. 平均值:73974.89765136827 FLOPS。Standart偏差:4574.367360870471 FLOPS
  3. 平均值:73923.55086434036 FLOPS。标准偏差:5768.396926072297 FLOPS

Chrome 13.0.782.112 (From Console (Ctrl+Shift+J))

  1. 平均值:1183.409340319158 FLOPS。Standart偏差:24.463468674550658失败
  2. 平均值:1026.8727431432026 FLOPS。Standart偏差:18.32394087291766 FLOPS
  3. 平均:1063.7000331534252失败了。标准偏差: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。Standart偏差:3543.4801728588277失败
  2. 平均值:85572.76057276056 FLOPS。Standart偏差:4336.354514715926 FLOPS
  3. 平均值:63780.19323671495 FLOPS。标准偏差:3323.648677036589 FLOPS

Opera 11.50

  1. 平均值:38462.49044165712 FLOPS。Standart偏差:2438.527900104241失败
  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在Chrome上,如果它不是愚蠢的,有人想要的代码,我很高兴粘贴它。

JS性能优化通常是一个巨大的领域,从头开始是相当雄心勃勃的。

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

  • Benchmark.js处理计时和统计分析(平均,计算方差)位。JSPerf允许任何人创建和运行测试,然后查看任何浏览器的测试结果。这里有一个大的测试库,你可以仔细阅读。
  • BrowserScope是用于JSPerf测试的结果存储,并跟踪每个ua的结果。

Chrome控制台有一个"奇怪的"执行环境,不完全是网页本身,并因此招致一些性能成本,我认为。这对于Firefox的控制台来说当然是正确的。

回答你最初的问题…这取决于你想测量什么。不同的JS引擎擅长不同的事情,所以根据测试程序,你可以让Chrome比Firefox快5倍,或者反之亦然。

此外,浏览器jit所做的优化可能非常严重地依赖于整个代码流,因此执行操作A和操作B所花费的时间通常与分别执行A和B所需时间的总和不同(它可以大得多,也可以小得多)。因此,对实际要运行的代码以外的代码进行基准测试的效用非常有限。运行任何一段代码对于"根据性能对浏览器进行排名"几乎是无用的。

最新更新