【问题标题】:Measuring and benchmarking processing power of a javascript engine in a browser测量和基准测试浏览器中 javascript 引擎的处理能力
【发布时间】:2011-10-30 23:31:39
【问题描述】:

什么是衡量 javascript 引擎(如 v8 或 spidermonkey)性能的准确方法?它至少应该与一个评估和另一个评估没有太大的偏差,可能允许在不同操作系统和不同硬件配置上的不同 JavaScript 引擎之间进行排名。

我的第一次尝试是在一个没有任何内容的网页中,我在网络浏览器中加载了该页面。然后我尝试在 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 翻牌
  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 翻牌
  2. 平均:1026.8727431432026 FLOPS。标准 偏差: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

火狐6.0

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

歌剧 11.50

  1. 平均:38462.49044165712 FLOPS。标准偏差: 2438.527900104241 翻牌
  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,如果它根本不愚蠢并且有人想要我的代码我很乐意粘贴它。

【问题讨论】:

  • 也许读起来很有趣:ejohn.org/blog/accuracy-of-javascript-timeend - start 不可靠。
  • 谢谢:D!我很久以前偶然发现了那个,当时并不真正需要,忘记了那篇文章......
  • @pimvdb:看起来它仅对于应该在 15ms 下运行的代码并不可靠,但如果需要 2 秒似乎并不是很重要[来自文章:任何测试的错误率在这些浏览器中运行将是巨大的。如果您有一个在 15 毫秒内运行的简单测试,错误率将高达 50-750%!您需要让测试运行至少 750 毫秒,然后才能安全地将浏览器的错误开销降低到 1%。至少可以这么说,这太疯狂了。]

标签: javascript firefox google-chrome node.js benchmarking


【解决方案1】:

我认为,Chrome 控制台有一个“奇怪”的执行环境,它与网页本身并不完全一样,因此会产生一些性能成本。这对于 Firefox 中的控制台当然是正确的。

要回答您最初的问题...这实际上取决于您要测量的内容。不同的 JS 引擎擅长不同的事情,因此根据测试程序,您可以让 Chrome 比 Firefox 快 5 倍,反之亦然。

此外,浏览器 JIT 所做的优化可能在很大程度上取决于整个代码流,因此执行操作 A 和操作 B 所需的时间通常与执行 A 所需时间的总和不同和 B 分开(它可以更大,也可以更小)。因此,对除您实际想要运行的代码之外的任何内容进行基准测试的效用非常有限。运行任何一段代码对于“根据性能对网络浏览器进行排名”几乎没有用处。

【讨论】:

  • 关于 chrome 中的执行环境,我倾向于认为时钟在控制台上比页面更小的时间范围内刷新(据说页面在 15 毫秒的时间范围内运行),因此与网页相比,控制台上的标准偏差和平均值要低得多。
【解决方案2】:

JS 性能优化总体来说是一个很大的领域,从零开始是相当有野心的。

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

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

【讨论】:

  • 哦,不,我意识到从头开始是非常雄心勃勃的,我什至不知道 javascript 引擎是如何工作的(甚至不知道任何 VM 是如何工作的)。我只是想根据性能对网络浏览器进行排名(感谢链接!)。不幸的是,我没有什么可以添加到 JS 性能优化 :(
猜你喜欢
  • 2018-04-03
  • 2011-11-06
  • 1970-01-01
  • 2015-12-13
  • 1970-01-01
  • 1970-01-01
  • 2017-12-15
  • 1970-01-01
  • 2016-12-25
相关资源
最近更新 更多